Java圖文分析之繼承內(nèi)存布局
一、初步了解繼承的內(nèi)存布局
(1) 繼承內(nèi)存布局初探
看下面擁有繼承關(guān)系的代碼,并畫出內(nèi)存布局圖:
public class Person { public int age; public void smile() { System.out.println("Person_smile()_age_" + age); } } class Student extends Person { public double score; public void study() { System.out.println("Student_study()_score_" + score); } } class MainTest { public static void main(String[] args) { Student s = new Student(); s.score = 95.5; s.age = 8; // Person_smile()_age_8 s.smile(); // Student_study()_score_95.5 s.study(); Person p = new Person(); p.age = 15; // Person_smile()_age_15 p.smile(); } }
?? 通過 上篇文章 Java 的訪問修飾符public,protected,private(封裝、繼承)可以知道:Student 類通過 extends 關(guān)鍵字繼承了 Person 類后,Student 類中便擁有了 Person 類中非 private 的成員變量和成員方法。因此,Student 對象的引用 student 可以訪問到父類(Person)的 age 屬性和 smile 方法 ??
繼承的內(nèi)存布局圖:
- Student 類繼承 Person 類后會擁有 Person 類中的 age 屬性,age 屬性在 Student 對象的內(nèi)存中也擁有一份
- Student 對象的內(nèi)存和 Person 對象的內(nèi)存各種獨占,互不干擾
(2) Object 類
?? 任何類最終都繼承自 java.lang.Object
類(Object 類叫做基類)
The Object class, in the java.lang
package, sits at the top of the class hierarchy(層次體系) tree. Every class is a descendant(派生、后代), direct or indirect, of the Object class.
【翻譯】 java.lang
包中的 Object 類位于類繼承體系數(shù)的頂端。每一個類都是 Object 類的直接或間接派生類(子類)。
(3) 同名的成員變量
Java 允許子類定義和父類同名的成員變量(不推薦)
public class Person { public int money = 10000; } class Teacher extends Person { public int money = 22222; public void show() { System.out.println("money: " + money); System.out.println("this.money: " + this.money); System.out.println("super.money: " + super.money); } } class Main { public static void main(String[] args) { Teacher t = new Teacher(); t.show(); /* output: money: 22222 this.money: 22222 super.money: 10000 */ } }
上面代碼的內(nèi)存布局:
二、更復(fù)雜的繼承的內(nèi)存布局
看下面的代碼,話它的內(nèi)存布局圖:
public class Test { public static void main(String[] args) { Son son = new Son(); } } class Grandfather { String name = "Grandfather_name"; String hobby = "Grandfather_hobby"; } class Father extends Grandfather { String name = "Father_name"; int money = 66666; } class Son extends Father { String name = "Son_name"; }
- ① 加載類信息: 會先加載當(dāng)前類的父類的類信息(包括 Object 基類)
- ② Son 對象中會擁有其所有父類的屬性: 父類屬性和子類屬性名字一樣是可以的
- ③ 訪問屬性的時候:先看當(dāng)前類中是否有該屬性?若有,直接訪問;
? 若沒有,查看直接父類是否有該屬性,并且該屬性是否可訪問?若有并且屬性沒有被 private 修飾,可訪問直接父類的屬性;
? 若有但屬性被 private 修飾,直接報錯;
? 若沒有,繼續(xù)查找父類的父類是否有該屬性,并且是否可訪問 …【① 看自己有沒有,有就直接用;若自己沒有,就看父親有沒有,若父親沒有,就看爺爺有沒有,… 一直向上找,直達找到 Object;② 若中途發(fā)現(xiàn)有一關(guān)系有該屬性,但是不能被訪問(被 private 修飾),直接報錯,不繼續(xù)往下找了】
- 1.父類的屬性被 private 修飾,無法訪問,但可通過其他方式訪問(如:父類提供被 public 修飾的 get 方法)
- 2.私有的屬性在內(nèi)存中依然存在,只是無法被訪問而已
到此這篇關(guān)于Java圖文分析之繼承內(nèi)存布局的文章就介紹到這了,更多相關(guān)Java繼承內(nèi)存布局內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
HashMap實現(xiàn)保存兩個key相同的數(shù)據(jù)
這篇文章主要介紹了HashMap實現(xiàn)保存兩個key相同的數(shù)據(jù)操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06Mybatis的collection三層嵌套查詢方式(驗證通過)
這篇文章主要介紹了Mybatis的collection三層嵌套查詢方式(驗證通過),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03深入了解Spring Boot2.3.0及以上版本的Liveness和Readiness功能
這篇文章主要介紹了Spring Boot2.3.0及以上版本的Liveness和Readiness功能示例深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10