复习静态成员与实例成员?
1.静态成员属于类;1个类第一次被访问的时候,这个类下面的所有的静态成员会被加载到静态存储区。静态成员只存在一份。
public static int num;
2.实例成员属于对象;随着对象的创建而创建,被GC回收的时候。
private int num2 = "";
问题?静态方法为啥不能访问实例成员?
this关键字,base关键字不能在静态方法里使用。因此在静态方法中不能直接访问实例成员。
第一次类的成员被访问的时候,静态构造函数执行。
只执行一次。
在执行第一次访问之前,限制性静态构造函数,在执行你的操作哦。
复习继承
继承的好处:
1.方便代码管理。子类可以拥有父类的非私有成员。为了多态
2.子类的构造函数,默认会去调用父类的无参数的构造方法。
3.显示指定子类构造函数调用的父类构造函数,base
4.创建子类对象的内存图
5.this可以点出子类的所有成员和父类的非私有成员,base可以点出父类的非私有成员。
6.单根性,传递性
7.IS A
里氏替换原则LSP
子类可以替换父类的位置,并且程序的功能还不受影响。
Person p = new Student();
父类有的功能子类都有,所以不影响程序的功能。
父类变量指向了1个子类对象。
Person p = new Student();
指针指向谁,是运行时绑定。
类型指针指向谁,是根据其类型对象而决定的。
当1个父类变量指向1个子类对象的时候,只能通过这个父类变量调用父类的成员,子类独有的成员无法调用。
Person p1 = new Student();
Person p = new Person();
//子类变量不能指向1个父类对象
//必须要有继承关系,才可以使用强制转换。
// 如果1个父类变量指向了1个子类对象,那么可以将这个父类变量转换成子类对象。
Student s1 = (Student)p1;
//如果1个父类变量指向的就是1个父类对象,将这个父类对象转换成子类对象会报异常。
//Student s0 = (Student)p;
is关键字判断是否是指定类型
bool b = p is Person;
b = p is Student; // 1个Person不一定是Student
b = p is Object; // Person从Object继承
b = p is Program; // 没有继承关系,表达式的值永远都是false
//首先判断变量
if(p1 is Student)
{
Student s2 = (Student) p1;
}
//as 转换 如果转换成功,引用指向s4;如果转换失败,不报异常,s4为NULL
Student s4 = p as Student;
虚函数(virtual关键字)(Java里面没有这个概念,因为子类均把父类覆盖掉)
允许子类把父类的同名方法替换掉
利用override在子类中,可以查看到在父类定义的虚方法
如果子类重写了父类的虚方法,那么通过父类变量来调用这个方法的时候会调用子类的。
class Person
{
public virtual void SayHi()
{
Console.....
}
}
class Teacher:Person
{
public override void SayHi()
{
Console....
}
}
多态(很重要!!!)
同一种行为,对于不同的事务,有不同的表现形式。
多态表现一:将父类作为方法的参数
屏蔽多个子类的不同,将多个子类当成父类来统一处理。
继承:继承是为了多态,多态是为了扩展。
面向对象最终目的是为了开闭原则。
多态表现二:将父类类型作为返回值。
多态是基于继承,所以没有继承,多态是无法实现的。