构造函数
什么是构造函数
在前面我们讲了类如何实例化对象,是通过new关键字//实例化一个cat对象
Cat cat = new Cat();
构造函数的作用
构造函数的作用就是创建类或结构的实例,在实例化对象的时候,也就是new Cat()时会调用.
构造函数可以快速的帮我们构建对象,一般来说,我们在构造函数中
做些初始化字段的功能
构造函数的特点
>> 构造函数(方法)必须与类重名>> 构造函数没有返回值,但可以有形参
>> 构造函数可以有重载
>> 如果一个类中没有构造函数,系统会为我们自动添加一个无参数
的构造函数
>> 如果一个类中存在一个或多个构造函数重载,此时系统不会在为
我们的类自动生成构造函数
特别注意!!!!!
假如我们把之前无参数的构造函数删掉,让我们的类保持上一个带有参数的构造函数时,此时运行程序会报错.
Person p1 = new Person();
报错因为这一一句代码,原因是 如果一个类中存在一个或多个构造函
数重载,此时系统不会在为我们的类自动生成无参数构造函数,但是
我们又通过无参数构造函数去实例化对象,相当于调用了一个不存在
的方法
------------------------------------------------------------------------------------------------------------------------
面向对象三大特性
封装
封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的类中。 找到变化并且把它封装起来,你就可以在不
影响其它部分的情况下修改或扩展被封装的变化部分,这是所有设
计模式的基础,就是封装变化,因此封装的作用,就解决了程序的
可扩展性。
继承
继承用于创建可重用,扩展和修改在其他类中定义的行为的新类.其成员被继承的类陈伟”基类”,继承这些成员的类称为”派生类”
派生类只能有一个直接基类.
继承有可传递行,即A继承自B,B继承自C,那么A会继承B和C声明的
成员
继承的特点总结
>> 在程序中使用:表示继承 class A:B>> 子类可以继承父类中内公开会受保护的成员变量
>> 继承具有传递性
>> 派生类可以赋值给基类,但是基类不能赋值给派生类
>> 子类成员变量,父类不能拥有
>> 子类成员变量与父类成员变量重复,覆盖父类成员变量
多态
当派生类从基类继承时,它会获得基类公开的所有方法,字段,属性以及时间.派生类可以选择:
>> 继承最接近基类方法而不重写它
>> 重写基类中的虚拟成员
>> 定义隐藏基类实现的成员的新非虚实现
关于多态
其实之前学的方法重载也属于多态的一种表现形式.在继承关系中,体现多态的是方法重写
方法重写
方法重写顾名思义,就是重写基类的虚方法.在方法重写中,基类的虚方法用virtual修饰,子类重写时使用override.严格意义上来讲
virtual和override必须成对出现.
如果在基类中声明了虚方法,子类没有使用override,此时不属于方
法重写,而是方法覆盖.如果基类没有虚方法,此时子类是不可以使用
override关键字的!
方法重写需要注意的地方
>> 不能重写父类中用sealed修饰的方法>> 不能重写父类中用static修饰的方法
>> 如果父类中存在抽象方法,此时子类必须重写
-----------------------------------------------------------------------------------------------------------------------
应用
using System;
namespace Lesson09_1
{
class MainClass
{
public static void Main (string[] args)
{
// Person p = new Person ();
// Console.WriteLine (p.name);
//
// Person p2 = new Person ();
// Person p1 = new Person ("阿三");
// B b = new B ();
// A b2 = new B ();//子类构造父类对象
// //object a = new A();
// B b3 = (B)b2;
// B b = new B ();
// b.name = "我是b";//直接使用继承子A的字段
// Console.WriteLine (b.name);
// b.Eat();
//创建三个门派,古墓派,全真教,华山派,每个门派至少有两个特征,分
//别是武学名称,武学威力系数.以及一个攻击行为.
Gumu gm = new Gumu ("玉女心经", 100);
Quanzhen qz = new Quanzhen ("全真剑法", 50);
Huashan hs = new Huashan ("独孤九剑", 500);
gm.Attak ();
qz.Attak ();
hs.Attak ();
}
}
}
namespace Lesson09_1
{
class MainClass
{
public static void Main (string[] args)
{
// Person p = new Person ();
// Console.WriteLine (p.name);
//
// Person p2 = new Person ();
// Person p1 = new Person ("阿三");
// B b = new B ();
// A b2 = new B ();//子类构造父类对象
// //object a = new A();
// B b3 = (B)b2;
// B b = new B ();
// b.name = "我是b";//直接使用继承子A的字段
// Console.WriteLine (b.name);
// b.Eat();
//创建三个门派,古墓派,全真教,华山派,每个门派至少有两个特征,分
//别是武学名称,武学威力系数.以及一个攻击行为.
Gumu gm = new Gumu ("玉女心经", 100);
Quanzhen qz = new Quanzhen ("全真剑法", 50);
Huashan hs = new Huashan ("独孤九剑", 500);
gm.Attak ();
qz.Attak ();
hs.Attak ();
}
}
}
-----------------------------------------------------------------------------------------------------------------------
A类
using System;
namespace Lesson09_1
{
//所有的类都会继承子Object
//Object是所有类的基类
public class A
{
public string name;//字段会被子类继承
private int age;//私有字段是可以被子类继承的,但是子类无法访问
public A ()
{
Console.WriteLine ("A的无参构造函数");
}
public A(string name){
this.name = name;
Console.WriteLine ("A中有name参数构造函数");
}
public void Eat(){
Console.WriteLine ("A吃X");
}
}
}
namespace Lesson09_1
{
//所有的类都会继承子Object
//Object是所有类的基类
public class A
{
public string name;//字段会被子类继承
private int age;//私有字段是可以被子类继承的,但是子类无法访问
public A ()
{
Console.WriteLine ("A的无参构造函数");
}
public A(string name){
this.name = name;
Console.WriteLine ("A中有name参数构造函数");
}
public void Eat(){
Console.WriteLine ("A吃X");
}
}
}
-----------------------------------------------------------------------------------------------------------------------
B类
using System;
namespace Lesson09_1
{
public class B:A
{
//调用B的构造函数的时候,会去寻找B的基类的无参构造函数
public B ()
{
Console.WriteLine ("B的无参构造函数");
}
public B(string name){
Console.WriteLine ("B中的构造函数");
this.name = name;
}
//使用new关键字可以覆盖基类中相同类型的方法
public new void Eat(){
Console.WriteLine ("B吃X");
//可以使用base关键字调用基类方法
base.Eat ();
}
}
}
namespace Lesson09_1
{
public class B:A
{
//调用B的构造函数的时候,会去寻找B的基类的无参构造函数
public B ()
{
Console.WriteLine ("B的无参构造函数");
}
public B(string name){
Console.WriteLine ("B中的构造函数");
this.name = name;
}
//使用new关键字可以覆盖基类中相同类型的方法
public new void Eat(){
Console.WriteLine ("B吃X");
//可以使用base关键字调用基类方法
base.Eat ();
}
}
}
-----------------------------------------------------------------------------------------------------------------------
School类
using System;
namespace Lesson09_1
{
public class School
{
private string gongFuName;
private float gongFuPower;
public School(string name,float power){
gongFuName = name;
gongFuPower = power;
}
public void Attak(){
Console.WriteLine ("用{0},对敌人造成了{1}伤害",gongFuName,gongFuPower);
}
}
}
namespace Lesson09_1
{
public class School
{
private string gongFuName;
private float gongFuPower;
public School(string name,float power){
gongFuName = name;
gongFuPower = power;
}
public void Attak(){
Console.WriteLine ("用{0},对敌人造成了{1}伤害",gongFuName,gongFuPower);
}
}
}
-----------------------------------------------------------------------------------------------------------------------
Gumu类
using System;
namespace Lesson09_1
{
public class Gumu:School
{
public Gumu (string name,float power):base(name,power)
{
}
}
}
namespace Lesson09_1
{
public class Gumu:School
{
public Gumu (string name,float power):base(name,power)
{
}
}
}
-----------------------------------------------------------------------------------------------------------------------
Quanzhen类
using System;
namespace Lesson09_1
{
public class Quanzhen:School
{
public Quanzhen (string name,float power):base(name,power)
{
}
}
}
namespace Lesson09_1
{
public class Quanzhen:School
{
public Quanzhen (string name,float power):base(name,power)
{
}
}
}
-----------------------------------------------------------------------------------------------------------------------
Huashan类
using System;namespace Lesson09_1
{
public class Huashan:School
{
public Huashan (string name,float power):base(name,power)
{
}
}
}