關(guān)于java關(guān)鍵字this和super的區(qū)別和理解
this:
this理解為:當(dāng)前對(duì)象 或 當(dāng)前正在創(chuàng)建的對(duì)象
可以調(diào)用的結(jié)構(gòu):屬性、方法;構(gòu)造器
this調(diào)用屬性、方法:
先了解一下形參:
形參的意義就是給屬性賦值,我們是要給同名的屬性賦值,這時(shí)候我們就把形參名和屬性的名字寫(xiě)成一樣,這樣我們就知道我們傳入的形參就是要給我們同名的屬性去賦值的.
在類(lèi)的方法中,我們可以使用"this.屬性"或"this.方法"的方式,調(diào)用當(dāng)前對(duì)象屬性或方法。但是,
通常情況下,我們都擇省略"this."。特殊情況下,如果方法的形參和類(lèi)的屬性同名時(shí),我們必須顯式的使用"this.變量"的方式,表明此變量是屬性,而非形參。
舉例:我們聲明一個(gè)類(lèi)叫鞋類(lèi),給它提供私有的屬性和get/set方法和構(gòu)造器:
//聲明一個(gè)鞋類(lèi) public class shoes { //鞋的屬性 private String name;//鞋名 private int id;//編號(hào) //無(wú)參構(gòu)造器 public shoes() { } //有參構(gòu)造器: public shoes(String name, int id) { // name = name;沒(méi)加this this.name = name; // id = id; 沒(méi)加this this.id = id; } //聲明兩個(gè)方法 public void show(){ System.out.println("展示~~"); sale();//show方法中調(diào)sale方法 // this.sale();//this可省略 } public void sale(){ System.out.println("售賣(mài)~~"); } //get/set方法: public String getName() { return name; } public void setName(String name) { //name = name;沒(méi)加this this.name = name; } public void setId(int id) { //id = id;沒(méi)加this this.id = id; } public int getId() { return id; } } //測(cè)試 class test { public static void main(String[] args) { //我們先實(shí)例化鞋類(lèi)的對(duì)象來(lái)調(diào)它的屬性 shoes s = new shoes(); s.setName("nike");//這里的"nike"就是傳入的形參 System.out.println(s.getName()); //我們獲取鞋名的時(shí)候,獲取不到,意思就是形參的值又賦給了形參,代表沒(méi)有給鞋的屬性賦上值 //這個(gè)時(shí)候控制臺(tái)會(huì)輸出傳入的形參數(shù)據(jù)類(lèi)型的默認(rèn)值,明顯不是我們想看到的結(jié)果 s.setId(1); System.out.println(s.getId());//鞋的id類(lèi)似的也會(huì)出現(xiàn)同樣的情況 //"this.方法"舉例: s.show(); /*我們先調(diào)的是show自己的方法體,然后在show方法中調(diào)了sale方法 意思是s這個(gè)對(duì)象調(diào)了show方法,我們就用調(diào)show方法的這個(gè)對(duì)象s來(lái)調(diào)sale方法, 其實(shí)在sale();前面也省略了this關(guān)鍵字,表示當(dāng)前對(duì)象(就是調(diào)show方法的對(duì)象)調(diào)的sale方法*/ System.out.println("------------------------分割線(xiàn)--------------------"); shoes s1 = new shoes("李寧",2);//我們new的有參數(shù)的對(duì)象給它賦初值之后 System.out.println(s1.getName()); System.out.println(s1.getId());//如果沒(méi)有加this,結(jié)果還是和沒(méi)有獲取到鞋名和編號(hào) } }
先來(lái)看沒(méi)有加this關(guān)鍵字的情況:
結(jié)果:
然后我們給鞋屬性加上this關(guān)鍵字:
控制臺(tái)輸出的就是我們給鞋設(shè)置的名字和編號(hào):
在類(lèi)的構(gòu)造器中,我們可以使用"this.屬性"或"this.方法"的方式,調(diào)用當(dāng)前正在創(chuàng)建的對(duì)象屬性或方法。但是,通常情況下,我們都擇省略"this."。特殊情況下,如果構(gòu)造器的形參和類(lèi)的屬性同名時(shí),我們必須顯式的使用"this.變量"的方式,表明此變量是屬性,而非形參。
同樣的我們的構(gòu)造器也是一樣:如果有參構(gòu)造器沒(méi)有加給屬性加this關(guān)鍵字:控制臺(tái)輸出結(jié)果也和上面一樣
加上之后:
"this.方法"舉例:我們聲明兩個(gè)方法show和sale方法來(lái)舉例體會(huì)一下this的作用:代碼參照上面:
s.show();的結(jié)果:
this調(diào)用構(gòu)造器:
① 我們?cè)陬?lèi)的構(gòu)造器中,可以顯式的使用"this(形參列表)"方式,調(diào)用本類(lèi)中指定的其他構(gòu)造器
② 構(gòu)造器中不能通過(guò)"this(形參列表)“方式調(diào)用自己
③ 如果一個(gè)類(lèi)中有n個(gè)構(gòu)造器,則最多有 n - 1構(gòu)造器中使用了"this(形參列表)”
④ 規(guī)定:"this(形參列表)“必須聲明在當(dāng)前構(gòu)造器的首行
⑤ 構(gòu)造器內(nèi)部,最多只能聲明一個(gè)"this(形參列表)”,用來(lái)調(diào)用其他的構(gòu)造器
舉例:我們還是寫(xiě)一個(gè)Shoes類(lèi) 提供私有屬性和get/set方法并提供三個(gè)構(gòu)造器:
public class Shoes { //屬性 private String name;//鞋名 private int id;//編號(hào) //get/set方法: public String getName() { return name; } public void setName(String name) { this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } //構(gòu)造器1 public Shoes() { System.out.println("構(gòu)造器1"); } //構(gòu)造器2 public Shoes(int id){ this();//調(diào)構(gòu)造器1 System.out.println("構(gòu)造器2"); this.id = id; } //構(gòu)造器3 public Shoes(String name, int id) { //通過(guò)調(diào)用構(gòu)造器來(lái)執(zhí)行其他構(gòu)造器中的代碼 this(id);//調(diào)構(gòu)造器2 // this.id = id;//交給構(gòu)造器2來(lái)執(zhí)行 this.name = name; //我們?nèi)绻枰褂玫狡渌麡?gòu)造器中的代碼就可以使用"this.構(gòu)造器"的方式 //這里只是為了舉例我們只寫(xiě)了一行輸出語(yǔ)句,真正實(shí)際中我們寫(xiě)的代碼多了,調(diào)用構(gòu)造器的方法的優(yōu)勢(shì)就體現(xiàn)出來(lái)了 //這樣我們可以減少代碼的冗余,提高程序執(zhí)行效率 } } class test{ public static void main(String[] args) { //用構(gòu)造器3來(lái)實(shí)例化對(duì)象,我們?cè)跇?gòu)造器3中沒(méi)有把參數(shù)id賦給當(dāng)前對(duì)象 //但是通過(guò)調(diào)構(gòu)造器2,構(gòu)造器2中執(zhí)行了 this.id = id;把id賦給了當(dāng)前對(duì)象的屬性 //所以我們才可以得到當(dāng)前對(duì)象s3的id Shoes s3 = new Shoes("adidas",2021); System.out.println(s3.getId()); } }
運(yùn)行結(jié)果:
super:
super 關(guān)鍵字可以理解為:父類(lèi)的
可以用來(lái)調(diào)用的結(jié)構(gòu):
屬性、方法、構(gòu)造器
super調(diào)用屬性、方法:
我們可以在子類(lèi)的方法或構(gòu)造器中。通過(guò)使用"super.屬性"或"super.方法"的方式,顯式的調(diào)用父類(lèi)中聲明的屬性或方法。但是,通常情況下,我們習(xí)慣省略"super."
①特殊情況:當(dāng)子類(lèi)和父類(lèi)中定義了同名的屬性時(shí),我們要想在子類(lèi)中調(diào)用父類(lèi)中聲明的屬性,則必須顯式的使用"super.屬性"的方式,表明調(diào)用的是父類(lèi)中聲明的屬性。
② 特殊情況:當(dāng)子類(lèi)重寫(xiě)了父類(lèi)中的方法以后,我們想在子類(lèi)的方法中調(diào)用父類(lèi)中被重寫(xiě)的方法時(shí),則必須顯式的使用"super.方法"的方式,表明調(diào)用的是父類(lèi)中被重寫(xiě)的方法(也就是父類(lèi)中原本的方法)。
舉例兩種特殊情況:在子類(lèi)的方法中調(diào)用父類(lèi)中同名的屬性和方法:
創(chuàng)建一個(gè)人類(lèi),一個(gè)學(xué)生類(lèi),學(xué)生類(lèi)繼承人類(lèi),和一個(gè)測(cè)試類(lèi)
//人類(lèi) public class Person { //屬性 String name = "普通人";//姓名 int id = 1234;//身份證號(hào) //方法 public void learn(){ System.out.println("人要學(xué)習(xí)"); } }
//學(xué)生類(lèi) public class Student extends Person { //聲明了與父類(lèi)的同名屬性 String name = "哈利波特";//姓名 int id = 9527;//學(xué)號(hào) @Override//子類(lèi)重寫(xiě)父類(lèi)的方法 public void learn() { System.out.println("學(xué)生要努力學(xué)習(xí)"); super.learn();//調(diào)父類(lèi)中原本的方法 System.out.println("姓名:"+name);//子類(lèi)自己的屬性 System.out.println("學(xué)號(hào):"+id); System.out.println("姓名:"+super.name);//父類(lèi)中聲明的屬性 System.out.println("身份證號(hào):"+super.id); } }
//測(cè)試類(lèi) public class Test { public static void main(String[] args) { //實(shí)例化子類(lèi)對(duì)象 Student student = new Student(); //調(diào)子類(lèi)中重寫(xiě)父類(lèi)的方法 student.learn(); } }
輸出結(jié)果:
super調(diào)用構(gòu)造器:
我們可以在子類(lèi)的構(gòu)造器中顯式的使用"super(形參列表)"的方式,調(diào)用父類(lèi)中聲明的指定的構(gòu)造器
注意:
"super(形參列表)"的使用,必須聲明在子類(lèi)構(gòu)造器的首行!我們?cè)陬?lèi)的構(gòu)造器中,針對(duì)于"this(形參列表)"或"super(形參列表)"只能二者取其一,不能同時(shí)出現(xiàn)在構(gòu)造器的首行,沒(méi)顯式的聲明"this(形參列表)“或"super(形參列表)”,則默認(rèn)調(diào)用的是父類(lèi)中空參的構(gòu)造器:super()在類(lèi)的多個(gè)構(gòu)造器中,至少一個(gè)類(lèi)的構(gòu)造器中使用了"super(形參列表)",調(diào)用父類(lèi)中的構(gòu)造器
舉例:還是用上面的例子,我們?cè)谌祟?lèi)和學(xué)生類(lèi)中添加構(gòu)造器:
public class Person { //屬性 String name = "普通人";//姓名 int id = 1234;//身份證號(hào) //構(gòu)造器 public Person() { } public Person(String name, int id) { this.name = name; this.id = id; } //方法 public void learn(){ System.out.println("人要學(xué)習(xí)"); } }
public class Student extends Person { //聲明了與父類(lèi)的同名屬性 String name = "哈利波特";//姓名 int id = 9527;//學(xué)號(hào) //構(gòu)造器1 public Student(String name, int id) { this.name = name; this.id = id; } //構(gòu)造器2 public Student(String name, int id, String name1, int id1) { super(name, id);//調(diào)用父類(lèi)已有的構(gòu)造器 this.name = name1; this.id = id1; } @Override//子類(lèi)重寫(xiě)父類(lèi)的方法 public void learn() { System.out.println("學(xué)生要努力學(xué)習(xí)"); super.learn();//調(diào)父類(lèi)中原本的方法 System.out.println("姓名:"+name);//子類(lèi)自己的屬性 System.out.println("學(xué)號(hào):"+id); System.out.println("姓名:"+super.name);//父類(lèi)中聲明的屬性 System.out.println("身份證號(hào):"+super.id); } }
在子類(lèi)構(gòu)造器2中調(diào)用父類(lèi)已有的有參構(gòu)造器:
然后測(cè)試:實(shí)例化學(xué)生類(lèi)的對(duì)象并給屬性賦值,調(diào)learn方法:
public class Test { public static void main(String[] args) { Student student = new Student("人",8888,"學(xué)生",2021); student.learn(); } }
輸出結(jié)果:
this與super的區(qū)別總結(jié):
①代表事物不同
this表示當(dāng)前所屬函數(shù)的調(diào)用者對(duì)象
super表示調(diào)用父類(lèi)的結(jié)構(gòu)(屬性,方法,構(gòu)造器)
②使用前提不同
super必須要有繼承關(guān)系才能使用
this不需要繼承關(guān)系也能使用
③調(diào)用的構(gòu)造器不同
super:調(diào)用父類(lèi)的構(gòu)造器
this:調(diào)用當(dāng)前類(lèi)(本類(lèi))的構(gòu)造器
說(shuō)明:
在??臻g中存放的是對(duì)象的引用也就是對(duì)象名指向堆空間中new的對(duì)象,在堆空間中子類(lèi)和父類(lèi)的屬性都會(huì)有,this和super都可以通過(guò)棧空間的引用指向堆空間來(lái)調(diào)用具體的屬性.
繼續(xù)加油~~沖沖沖! ! !
總結(jié)
到此這篇關(guān)于java關(guān)鍵字this和super的區(qū)別和理解的文章就介紹到這了,更多相關(guān)java關(guān)鍵字this和super區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java通過(guò)jacob實(shí)現(xiàn)office在線(xiàn)預(yù)覽功能
這篇文章主要為大家詳細(xì)介紹了java通過(guò)jacob實(shí)現(xiàn)office在線(xiàn)預(yù)覽功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08SpringBoot集成Redisson實(shí)現(xiàn)分布式鎖的方法示例
這篇文章主要介紹了SpringBoot集成Redisson實(shí)現(xiàn)分布式鎖的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10JavaEE通過(guò)response實(shí)現(xiàn)請(qǐng)求重定向
這篇文章主要介紹了JavaEE通過(guò)response實(shí)現(xiàn)請(qǐng)求重定向的方法,非常的簡(jiǎn)單實(shí)用,有需要的朋友可以參考下2014-10-10一小時(shí)迅速入門(mén)Mybatis之實(shí)體類(lèi)別名與多參數(shù) 動(dòng)態(tài)SQL
這篇文章主要介紹了一小時(shí)迅速入門(mén)Mybatis之實(shí)體類(lèi)別名與多參數(shù) 動(dòng)態(tài)SQL,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09IntelliJ IDEA設(shè)置代碼的快捷編輯模板Live Templates
今天小編就為大家分享一篇關(guān)于IntelliJ IDEA設(shè)置代碼的快捷編輯模板Live Templates,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10運(yùn)用springboot搭建并部署web項(xiàng)目的示例
這篇文章主要介紹了運(yùn)用springboot搭建并部署web項(xiàng)目的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06Java Flink與kafka實(shí)現(xiàn)實(shí)時(shí)告警功能過(guò)程
這篇文章主要介紹了Java Flink與kafka實(shí)現(xiàn)實(shí)時(shí)告警功能,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-01-01