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();
}
}
?? 通過(guò) 上篇文章 Java 的訪問(wèn)修飾符public,protected,private(封裝、繼承)可以知道:Student 類通過(guò) extends 關(guān)鍵字繼承了 Person 類后,Student 類中便擁有了 Person 類中非 private 的成員變量和成員方法。因此,Student 對(duì)象的引用 student 可以訪問(wèn)到父類(Person)的 age 屬性和 smile 方法 ??
繼承的內(nèi)存布局圖:

- Student 類繼承 Person 類后會(huì)擁有 Person 類中的 age 屬性,age 屬性在 Student 對(duì)象的內(nèi)存中也擁有一份
- Student 對(duì)象的內(nèi)存和 Person 對(duì)象的內(nèi)存各種獨(dú)占,互不干擾
(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ù)的頂端。每一個(gè)類都是 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";
}
- ① 加載類信息: 會(huì)先加載當(dāng)前類的父類的類信息(包括 Object 基類)
- ② Son 對(duì)象中會(huì)擁有其所有父類的屬性: 父類屬性和子類屬性名字一樣是可以的
- ③ 訪問(wèn)屬性的時(shí)候:先看當(dāng)前類中是否有該屬性?若有,直接訪問(wèn);
? 若沒(méi)有,查看直接父類是否有該屬性,并且該屬性是否可訪問(wèn)?若有并且屬性沒(méi)有被 private 修飾,可訪問(wèn)直接父類的屬性;
? 若有但屬性被 private 修飾,直接報(bào)錯(cuò);
? 若沒(méi)有,繼續(xù)查找父類的父類是否有該屬性,并且是否可訪問(wèn) …【① 看自己有沒(méi)有,有就直接用;若自己沒(méi)有,就看父親有沒(méi)有,若父親沒(méi)有,就看爺爺有沒(méi)有,… 一直向上找,直達(dá)找到 Object;② 若中途發(fā)現(xiàn)有一關(guān)系有該屬性,但是不能被訪問(wèn)(被 private 修飾),直接報(bào)錯(cuò),不繼續(xù)往下找了】
- 1.父類的屬性被 private 修飾,無(wú)法訪問(wèn),但可通過(guò)其他方式訪問(wèn)(如:父類提供被 public 修飾的 get 方法)
- 2.私有的屬性在內(nèi)存中依然存在,只是無(wú)法被訪問(wèn)而已
到此這篇關(guān)于Java圖文分析之繼承內(nèi)存布局的文章就介紹到這了,更多相關(guān)Java繼承內(nèi)存布局內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Runtime 調(diào)用Process.waitfor導(dǎo)致的阻塞問(wèn)題
這篇文章主要介紹了使用Runtime 調(diào)用Process.waitfor導(dǎo)致的阻塞問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Mybatis使用typeHandler加密的實(shí)現(xiàn)
本文詳細(xì)介紹了如何在Mybatis中使用typeHandler對(duì)特定字段進(jìn)行加密處理,涵蓋了從引入依賴、配置Mybatis,到實(shí)現(xiàn)typeHandler繼承類和配置mapper層的詳細(xì)步驟,為需要在項(xiàng)目中實(shí)現(xiàn)字段加密的開發(fā)者提供了參考和借鑒2024-09-09
Mybatis-plus新版本分頁(yè)失效PaginationInterceptor過(guò)時(shí)的問(wèn)題
這篇文章主要介紹了Mybatis-plus新版本分頁(yè)失效,PaginationInterceptor過(guò)時(shí)問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
Java元素排序Comparable與Comparator的區(qū)別
這篇文章主要介紹了Java元素排序Comparable與Comparator的區(qū)別,二者都是頂級(jí)的接口,但擁有的方法和用法是不同的,下面我們分別來(lái)看看具體是怎樣的區(qū)別吧2022-05-05
使用jaxp進(jìn)行dom解析_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了使用jaxp進(jìn)行dom解析的相關(guān)資料,需要的朋友可以參考下2017-08-08
Spring?Cloud?Alibaba?Nacos服務(wù)治理平臺(tái)服務(wù)注冊(cè)、RestTemplate實(shí)現(xiàn)微服務(wù)之間訪
這篇文章主要介紹了Spring?Cloud?Alibaba:Nacos服務(wù)治理平臺(tái),服務(wù)注冊(cè)、RestTemplate實(shí)現(xiàn)微服務(wù)之間訪問(wèn),負(fù)載均衡訪問(wèn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06

