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 = "儿子"; }