Java中的this和super實例淺析
要說this和super就不得不說Java的封裝和繼承了,首先說封裝,這是一種思想,算不上一種技術,核心思想就是將對象的同一行為和狀態(tài)看成是一個整體,將無需對外界暴露的屬性和方法隱藏起來,比如一些方法的具體實現(xiàn)和一些私有的變量,通過公共的方法提供對屬性的操作,從而提高安全性。
class Person {
private String name = "無名氏";//私有的內部成員變量
private int age = 20;//私有的內部成員變量
public void sayHello(){//公有的方法,外界可以通過調用這個方法獲得需要的功能
System.out.println("我的名字是"+name+",今年"+age+"了");
}
public String getName() {//公有的方法,外界通過操作這個方法獲取私有變量值
return name;
}
public void setName(String name) {//公有方法,外界通過操作這個方法設置公有變量的值
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
然而這種封裝也不是絕對的,當我們需要一些很相似的類的時候,往往希望能夠通過一個類派生出許多的擁有共同的特性的類,比如通過動物這個類,派生出貓狗雞鴨這些類,他們都擁有動物的特性,但是又各有特點。這就是Java中的繼承,通過繼承,我們可以獲得父類所暴露給子類的所有成員,而又可以在父類的基礎上構建自己特有的屬性。
public class StaticDemo {
public static void main(String[] args) {
Student s = new Student();
s.age = 20;//從父類繼承的屬性
s.name = "張同學";
s.stuNumber = 10;//子類特有的成員變量
s.sayHello();//從父類繼承的方法
s.study();
}
}
class Person {
protected String name = "無名氏";// 子類共享的成員變量
protected int age = 20;// 子類共享的成員變量
public void sayHello() {// 公有的方法,外界可以通過調用這個方法獲得需要的功能
System.out.println("我的名字是" + name + ",今年" + age + "了");
}
}
class Student extends Person {
public int stuNumber = 20;// 學生特有的學號
public void study() {// 學生特有的方法,學習
System.out.println("好好學習!");
}
}
至此,我們已經大概了解封裝和繼承,那下面就來看看this和super關鍵字是什么意思。
super關鍵字代表的是父類對象,this關鍵字代表的是當前對象。要理解這些,首先我們要看看子類在創(chuàng)建對象的時候執(zhí)行了什么。為了方便起見,在此都使用無參構造方法。
編譯器找到子類無參構造方法。
執(zhí)行子類無參構造方法。
在子類無參構造方法的方法體中,第一句代碼是隱藏得super();這句代碼的意思是執(zhí)行父類構造方法。
跳轉到父類構造方法中,執(zhí)行父類構造方法,注意,此時子類構造方法并未執(zhí)行完畢,并且若父類還有父類,則一直執(zhí)行上一層父類的構造方法,直到找到所有類的祖宗Object類。
將父類的對象的引用存入子類的super中,即子類中的super代表的是父類實體。然而在父類中,super代表的又是父類的父類的實體。
將創(chuàng)建出的當前類的引用存入this。
public class StaticDemo {
public static void main(String[] args) {
GirlStudent g = new GirlStudent();
g.sayName();
}
}
class Person {
protected String name = "無名氏";// 子類共享的成員變量
protected int age = 20;// 子類共享的成員變量
public void sayHello() {// 公有的方法,外界可以通過調用這個方法獲得需要的功能
System.out.println("我的名字是" + name + ",今年" + age + "了");
}
}
class Student extends Person {
public int stuNumber = 20;// 學生特有的學號
public String name = "張同學";
public String getSuperName() {//獲取當前類的父類名字的方法,對于student是父類,對于girlstudent則是爺爺類
return super.name;//父類中的super代表的是父類的父類,即student的父類即person類,可以看出子類一旦初始化,將會創(chuàng)建出所有父類對象,一直到object
}
}
class GirlStudent extends Student{
public String name = "小紅";
public void sayName(){
System.out.println("自己的名字是:"+this.name+",父類的名字是:"+super.name+",爺爺類的名字是:"+super.getSuperName());
}
}
由此可以看出super的用途:用于調用子類隱藏的父類的屬性,比如上述代碼中的name屬性,還有一個比較重要的用途就是用于調用被子類覆寫的方法,此時方法名相同,必須使用super才能調用父類的方法。
this的用途:在變量定義不明確時,用來確定調用的具體是哪個變量。
public void setName(String name){
this.name=name;
}
在上面的代碼中由于傳入的變量也是name,類中本來就存在一個變量也叫name,此時將不明確name是哪個,所以使用this進行區(qū)分。
PS:super和this的異同:
super(參數):調用基類中的某一個構造函數(應該為構造函數中的第一條語句)
this(參數):調用本類中另一種形成的構造函數(應該為構造函數中的第一條語句)
super: 它引用當前對象的直接父類中的成員(用來訪問直接父類中被隱藏的父類中成員數據或函數,基類與派生類中有相同成員定義時如:super.變量名 super.成員函數據名(實參)
this:它代表當前對象名(在程序中易產生二義性之處,應使用this來指明當前對象;如果函數的形參與類中的成員數據同名,這時需用this來指明成員變量名)
調用super()必須寫在子類構造方法的第一行,否則編譯不通過。每個子類構造方法的第一條語句,都是隱含地調用super(),如果父類沒有這種形式的構造函數,那么在編譯的時候就會報錯。
super()和this()類似,區(qū)別是,super()從子類中調用父類的構造方法,this()在同一類內調用其它方法。
super()和this()均需放在構造方法內第一行。
盡管可以用this調用一個構造器,但卻不能調用兩個。
this和super不能同時出現(xiàn)在一個構造函數里面,因為this必然會調用其它的構造函數,其它的構造函數必然也會有super語句的存在,所以在同一個構造函數里面有相同的語句,就失去了語句的意義,編譯器也不會通過。
this()和super()都指的是對象,所以,均不可以在static環(huán)境中使用。包括:static變量,static方法,static語句塊。
從本質上講,this是一個指向本對象的指針, 然而super是一個Java關鍵字。
相關文章
Spring中的@AutoWired與@Resource及@Qualifier注解詳解
這篇文章主要介紹了Spring中的@AutoWired與@Resource及@Qualifier注解詳解,spring不但支持自己定義的@Autowired注解,所以Autowired與Spring是強相關性,只能在spring框架中使用,而后幾個注解則不然,需要的朋友可以參考下2023-11-11
springboot詳解實現(xiàn)車險理賠信息管理系統(tǒng)代碼
本系統(tǒng)基于Springboot開發(fā)實現(xiàn)了一個為用戶車險進行理賠信息管理的一個信息化管理系統(tǒng),核心的業(yè)務主要是用戶申請保險理賠,管理員審核進入理賠程序,事故調查員對事故進行調查和現(xiàn)場勘察,這其中共涉及到三類用戶,購買保險的客戶,事故調查員和系統(tǒng)管理員2022-06-06
java實現(xiàn)String類型和Date類型相互轉換
很多人表示,java將string類型轉為date類型不知道應該怎樣做,本文就來介紹一下java實現(xiàn)String類型和Date類型相互轉換,具有一定的參考價值,感興趣的可以了解一下2023-10-10

