转载

多态polymorphic 内存图的小小示例

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( "狗啃骨头" );  } } 

以下是它的内存图:

多态polymorphic 内存图的小小示例

正文到此结束
Loading...