1. 面向对象三大核心思想:
* 封装: 封装,PPP是封装一部分,权限的封装,数据的封装,逻辑的封装.
* 继承: 代码重用.
* 多态:父类的引用指向的子类的对象.
2. 里氏替换原则:能使用父类的地方,一定可以使用子类.
3. 在编译的时候,会把父类的属性,生成父类属性列表,父类的属性有了,这种情况叫编译时绑定;
* 在运行的时候,把子类生成一个对象,也有自己的属性列表,子类的属性就有了,叫运行时绑定.
4. 在程序运行的时候,通过父类属性去调用子类对象的属性,特指成员方法.
*
* 程序开发完成---->编译成类文件------->运行
*
5. super():官方说法是代表了父类型的特征,这里就是指父类里面的属性值列表.
* 具体怎么调用的呢?
* 在运行的时候
* 1. 先遍历父类的属性列表;
* 2. 再遍历子类的属性列表;
* 3. 如果子类有相同,就调用子类的,没有就是用父类的;
* 4. 如果父类中没有所指的属性,直接就报错,子类中根本不去,并且这个错,编译的时候就报错了,编译的时候,子类对象还没有,只能遍历父类的属性列表.
下面是个具体的小例子:
public class Poly{ public static void main(String[] args){ Animal a1 = new Animal(); a1.eat(); Animal a2 = new Cat(); //多态,创建子类对象 a2.cry(); a2.eat(); //a2.move(); //父类中没有所指的属性,直接就报错,子类中根本不去,并且这个错,编译的时候就报错了,编译的时候,子类对象还没有,只能遍历父类的属性列表 } } class Animal { public void eat(){ System.out.println( "动物吃东西" ); } public void cry(){ System.out.println( "动物会叫" ); } } class Cat extends Animal { public void eat(){ super.eat(); //父类里面的属性列表 System.out.println( "猫吃鱼" ); } public void move(){ System.out.println( "猫走猫步" ); } } class Dog extends Animal { public void eat(){ System.out.println( "狗啃骨头" ); } }
以下是它的内存图: