Java基础-继承的内存分析

package com.hspedu.super_;

public class Course293 {
    public static void main(String[] args) {
        // 继承的本质(重要)

        /*
         * 内存变化:
         *   1、方法区会先加载Object类信息,再加载GrandPa类信息,
         *       然后加载Father类信息,最后加载Son类信息
         *   2、new Son(); 在堆中开辟一个内存空间(如0x11)
         *       在该空间中,有一块属于GrandPa的内存,name(0x22)指向常量池的"爷爷"(0x22),
         *                                      hobby(0x33)指向常量池的"旅游"(0x33)
         *                 有一块属于Father的内存,name(0x44)指向常量池的"爸爸"(0x44),
         *                                      age是int基本数据类型直接存放在堆上
         *                 有一块属于Son的内存,name(0x55)指向方法区常量池的"儿子"(0x55)
         *       注意:不管父类的属性子类是否具有访问权限,均会创建这个属性
         *   3、son指向0x11这个堆对象
         * */
        Son son = new Son();

        /*
         *  如何访问其中的数据:查找规则
         *      (1)子类是否有该属性,如果有该属性,并且可以访问则返回该数据(遵循访问修饰符)
         *      (2)如果子类没有这个属性,就向上一级的父类有没有这个属性,如果有该属性且可以访问,就返回
         *      (3)重复(2)的规则继续向上寻找,直到Object,都没有则报错
         *     注意:如果有该属性,但是不能访问则会报错
         * */
        System.out.println(son.name);
//        System.out.println(son.age);
        System.out.println(son.getAge());   // son没有getAge方法会调用父类的getAge => 39
        System.out.println(son.hobby);


    }
}

class GrandPa {

    String name = "爷爷";

    String hobby = "旅游";

    int age = 100;

    public int getAge() {
        return this.age;
    }
}

class Father extends GrandPa {

    String name = "爸爸";

    private int age = 39;

    public int getAge() {
        return this.age;
    }
}

class Son extends Father {

    String name = "儿子";
}

 

posted @ 2022-05-05 16:41  柯南同学  阅读(82)  评论(0编辑  收藏  举报