多态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 内存图的小小示例_第1张图片

纯属个人总结,希望园友们和前辈们可以多提提意见,以便让知识更加完整、充实, Thanks!

你可能感兴趣的:(多态polymorphic 内存图的小小示例)