Java中 this和super的用法與區(qū)別小結(jié)
在Java的學(xué)習(xí)與開發(fā)者我們經(jīng)常遇到this和super關(guān)鍵字,那么它們的用法和區(qū)別是什么呢?
一、this關(guān)鍵字
1.this是什么?
this 是自身的一個(gè)對象,代表對象本身,可以理解為:指向?qū)ο蟊旧淼囊粋€(gè)指針。
2.this的用法
this 的用法在 Java 中大體可以分為3種:
(1)普通的直接引用
最簡單的用法,this 相當(dāng)于是指向當(dāng)前對象本身。
(2)形參與成員名字重名,用 this 來區(qū)分:
示例:
public class Animal {
public String name;
public int health;
public int love;
public Animal() {無參構(gòu)造
}
public Animal(String name, int health, int love) {//有參構(gòu)造方法
this.name = name;
this.health = health;
this.love = love;
}
}
在創(chuàng)建一個(gè)類,并且聲明許多屬性后,我們一般都要為這個(gè)類創(chuàng)建無參和有參構(gòu)造方法,而在有參方法的參數(shù)列表中,我們會(huì)發(fā)現(xiàn)形參的名字與屬性名相同,這時(shí)我們就需要用this關(guān)鍵字來區(qū)分,不然就會(huì)無法實(shí)現(xiàn)我們想要的效果。
(3)引用構(gòu)造函數(shù)
注意:在一個(gè)構(gòu)造方法中通過this關(guān)鍵字調(diào)用其它構(gòu)造方法的時(shí)候,this關(guān)鍵字需要寫在構(gòu)造方法中的第一行位置。
示例:
public class ThisDemo01 {
public String name;
public String age;
public ThisDemo01() {
System.out.println("ThisDemo01類中的無參構(gòu)造方法");
}
public ThisDemo01(String name, String age) {
//在一個(gè)構(gòu)造方法中通過this關(guān)鍵字調(diào)用其它構(gòu)造方法的時(shí)候,this關(guān)鍵字需要寫在構(gòu)造方法中的第一行位置
this();
System.out.println("ThisDemo01類中的有參構(gòu)造方法");
//this();
this.name = name;
this.age = age;
}
public static void main(String[] args) {
ThisDemo01 thisDemo01 = new ThisDemo01();
System.out.println("---------------");
ThisDemo01 thisDemo012 = new ThisDemo01("張三", "22");
}
}結(jié)果:

