淺析JAVA中的內(nèi)存結(jié)構(gòu)、重載、this與繼承
一.對(duì)象在JVM的內(nèi)存結(jié)構(gòu)
JAVA內(nèi)存管理由JVM來(lái)管理。
1)堆,所有new出來(lái)的對(duì)象(包括成員變量)
2)棧,所有局部變量(包括方法的參數(shù))
3)方法區(qū),class字節(jié)碼文件(包括方法,靜態(tài)數(shù)據(jù))
1.引用變量指向null時(shí),會(huì)發(fā)生空指針異常
public class student { int age; String name; public student(int age,String name){ this.age=age; this.name=name; } public static void main(String[] args) { //(類)引用類型 引用變量 創(chuàng)建對(duì)象(new出來(lái)的類中的構(gòu)造方法) student s= new student(18,"劉永超"); s=null; System.out.println(s); System.out.println(s.age);//發(fā)生異常,因?yàn)橐米兞恐赶騨ull } }
結(jié)果:java.lang.NullPointerException 2.引用類型劃等號(hào)和基本類型劃等號(hào)的區(qū)別: 一.引用類型劃等號(hào):
1…指向同一個(gè)對(duì)象
2.通過(guò)一個(gè)引用的修改對(duì)象中的數(shù)據(jù)會(huì)影響另一個(gè)對(duì)象中的數(shù)據(jù)
二.基本類型劃等號(hào):
1.賦值。
2.對(duì)一個(gè)變量的修改不會(huì)影響到另一個(gè)變量(例如int類型)
引用變量畫(huà)“”和基本類型畫(huà)”“區(qū)別:
引用類型畫(huà)”==“:
1.判斷兩個(gè)引用變量(引用地址)是否指向同一對(duì)象
2.基本類型畫(huà)等號(hào):判斷兩邊的值是否相等
代碼演示:
public class student2 { int age; String name; public student2(int a,String s){ age=a; name=s; } public static void main(String[] args) { student2 s=new student2(17,"liu"); student2 ss=s; s.age=20; ss.age=28; System.out.println(s.age); //s=ss 判斷兩個(gè)引用對(duì)象(引用變量)是否指指向同一對(duì)象 System.out.println(s==ss); } }
結(jié)果為 s.age=28 true;
成員變量與局部變量的生命周期:
- 成員變量:創(chuàng)建對(duì)象開(kāi)始到被GC垃圾回收器處理掉為止。
- 局部變量從調(diào)用方法到方法就結(jié)束。
二.方法的重載
1).發(fā)生在同一類,方法名相同,參數(shù)列表類型和數(shù)量不同
2).方法的重載,和返回值沒(méi)有關(guān)系
3).編譯器在在編譯時(shí)根據(jù)方法的簽名自動(dòng)綁定調(diào)用的方法
注:方法的簽名:方法名+參數(shù)列表
代碼的實(shí)現(xiàn):
public class overloadDemo { public void test(){ System.out.println("lala"); } public void test(int a){ System.out.println("heihei"); } public void test(String s){ System.out.println("xixi"); } public void test(int a,String s){ System.out.println("caocao"); } // public int test(){不是方法的重載,和返回值沒(méi)有關(guān)系 // return 1; // } //構(gòu)造方法 public overloadDemo (){ System.out.println("無(wú)參構(gòu)造"); } public overloadDemo(int a){ System.out.println("有參構(gòu)造"); } public static void main(String[] args) { overloadDemo load=new overloadDemo(); load.test(5); load.test(8, "liu"); } }
如上代碼,load.test(5)將調(diào)用public void test(int a){};
load.test(8,“l(fā)iu”)將調(diào)用public void test(int a,String s){}。
三.this的使用:
1.this關(guān)鍵字在方法中,用于指向調(diào)用該方法的當(dāng)前對(duì)象,簡(jiǎn)單的說(shuō),那個(gè)對(duì)象調(diào)用方法,this指的就是那個(gè)對(duì)象,嚴(yán)格來(lái)講,在方法中需要通過(guò)this關(guān)鍵字指明當(dāng)前對(duì)象。
2.在構(gòu)造方法中,用來(lái)初始化成員變量的參數(shù)一般和成員變量取相同的名字,這樣有利于代碼的可讀性,但次數(shù)必須通過(guò)this關(guān)鍵字來(lái)區(qū)別成員變量和參數(shù)(在這里不能省略this)
3.this就是指當(dāng)前對(duì)象。
this的用法:
1.this.成員變量—訪問(wèn)當(dāng)前對(duì)象成員變量
2.this.方法名—訪問(wèn)當(dāng)前對(duì)象的方法(一般不用)
3.this()---------調(diào)用構(gòu)造方法(必須寫(xiě)在此構(gòu)造方法中的第一行)
代碼演示:
public class thisDemo { int age; public void test(){ System.out.println(this.age);//此處可以省略this關(guān)鍵字 } public void test(int age){ System.out.println("這是帶有int類的test方法重載"); this.test();//此處也可以省略this,編譯器會(huì)自己默認(rèn) } public thisDemo(){ //this(20); this(19,"liuyongcaho");//調(diào)用當(dāng)前對(duì)象時(shí)int ,string類型的構(gòu)造方法 this.age=18; System.out.println("這是一個(gè)無(wú)參構(gòu)造方法"); } public thisDemo(int age){ this(); System.out.println(age); } public thisDemo(int age,String name){ System.out.println(age+" "+name); } public static void main(String[] args) { thisDemo pdd=new thisDemo(); pdd.test(9); } }
運(yùn)行結(jié)果:
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-QA8e4G5v-1615567706657)(C:\Users\Thinkpad\AppData\Roaming\Typora\typora-user-images\image-20210312160858936.png)]
可以看出,在new對(duì)象時(shí),會(huì)自行執(zhí)行它的無(wú)參構(gòu)造方法,執(zhí)行完后再執(zhí)行test(int a){}這個(gè)方法。
四:類的繼承
1.作用:代碼復(fù)用,減少代碼重復(fù)
2.通過(guò)extends來(lái)繼承
3.超類(父類),派生類(子類)共有的屬性和行為
4.派生類繼承超類后,派生類具有派生類+超類的共有屬性。
5.一個(gè)超累可以擁有多個(gè)派生類,一個(gè)派生類只能有一個(gè)超類。
6.繼承具有傳遞性
7.java中規(guī)定,在派生類的構(gòu)造方法中必須先構(gòu)造超類的構(gòu)造方法(必須在派生類的第一行),在派生類中若沒(méi)有調(diào)用超類的方法,則編譯器默認(rèn)提供super()來(lái)調(diào)用超類的無(wú)參構(gòu)造方法,若超類自己寫(xiě)了構(gòu)造方法,在派生類中不在默認(rèn)提供super();
super的含義及使用:
1.super指代當(dāng)前對(duì)象的超類對(duì)象
2.super必須放在構(gòu)造方法中的第一行
3.super.成員變量-----訪問(wèn)超類成員變量
4.super()—調(diào)用的時(shí)超類構(gòu)造方法。
代碼演示如下: 父類:
/* * 父類(超類) */ public class Person { int age; String name; String gender; public Person(int age,String name){ this.age=age; this.name=name; System.out.println(this.age+" "+this.name); } public void testperson(){ System.out.println("我是父類"); } }
子類:
/* * 子類(派生類) * extends */ public class Teacher extends Person{ String subject; public Teacher(){ //super();這是父類的無(wú)參構(gòu)造方法 super(19,"劉德華"); System.out.println(this.age+" "+this.name); } //方法的重寫(xiě) public void testperson(){ System.out.println("這是子類teacher的testperson方法"); } public static void main(String[] args) { Person y=new Teacher();//向上造型 y.testperson(); } }
運(yùn)行結(jié)果:
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-zydw2DJx-1615567706663)(C:\Users\Thinkpad\AppData\Roaming\Typora\typora-user-images\image-20210312165717602.png)]
結(jié)果分析:
子類在創(chuàng)建對(duì)象時(shí)會(huì)執(zhí)行子類的無(wú)參構(gòu)造方法,而子類的構(gòu)造方法中有父類的有參構(gòu)造方法再執(zhí)行子類中的testperson方法。
on方法");
}
public static void main(String[] args) { Person y=new Teacher();//向上造型 y.testperson(); }
}
##### 運(yùn)行結(jié)果: [外鏈圖片轉(zhuǎn)存中...(img-zydw2DJx-1615567706663)] ##### 結(jié)果分析: 子類在創(chuàng)建對(duì)象時(shí)會(huì)執(zhí)行子類的無(wú)參構(gòu)造方法,而子類的構(gòu)造方法中有父類的有參構(gòu)造方法再執(zhí)行子類中的testperson方法。 ####
到此這篇關(guān)于淺析JAVA中的內(nèi)存結(jié)構(gòu)、重載、this與繼承的文章就介紹到這了,更多相關(guān)java內(nèi)存結(jié)構(gòu)重載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java項(xiàng)目如何打包成Jar的實(shí)現(xiàn)步驟
一般情況下我們都是使用Java項(xiàng)目直接部署發(fā)布,有時(shí)需要我們將寫(xiě)好的項(xiàng)目打成jar包,方便后期調(diào)用,本文主要介紹了Java項(xiàng)目如何打包成Jar,感興趣的可以了解一下2023-11-11微信企業(yè)號(hào) 根據(jù)錯(cuò)誤碼返回錯(cuò)誤信息類封裝
這篇文章主要介紹了微信企業(yè)號(hào) 根據(jù)錯(cuò)誤碼返回錯(cuò)誤信息類封裝的相關(guān)資料,需要的朋友可以參考下2016-10-10Struts2+Hibernate實(shí)現(xiàn)數(shù)據(jù)分頁(yè)的方法
這篇文章主要介紹了Struts2+Hibernate實(shí)現(xiàn)數(shù)據(jù)分頁(yè)的方法,結(jié)合實(shí)例形式分析了Struts2結(jié)合Hibernate實(shí)現(xiàn)數(shù)據(jù)分頁(yè)的原理,步驟與相關(guān)實(shí)現(xiàn)代碼,需要的朋友可以參考下2016-03-03Java事務(wù)管理學(xué)習(xí)之JDBC詳解
這篇文章主要介紹了Java事務(wù)管理學(xué)習(xí)之JDBC的相關(guān)資料,文中介紹的非常詳細(xì),相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-03-03全鏈路監(jiān)控平臺(tái)Pinpoint?SkyWalking?Zipkin選型對(duì)比
這篇文章主要為大家介紹了全鏈路監(jiān)控平臺(tái)Pinpoint?SkyWalking?Zipkin實(shí)現(xiàn)的選型對(duì)比,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03Java數(shù)據(jù)結(jié)構(gòu)之鏈表、棧、隊(duì)列、樹(shù)的實(shí)現(xiàn)方法示例
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之鏈表、棧、隊(duì)列、樹(shù)的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Java數(shù)據(jù)結(jié)構(gòu)中鏈表、棧、隊(duì)列、樹(shù)的功能、定義及使用方法,需要的朋友可以參考下2019-03-03詳解Java實(shí)現(xiàn)的k-means聚類算法
這篇文章主要介紹了詳解Java實(shí)現(xiàn)的k-means聚類算法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01JPA中@JoinColumn的name和referencedColumnName屬性的區(qū)別及說(shuō)明
這篇文章主要介紹了JPA中@JoinColumn的name和referencedColumnName屬性的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05Java使用split分割無(wú)效獲取不到預(yù)期效果的解決辦法
這篇文章主要給大家介紹了關(guān)于Java使用split分割無(wú)效獲取不到預(yù)期效果的解決辦法,java的String類中有個(gè)split方法,這個(gè)是我們經(jīng)常使用到的,需要的朋友可以參考下2023-08-08