1. 程式人生 > 其它 >Java基礎-繼承的記憶體分析

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