JAVA中this和super用法
? 參考網(wǎng)上資料和自行理解總結(jié)java中this和super中各自用法及其差異
<一>. this的用法
構(gòu)造方法是創(chuàng)建java對(duì)象的重要途徑,通過new關(guān)鍵字調(diào)用構(gòu)造器時(shí),構(gòu)造器返回該類的對(duì)象,但是這個(gè)對(duì)手并不是完全由構(gòu)造器負(fù)責(zé)創(chuàng)建. 創(chuàng)建一個(gè)對(duì)象分為如下四步:
a. 分配對(duì)象空間,并將對(duì)象成員變量初始化為0或者null
b. 執(zhí)行屬性值的顯式初始化
c. 執(zhí)行構(gòu)造方法
d. 返回對(duì)象的地址給相關(guān)變量
this的本質(zhì)就是“創(chuàng)建好的的對(duì)象的地址”, 由于在構(gòu)造方法調(diào)用前,對(duì)象已經(jīng)創(chuàng)建. 因此,在構(gòu)造方法中也可以使用this代表“當(dāng)前對(duì)象”.
書上對(duì)于this的描述
this表示一個(gè)對(duì)象的引用,它指向正在執(zhí)行方法的對(duì)象. 特別的, 在構(gòu)造方法中,通過this關(guān)鍵字調(diào)用其他構(gòu)造方法時(shí),必須放在第一行,否則編譯器會(huì)報(bào)錯(cuò). 且在構(gòu)造方法中, 只能通過this調(diào)用一次其他構(gòu)造方法.
this舉例一
package cn.sxt.oop;public class Test_this_super {int id;String name;boolean man;double width;public Test_this_super(){System.out.println("無參數(shù)構(gòu)造器");}public Test_this_super(int number,String name){this();System.out.println("傳遞int和String形式參數(shù)構(gòu)造器");}public Test_this_super(int number,String name,double _width){this(number,name);this.width = _width;System.out.println("傳遞int, String, double形式參數(shù)構(gòu)造器");}public Test_this_super(int number,String name,char a){System.out.println("傳遞int, String, char形式參數(shù)構(gòu)造器");}public static void main(String[] args) {Test_this_super t1 = new Test_this_super();Test_this_super t2 = new Test_this_super(1000,"Tom");Test_this_super t3 = new Test_this_super(2000,"long",3.14);Test_this_super t4 = new Test_this_super(2000,"long",'a');} }打印結(jié)果
t1 無參數(shù)構(gòu)造器t2 無參數(shù)構(gòu)造器傳遞int和String形式參數(shù)構(gòu)造器t3 無參數(shù)構(gòu)造器傳遞int和String形式參數(shù)構(gòu)造器傳遞int, String, double形式參數(shù)構(gòu)造器t4 傳遞int, String, char形式參數(shù)構(gòu)造它器圖形分析如下;
<二> super用法
super是指向父類的引用,如果構(gòu)造方法沒有顯示地調(diào)用父類的構(gòu)造方法,那么編譯器會(huì)自動(dòng)為它加上一個(gè)默認(rèn)的super()方法調(diào)用。如果父類由沒有默認(rèn)的無參構(gòu)造方法,編譯器就會(huì)報(bào)錯(cuò),super()語句必須是構(gòu)造方法的第一個(gè)子句。
定義子類的一個(gè)對(duì)象時(shí),會(huì)先調(diào)用子類的構(gòu)造函數(shù),然后在調(diào)用父類的構(gòu)造函數(shù),如果父類函數(shù)足夠多的話,會(huì)一直調(diào)用到最終的父類構(gòu)造函數(shù),函數(shù)調(diào)用時(shí)會(huì)使用棧空間,所以按照入棧的順序,最先進(jìn)入的是子類的構(gòu)造函數(shù),然后才是鄰近的父類構(gòu)造函數(shù),最后再棧頂?shù)氖亲罱K的父類構(gòu)造函數(shù),構(gòu)造函數(shù)執(zhí)行是則按照從棧頂?shù)綏5椎捻樞蛞来螆?zhí)行.
現(xiàn)在以Bird--> Animal -->?Object 為線舉例說明
public class Animal {int eye = 2;public Animal(){super();System.out.println("動(dòng)物");}public void run(){System.out.println("動(dòng)物有不同走路方式");}public static void main(String[] args) {Bird b = new Bird();b.run();} }class Bird extends Animal{public Bird(){super();System.out.println("鳥類");}@Overridepublic void run() {// TODO Auto-generated method stubsuper.run(); // 通過super可以用父類方法和屬性System.out.println("鳥是飛飛飛飛飛飛");System.out.println("鳥類有"+super.eye+"只眼睛");}}打印結(jié)果
動(dòng)物 鳥類 動(dòng)物有不同走路方式 鳥是飛飛飛飛飛飛 鳥類有2只眼睛Bird--> Animal -->?Object 圖形分析如下
<三> this和super差異
1)super(參數(shù)):調(diào)用基類中的某一個(gè)構(gòu)造函數(shù)(應(yīng)該為構(gòu)造函數(shù)中的第一條語句)?
2)this(參數(shù)):調(diào)用本類中另一種形成的構(gòu)造函數(shù)(應(yīng)該為構(gòu)造函數(shù)中的第一條語句)
3)super: 它引用當(dāng)前對(duì)象的直接父類中的成員(用來訪問直接父類中被隱藏的父類中成員數(shù)據(jù)或函數(shù),基類與派生類中有相同成員定義時(shí)如:super.變量名??? super.成員函數(shù)據(jù)名(實(shí)參)
4)this:它代表當(dāng)前對(duì)象名(在程序中易產(chǎn)生二義性之處,應(yīng)使用this來指明當(dāng)前對(duì)象;如果函數(shù)的形參與類中的成員數(shù)據(jù)同名,這時(shí)需用this來指明成員變量名)
5)調(diào)用super()必須寫在子類構(gòu)造方法的第一行,否則編譯不通過。每個(gè)子類構(gòu)造方法的第一條語句,都是隱含地調(diào)用super(),如果父類沒有這種形式的構(gòu)造函數(shù),那么在編譯的時(shí)候就會(huì)報(bào)錯(cuò)。
6)super()和this()類似,區(qū)別是,super()從子類中調(diào)用父類的構(gòu)造方法,this()在同一類內(nèi)調(diào)用其它方法。
7)super()和this()均需放在構(gòu)造方法內(nèi)第一行。
8)盡管可以用this調(diào)用一個(gè)構(gòu)造器,但卻不能調(diào)用兩個(gè)。
9)this和super不能同時(shí)出現(xiàn)在一個(gè)構(gòu)造函數(shù)里面,因?yàn)閠his必然會(huì)調(diào)用其它的構(gòu)造函數(shù),其它的構(gòu)造函數(shù)必然也會(huì)有super語句的存在,所以在同一個(gè)構(gòu)造函數(shù)里面有相同的語句,就失去了語句的意義,編譯器也不會(huì)通過。
10)this()和super()都指的是對(duì)象,所以,均不可以在static環(huán)境中使用。包括:static變量,static方法,static語句塊。
11)從本質(zhì)上講,this是一個(gè)指向本對(duì)象的指針, 然而super是一個(gè)Java關(guān)鍵字。
轉(zhuǎn)載于:https://www.cnblogs.com/yyy6/p/8976584.html
總結(jié)
以上是生活随笔為你收集整理的JAVA中this和super用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 20172311『Java程序设计』课程
- 下一篇: 前端面试问题(HTML5+Http+we