要說this和super就不得不說Java的封裝和繼承了,首先說封裝,這是一種思想,算不上一種技術(shù),核心思想就是將對象的同一行為和狀態(tài)看成是一個(gè)整體,將無需對外界暴露的屬性和方法隱藏起來,比如一些方法的具體實(shí)現(xiàn)和一些私有的變量,通過公共的方法提供對屬性的操作,從而提高安全性。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class Person { private String name = "無名氏" ; //私有的內(nèi)部成員變量 private int age = 20 ; //私有的內(nèi)部成員變量 public void sayHello(){ //公有的方法,外界可以通過調(diào)用這個(gè)方法獲得需要的功能 System.out.println( "我的名字是" +name+ ",今年" +age+ "了" ); } public String getName() { //公有的方法,外界通過操作這個(gè)方法獲取私有變量值 return name; } public void setName(String name) { //公有方法,外界通過操作這個(gè)方法設(shè)置公有變量的值 this .name = name; } public int getAge() { return age; } public void setAge( int age) { this .age = age; } } |
然而這種封裝也不是絕對的,當(dāng)我們需要一些很相似的類的時(shí)候,往往希望能夠通過一個(gè)類派生出許多的擁有共同的特性的類,比如通過動物這個(gè)類,派生出貓狗雞鴨這些類,他們都擁有動物的特性,但是又各有特點(diǎn)。這就是Java中的繼承,通過繼承,我們可以獲得父類所暴露給子類的所有成員,而又可以在父類的基礎(chǔ)上構(gòu)建自己特有的屬性。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public class StaticDemo { public static void main(String[] args) { Student s = new Student(); s.age = 20 ; //從父類繼承的屬性 s.name = "張同學(xué)" ; s.stuNumber = 10 ; //子類特有的成員變量 s.sayHello(); //從父類繼承的方法 s.study(); } } class Person { protected String name = "無名氏" ; // 子類共享的成員變量 protected int age = 20 ; // 子類共享的成員變量 public void sayHello() { // 公有的方法,外界可以通過調(diào)用這個(gè)方法獲得需要的功能 System.out.println( "我的名字是" + name + ",今年" + age + "了" ); } } class Student extends Person { public int stuNumber = 20 ; // 學(xué)生特有的學(xué)號 public void study() { // 學(xué)生特有的方法,學(xué)習(xí) System.out.println( "好好學(xué)習(xí)!" ); } } |
至此,我們已經(jīng)大概了解封裝和繼承,那下面就來看看this和super關(guān)鍵字是什么意思。
super關(guān)鍵字代表的是父類對象,this關(guān)鍵字代表的是當(dāng)前對象。要理解這些,首先我們要看看子類在創(chuàng)建對象的時(shí)候執(zhí)行了什么。為了方便起見,在此都使用無參構(gòu)造方法。
編譯器找到子類無參構(gòu)造方法。
執(zhí)行子類無參構(gòu)造方法。
在子類無參構(gòu)造方法的方法體中,第一句代碼是隱藏得super();這句代碼的意思是執(zhí)行父類構(gòu)造方法。
跳轉(zhuǎn)到父類構(gòu)造方法中,執(zhí)行父類構(gòu)造方法,注意,此時(shí)子類構(gòu)造方法并未執(zhí)行完畢,并且若父類還有父類,則一直執(zhí)行上一層父類的構(gòu)造方法,直到找到所有類的祖宗Object類。
將父類的對象的引用存入子類的super中,即子類中的super代表的是父類實(shí)體。然而在父類中,super代表的又是父類的父類的實(shí)體。
將創(chuàng)建出的當(dāng)前類的引用存入this。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
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() { // 公有的方法,外界可以通過調(diào)用這個(gè)方法獲得需要的功能 System.out.println( "我的名字是" + name + ",今年" + age + "了" ); } } class Student extends Person { public int stuNumber = 20 ; // 學(xué)生特有的學(xué)號 public String name = "張同學(xué)" ; public String getSuperName() { //獲取當(dāng)前類的父類名字的方法,對于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的用途:用于調(diào)用子類隱藏的父類的屬性,比如上述代碼中的name屬性,還有一個(gè)比較重要的用途就是用于調(diào)用被子類覆寫的方法,此時(shí)方法名相同,必須使用super才能調(diào)用父類的方法。
this的用途:在變量定義不明確時(shí),用來確定調(diào)用的具體是哪個(gè)變量。
1
2
3
|
public void setName(String name){ this .name=name; } |
在上面的代碼中由于傳入的變量也是name,類中本來就存在一個(gè)變量也叫name,此時(shí)將不明確name是哪個(gè),所以使用this進(jìn)行區(qū)分。
PS:super和this的異同:
super(參數(shù)):調(diào)用基類中的某一個(gè)構(gòu)造函數(shù)(應(yīng)該為構(gòu)造函數(shù)中的第一條語句)
this(參數(shù)):調(diào)用本類中另一種形成的構(gòu)造函數(shù)(應(yīng)該為構(gòu)造函數(shù)中的第一條語句)
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來指明成員變量名)
調(diào)用super()必須寫在子類構(gòu)造方法的第一行,否則編譯不通過。每個(gè)子類構(gòu)造方法的第一條語句,都是隱含地調(diào)用super(),如果父類沒有這種形式的構(gòu)造函數(shù),那么在編譯的時(shí)候就會報(bào)錯(cuò)。
super()和this()類似,區(qū)別是,super()從子類中調(diào)用父類的構(gòu)造方法,this()在同一類內(nèi)調(diào)用其它方法。
super()和this()均需放在構(gòu)造方法內(nèi)第一行。
盡管可以用this調(diào)用一個(gè)構(gòu)造器,但卻不能調(diào)用兩個(gè)。
this和super不能同時(shí)出現(xiàn)在一個(gè)構(gòu)造函數(shù)里面,因?yàn)閠his必然會調(diào)用其它的構(gòu)造函數(shù),其它的構(gòu)造函數(shù)必然也會有super語句的存在,所以在同一個(gè)構(gòu)造函數(shù)里面有相同的語句,就失去了語句的意義,編譯器也不會通過。
this()和super()都指的是對象,所以,均不可以在static環(huán)境中使用。包括:static變量,static方法,static語句塊。
從本質(zhì)上講,this是一個(gè)指向本對象的指針, 然而super是一個(gè)Java關(guān)鍵字。
原文鏈接:http://blog.csdn.net/qq_28000627/article/details/58770051