在編程語言里面每一個定義的方法里慕趴,都會有一個this關(guān)鍵字砸王,這個this關(guān)鍵不是由在那兒定義來決定的,而是由誰來執(zhí)行的決定的画株。這是判斷this關(guān)鍵。
比如說吃飯這個方法它是由上帝來定義的啦辐,世界上所有的人來執(zhí)行谓传。吃飯這個行為發(fā)生的時候,主體就是在吃飯的這個人芹关,也就是要有人執(zhí)行吃飯這個行為续挟。 有時候我們需要在一個行為(方法)里,能明確知道這個行為是誰來執(zhí)行的侥衬,確切的說就是我要知道誰在吃飯诗祸。
在JAVA類中使用super來引用父類的成分,如果一個類從另外一個類繼承轴总,我們new這個子類的實例對象的時候咏花,這個子類對象里面會有一個父類對象。怎么去引用里面的父類對象呢壁顶?使用super來引用副砍,super是當前對象里面的父對象的引用。
二.知識點介紹
1漂佩、this
2脖含、Super
3罪塔、This/super區(qū)別
三.上課對應(yīng)視頻的說明文檔
1、this
this是自身的一個對象养葵,代表對象本身征堪,可以理解為:指向?qū)ο蟊旧淼囊粋€指針。
this的用法在java中大體可以分為3種:
(1)普通的直接引用
這種就不用講了关拒,this相當于是指向當前對象本身佃蚜。
代碼示例:
public class Hello {
String s = "Hello";
public Hello(String s1) {
System.out.println("s = " + s1);
//this當前對象,調(diào)用s屬性
System.out.println("1 -> this.s = " + this.s);
this.s = s1;//把參數(shù)值賦給成員變量着绊,成員變量的值改變
System.out.println("2 -> this.s = " + this.s);
}
public static void main(String[] args) {
Hello x = new Hello("HelloWorld!");
System.out.println("s=" + x.s);//驗證成員變量值的改變
}
}
運行結(jié)果:
s = HelloWorld!
1 -> this.s = Hello
2 -> this.s = HelloWorld!
s=HelloWorld!
(2)形參與成員名字重名谐算,用this來區(qū)分:
代碼示例:
class Person {
private int age = 10;
public Person(){
System.out.println("初始化年齡:"+age);
}
public int GetAge(int age){
this.age = age;
return this.age;
}
}
public class test1 {
public static void main(String[] args) {
Person Harry = new Person();
System.out.println("Harry's age is "+Harry.GetAge(12));
}
}? ? ? ?
(3)引用構(gòu)造函數(shù)
這個和super放在一起講,見下面归露。
(4)有時候洲脂,我們會用到一些內(nèi)部類和匿名類,如事件處理剧包。當在匿名類中用this時恐锦,這個this則指的是匿名類或內(nèi)部類本身。這時如果我們要使用外部類的方法和變量的話疆液,則應(yīng)該加上外部類的類名一铅。(此案例如果不明白,后面我們會有對應(yīng)的知識講解堕油,可忽視)
代碼示例:
public class HelloB {
int i = 1;
public HelloB() {
Thread thread = new Thread() {
public void run() {
for (int j=0;j<20;j++) {
HelloB.this.run();//調(diào)用外部類的方法
try {
sleep(1000);
} catch (InterruptedException ie) {
}
}
}
}; // 注意這里有分號
thread.start();
}
public void run() {
System.out.println("i = " + i);
i++;
}
public static void main(String[] args) throws Exception {
new HelloB();
}
}
(5)this同時傳遞多個參數(shù)
代碼示例:
public class TestClass {
int x;
int y;
static void showtest(TestClass tc) {//實例化對象
System.out.println(tc.x + " " + tc.y);
}
void seeit() {
showtest(this);
}
public static void main(String[] args) {
TestClass p = new TestClass();
p.x = 9;
p.y = 10;
p.seeit();
}
}
2潘飘、super
super可以理解為是指向自己超(父)類對象的一個指針,而這個超類指的是離自己最近的一個父類馍迄。
super也有三種用法:
(1)普通的直接引用
與this類似福也,super相當于是指向當前對象的父類,這樣就可以用super.xxx來引用父類的成員攀圈。
(2)子類中的成員變量或方法與父類中的成員變量或方法同名
代碼示例:
class Country {
String name;
void value() {
name = "China";
}
}
public 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值為默認值null犬辰。
(3)引用構(gòu)造函數(shù)
super(參數(shù)):調(diào)用父類中的某一個構(gòu)造函數(shù)(應(yīng)該為構(gòu)造函數(shù)中的第一條語句)嗦篱。
this(參數(shù)):調(diào)用本類中另一種形式的構(gòu)造函數(shù)(應(yīng)該為構(gòu)造函數(shù)中的第一條語句)。
代碼示例:
class Person {?
public static void prt(String s) {?
System.out.println(s);?
}?
Person() {?
prt("父類·無參數(shù)構(gòu)造方法: "+"A Person.");?
}//構(gòu)造方法(1)?
Person(String name) {?
prt("父類·含一個參數(shù)的構(gòu)造方法: "+"A person's name is " + name);?
}//構(gòu)造方法(2)?
}?
public class Chinese extends Person {?
Chinese() {?
super(); // 調(diào)用父類構(gòu)造方法(1)?
prt("子類·調(diào)用父類”無參數(shù)構(gòu)造方法“: "+"A chinese coder.");?
}?
Chinese(String name) {?
super(name);// 調(diào)用父類具有相同形參的構(gòu)造方法(2)?
prt("子類·調(diào)用父類”含一個參數(shù)的構(gòu)造方法“: "+"his name is " + name);?
}?
Chinese(String name, int age) {?
this(name);// 調(diào)用具有相同形參的構(gòu)造方法(3)?
prt("子類:調(diào)用子類具有相同形參的構(gòu)造方法:his age is " + age);?
}?
public static void main(String[] args) {?
Chinese cn = new Chinese();?
cn = new Chinese("codersai");?
cn = new Chinese("codersai", 18);?
}?
}
3幌缝、this/super區(qū)別
(1) super(參數(shù)):調(diào)用基類中的某一個構(gòu)造函數(shù)(應(yīng)該為構(gòu)造函數(shù)中的第一條語句)
(2) this(參數(shù)):調(diào)用本類中另一種形成的構(gòu)造函數(shù)(應(yīng)該為構(gòu)造函數(shù)中的第一條語句)
(3) super: 它引用當前對象的直接父類中的成員(用來訪問直接父類中被隱藏的父類中成員數(shù)據(jù)或函數(shù)灸促,基類與派生類中有相同成員定義時如:super.變量名? ? super.成員函數(shù)據(jù)名(實參)
(4) this:它代表當前對象名(在程序中易產(chǎn)生二義性之處,應(yīng)使用this來指明當前對象;如果函數(shù)的形參與類中的成員數(shù)據(jù)同名浴栽,這時需用this來指明成員變量名)
(5) 調(diào)用super()必須寫在子類構(gòu)造方法的第一行荒叼,否則編譯不通過。每個子類構(gòu)造方法的第一條語句典鸡,都是隱含地調(diào)用super()被廓,如果父類沒有這種形式的構(gòu)造函數(shù),那么在編譯的時候就會報錯萝玷。
(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òu)造器,但卻不能調(diào)用兩個汁尺。
(9) this和super不能同時出現(xiàn)在一個構(gòu)造函數(shù)里面法精,因為this必然會調(diào)用其它的構(gòu)造函數(shù),其它的構(gòu)造函數(shù)必然也會有super語句的存在痴突,所以在同一個構(gòu)造函數(shù)里面有相同的語句,就失去了語句的意義狼荞,編譯器也不會通過辽装。
(10) this()和super()都指的是對象,所以相味,均不可以在static環(huán)境中使用拾积。包括:static變量,static方法,static語句塊丰涉。
(11) 從本質(zhì)上講拓巧,this是一個指向本對象的指針, 然而super是一個Java關(guān)鍵字。