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