二、super關(guān)鍵字
1.super是什么?
super 可以理解為是指向自己父(根、超)類對象的一個(gè)指針,而這個(gè)父類指的是離自己最近的一個(gè)父類。
2.super的用法
super 也有三種用法:
(1)普通的直接引用
與 this 類似,super 相當(dāng)于是指向當(dāng)前對象的父類,這樣就可以用 super.xxx 來引用父類的成員。
(2)子類中的成員變量或方法與父類中的成員變量或方法同名:
class Country {
String name;
void value() {
name = "China";
}
}
class City extends Country {
String name;
void value() {
name = "Shanghai";
super.value(); //調(diào)用父類的方法
System.out.println(name);
System.out.println(super.name);
}
public static void main(String[] args) {
City c=new City();
c.value();
}
}結(jié)果:
Shanghai
China
可以看到,這里既調(diào)用了父類的方法,也調(diào)用了父類的變量。若不調(diào)用父類方法 value(),只調(diào)用父類變量 name 的話,則父類 name 值為默認(rèn)值 null。
(3)引用構(gòu)造函數(shù)
super(參數(shù)):調(diào)用父類中的某一個(gè)構(gòu)造函數(shù)(應(yīng)該為構(gòu)造函數(shù)中的第一條語句)。
//父類:
public class Animal{
private String name;
private int health;
private int love;
public Animal() {
}
public Animal(String name, int health, int love) {
this.name = name;
this.health = health;
this.love = love;
}
//子類:
public class Dog extends Animal{
// 品種
private String strain;
public Dog() {
}
public Dog(String name, int health, int love, String strain) {
super(name, health, love);
this.strain = strain;
}由上述代碼可以看到,我們可以在子類的構(gòu)造方法中用super關(guān)鍵字調(diào)用父類具有同樣參數(shù)的構(gòu)造方法,減少代碼量。
(4)super的一些限制:
super只能出現(xiàn)在子類的方法和構(gòu)造方法中 ;
super調(diào)用構(gòu)造方法時(shí),只能是第一句 ;
super不能訪問父類的private成員;
this() 和 super() 都指的是對象,所以,均不可以在 static 環(huán)境中使用。包括:static 變量,static 方法,static 語句塊。
三、super和this關(guān)鍵字的異同
(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)前對象的直接父類中的成員(用來訪問直接父類中被隱藏的父類中成員數(shù)據(jù)或函數(shù),基類與派生類中有相同成員定義時(shí)如:super.變量名 super.成員函數(shù)據(jù)名(實(shí)參) this:它代表當(dāng)前對象名(在程序中易產(chǎn)生二義性之處,應(yīng)使用 this 來指明當(dāng)前對象;如果函數(shù)的形參與類中的成員數(shù)據(jù)同名,這時(shí)需用 this 來指明成員變量名)
(4)調(diào)用super()必須寫在子類構(gòu)造方法的第一行,否則編譯不通過。每個(gè)子類構(gòu)造方法的第一條語句,都是隱含地調(diào)用 super(),如果父類沒有這種形式的構(gòu)造函數(shù),那么在編譯的時(shí)候就會(huì)報(bào)錯(cuò)。
(5)super() 和 this() 類似,區(qū)別是,super() 從子類中調(diào)用父類的構(gòu)造方法,this() 在同一類內(nèi)調(diào)用其它方法。
(6)super() 和 this() 均需放在構(gòu)造方法內(nèi)第一行。
(7)盡管可以用this調(diào)用一個(gè)構(gòu)造器,但卻不能調(diào)用兩個(gè)。
(8)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ì)通過。
(9)this() 和 super() 都指的是對象,所以,均不可以在 static 環(huán)境中使用。包括:static 變量,static 方法,static 語句塊。
(10)從本質(zhì)上講,this 是一個(gè)指向本對象的指針, 然而 super 是一個(gè) Java 關(guān)鍵字。
到此這篇關(guān)于Java中 this和super的用法與區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)Java中 this和super內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java中this與super關(guān)鍵字的使用方法
- Java中的構(gòu)造方法this、super的用法詳解
- java基礎(chǔ)知識 super和this使用解析
- Java this super代碼實(shí)例及使用方法總結(jié)
- Java中super和this的用法詳解
- 關(guān)于java關(guān)鍵字this和super的區(qū)別和理解
- Java中超詳細(xì)this與super的概念和用法
- Java 中的 this 和 super 區(qū)別
- Java關(guān)鍵字this與super詳解用法
- Java中super和this關(guān)鍵字詳解
- Java中this和super關(guān)鍵字的使用詳解
- JavaSE面試題之this與super關(guān)鍵字的區(qū)別詳解
相關(guān)文章
推薦一款I(lǐng)ntelliJ IDEA提示快捷鍵的Key Promoter X插件
今天小編就為大家分享一篇關(guān)于IntelliJ IDEA提示快捷鍵的Key Promoter X插件,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-10-10
Java線程啟動(dòng)為什么要用start()而不是run()?
這篇文章主要介紹了線程啟動(dòng)為什么要用start()而不是run()?下面文章圍繞start()與run()的相關(guān)資料展開詳細(xì)內(nèi)容,具有一定的參考價(jià)值,西藥的小火熬版可以參考一下,希望對你有所幫助2021-12-12
SpringBoot返回long,前端接收進(jìn)度丟失,@JsonSerialize不生效問題
這篇文章主要介紹了SpringBoot返回long,前端接收進(jìn)度丟失,@JsonSerialize不生效問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
SpringBoot下載Excel文件時(shí),報(bào)錯(cuò)文件損壞的解決方案
這篇文章主要介紹了SpringBoot下載Excel文件時(shí),報(bào)錯(cuò)文件損壞的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
Java多線程--讓主線程等待所有子線程執(zhí)行完畢在執(zhí)行
Java主線程等待所有子線程執(zhí)行完畢在執(zhí)行,其實(shí)在我們的工作中經(jīng)常的用到,本篇文章就介紹了Java多線程--讓主線程等待所有子線程執(zhí)行完畢在執(zhí)行,有需要的可以了解一下。2016-11-11
Java Socket編程心跳包創(chuàng)建實(shí)例解析
這篇文章主要介紹了Java Socket編程心跳包創(chuàng)建實(shí)例解析,具有一定借鑒價(jià)值,需要的朋友可以參考下2017-12-12
使用idea搭建spring項(xiàng)目,利用xml文件的形式進(jìn)行配置方式
本文介紹了如何使用SpringIOC和SpringDI的思想開發(fā)一個(gè)打印機(jī)模擬程序,實(shí)現(xiàn)了靈活配置彩色墨盒或灰色墨盒以及打印頁面大小的功能,通過創(chuàng)建接口和實(shí)現(xiàn)類,并在配置文件中進(jìn)行依賴注入,實(shí)現(xiàn)了控制反轉(zhuǎn)2024-11-11

