Java基礎-繼承的記憶體分析
阿新 • • 發佈:2022-05-05
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 = "兒子"; }