结构是值类型 (轻量级) 效率高
类是引用类型 (重量级)
1)静态成员属于类 生命周期:第一次类加载(被访问的时候)这个类下面的所有的静态成员会被加载到静态存储区,静态成员只存在一份,静态成员一旦创建在程序退出的时候才会被回收.
2)实例成员属于对象 生命周期: 随着对象的创建而创建,被GC回收的时候
3)在静态方法中不能直接访问实例成员
4)静态构造函数
第一次类的成员被访问的时候,静态构造函数执行 只执行一次
在执行第一次访问之前先执行静态构造函数,再接着执行你的操作
里氏替换原则:LSP子类可以替换父类的位置,并且程序的功能不受影响
父类有的功能子类都有 所以不影响程序的功能
父类变量指向了一个子类对象
当一个父类变量指向一个子类对象的时候 只能通过这个父类对象
调用父类的成员,子类独有的成员无法调用
子类变量不能指向一个父类对象
Person p = new Person();
Strudent s = new Student();
P = s;
Person p1 = new Person();
Student s1 = (Student)p1;
子类变量不能指向一个父类对象
必须要有继承关系,才可以使用强制转换
如果一个父类变量指向的就是一个父类对象,将这个父类对象转换为子类对象的时候 会报异常
如果一个父类变量指向了一个子类对象,那么可以将这个父类变量转换为子类对象
Student s0 = (Student)p; //会报错
IS 判断变量是否是指定的类型
bool b = p is Person;
b = p is Student; //因为一个person不一定是Student
b = p is Object; //因为Person从Object继承
B = p is Program; 如果没有继承关系,表达式的值永远都是false
B = p1 is Person 父类变量指向子类对象,父类变量本身是Person 指向的对象学生也是一个Person
B = p1 is Student; // p1变量指向的对象本来就是一个Student
虚方法
如果子类重写了父类的虚方法,那么父类变量来调用这个方法的时候 会调用子类的
父类变量指向子类的对象
子类可以重写父类的虚方法,如果重写了,那么通过父类变量来调用虚方法,会调用子类的,如果没有重写会调用父类的
Virtual
Override
多态 同一种行为,对于不同的事物,有不同的表现形式
多态的表现形式之一:将父类类型作为方法的参数
屏蔽多个子类的不同,将多个子类当成父类来统一处理
继承是为了多态. 扩展 开闭原则
多态的两种表现形式:
1)将父类类型作为方法 2)将父类类型作为返回值
多态是基于继承
找父类