1.面向语言的特点
1.1封装
把客观事物封装成类,并将类内部实现隐藏,保证数据完整性
字段设置为私有,通过属性机制get() 和 set() 方法来访问私有成员
1.2继承
1.通过继承可以复用父类的代码 (密封类不能继承,不能当父类)
2.子类将获得父类中所有的成员 (除了构造函数和析构函数不能继承!)
public cat(string _name,int _age,double._jump,double,_time):base(_name,_age)
{ jump= _jump; time =_time;
};
3.子类在写构造函数时通过base调用父类的构造函数 //注意前后参数一样
1.3多态
允许子类对象赋值给父类对象的一种能力,相同类型的对象调用相同的方法却表现出不同行为
前提:重写虚方法
定义:子类覆盖父类中的方法实现子类特有的行为
方法:用关键字virtual和abstract将父类的方法声明为虚方法后才可以重写,子类通过关键字override实现
1.可以将子类对象赋值给父类引用
Animal a = new cat ("li", 2, 2.2, 3.5); a.print ();
1.打印出子类的print方法 a虽是父类类型的引用,但实际指向的对象为子类
2.执行时,根据实际对象的类型调用该对象中的“虚方法”
3.如果只是普通的父类子类同名方法,则调用父类的print方法
2.用abstract修饰基类时,可以防止直接创建基类(抽象的概念)的实例,只提供一些成员
public abstract class Animal{ }
3.子类中重写的方法也是虚方法,不需要在加virtual关键字了
cat:Animal dog:cat dog可重写cat里的print虚方法,而cat里的print不需要加virtual关键字
4.用关键字sealed(密封类)来阻止子类继续重写该虚方法。
cat:Animal dog:cat cat里的print前加sealed,dog将不能重写print方法
5.sealed 和 virtual 不能放在一起 abstract 和 virtual 不能放在一起 因为都是实现虚方法,重了
public abstract virtual void print(); //报错!
6.用abstract修饰方法时,表示纯虚方法,没有函数体,函数头后直接加分号,但必须在子类中重写,否则出错
纯虚方法只能存在于抽象类中,因为非抽象类可以创建实例,在调用纯虚方法时,它没有函数体,出错
public abstract class Animal{ public abstract void print(); }
7.通过new关键字来隐藏父类中的同名方法 (不能实现多态,只能单纯的隐藏)
public new void printt(){ console.writeline(“这是普通的函数方法”); }
8.所有的类的父类都是 System.object
object t = new Animal();
object t2 = new Cat()
9.a是自定义类型,直接用console.writeline输出时,不知道什么内容,会输出p类型的完全限定名:
Animal a = new Animal(); console.writeline( a); // li.animal
console.writeline 输出对象时,自动调用对象的ToString方法,
public override string ToString()
{
return string.Format(“name:{0} age:{1}”,name,age);
}
注:
子类的初始化顺序
1.初始化子类的实例字段
2.调用父类的构造函数,初始化父类的成员
3.调用自己的构造函数,初始化自己的扩展成员
c#中不允许多继承