java中關(guān)鍵字 this 和super的作用及用法
來源:新能源網(wǎng)
時(shí)間:2024-08-17 13:16:22
熱度:
java中關(guān)鍵字 this 和super的作用及用法【專家解說】:Java關(guān)鍵字this、super使用總結(jié) 一、this Java關(guān)鍵字this只能用于方法方法體內(nèi)
【專家解說】:Java關(guān)鍵字this、super使用總結(jié)
一、this
Java關(guān)鍵字this只能用于方法方法體內(nèi)。當(dāng)一個(gè)對象創(chuàng)建后,Java虛擬機(jī)(JVM)就會(huì)給這個(gè)對象分配一個(gè)引用自身的指針,這個(gè)指針的名字就是this。因此,this只能在類中的非靜態(tài)方法中使用,靜態(tài)方法和靜態(tài)的代碼塊中絕對不能出現(xiàn)this,這在“Java關(guān)鍵字static、final使用總結(jié)”一文中給出了明確解釋。并且this只和特定的對象關(guān)聯(lián),而不和類關(guān)聯(lián),同一個(gè)類的不同對象有不同的this。下面給出一個(gè)使用this的綜合實(shí)例,以便說明問題:
package org.leizhimin;
public class Test6 {
private int number;
private String username;
private String password;
private int x = 100;
public Test6(int n) {
number = n; // 這個(gè)還可以寫為: this.number=n;
}
public Test6(int i, String username, String password) {
// 成員變量和參數(shù)同名,成員變量被屏蔽,用"this.成員變量"的方式訪問成員變量.
this.username = username;
this.password = password;
}
// 默認(rèn)不帶參數(shù)的構(gòu)造方法
public Test6() {
this(0, "未知", "空"); // 通過this調(diào)用另一個(gè)構(gòu)造方法
}
public Test6(String name) {
this(1, name, "空"); // 通過this調(diào)用另一個(gè)構(gòu)造方法
}
public static void main(String args[]) {
Test6 t1 = new Test6();
Test6 t2 = new Test6("游客");
t1.outinfo(t1);
t2.outinfo(t2);
}
private void outinfo(Test6 t) {
System.out.println("-----------");
System.out.println(t.number);
System.out.println(t.username);
System.out.println(t.password);
f(); // 這個(gè)可以寫為: this.f();
}
private void f() {
// 局部變量與成員變量同名,成員變量被屏蔽,用"this.成員變量"的方式訪問成員變量.
int x;
x = this.x++;
System.out.println(x);
System.out.println(this.x);
}
//返回當(dāng)前實(shí)例的引用
private Test6 getSelf() {
return this;
}
}
運(yùn)行結(jié)果如下:
-----------
0
未知
空
100
101
-----------
0
游客
空
100
101
通過上面的例子,說明在什么情況下需要用到this:
第一、通過this調(diào)用另一個(gè)構(gòu)造方法,用發(fā)是this(參數(shù)列表),這個(gè)僅僅在類的構(gòu)造方法中,別的地方不能這么用。
第二、函數(shù)參數(shù)或者函數(shù)中的局部變量和成員變量同名的情況下,成員變量被屏蔽,此時(shí)要訪問成員變量則需要用“this.成員變量名”的方式來引用成員變量。當(dāng)然,在沒有同名的情況下,可以直接用成員變量的名字,而不用this,用了也不為錯(cuò),呵呵。
第三、在函數(shù)中,需要引用該函所屬類的當(dāng)前對象時(shí)候,直接用this。
其實(shí)這些用法總結(jié)都是從對“this是指向?qū)ο蟊旧淼囊粋€(gè)指針”這句話的更深入的理解而來的,死記不然容易忘記而且容易搞錯(cuò),要理解!
二、super
super關(guān)鍵和this作用類似,是被屏蔽的成員變量或者成員方法或變?yōu)榭梢姡蛘哒f用來引用被屏蔽的成員變量和成員成員方法。
不過super是用在子類中,目的是訪問直接父類中被屏蔽的成員,注意是直接父類(就是類之上最近的超類)。下面是一個(gè)綜合運(yùn)用super的例子,有兩個(gè)類:一個(gè)Father類,一個(gè)Father類的子類Son,通過這兩個(gè)類完全演示了super的用法,一下是代碼:
package org.leizhimin;
public class Father {
public String v="Father";
public String x="輸出了Father類的public成員變量x!!!";
public Father() {
System.out.println("Father構(gòu)造方法被調(diào)用!");
}
public Father(String v){
this.v="Father類的帶參數(shù)構(gòu)造方法!運(yùn)行了.";
}
public void outinfo(){
System.out.println("Father的outinfo方法被調(diào)用");
}
public static void main(String[] args) {
// TODO 自動(dòng)生成方法存根
}
}
package org.leizhimin;
public class Son extends Father{
public String v="Son";
public Son() {
super(); //調(diào)用超類的構(gòu)造方法,只能放到第一行.
System.out.println("Son無參數(shù)構(gòu)造方法被調(diào)用!");
//super(); //錯(cuò)誤的,必須放到構(gòu)造方法體的最前面.
}
public Son(String str){
super(str);
System.out.println("Son帶參數(shù)構(gòu)造方法被調(diào)用!");
}
//覆蓋了超類成員方法outinfo()
public void outinfo(){
System.out.println("Son的outinfo()方法被調(diào)用");
}
public void test(){
String v="哈哈哈哈!"; //局部變量v覆蓋了成員變量v和超類變量v
System.out.println("------1-----");
System.out.println(v); //輸出局部變量v
System.out.println(this.v); //輸出(子類)成員變量v
System.out.println(super.v); //輸出超類成員變量v
System.out.println("------2-----");
System.out.println(x); //輸出超類成員變量v,子類繼承而來
System.out.println(super.x); //輸出超類成員變量v
System.out.println("------3-----");
outinfo(); //調(diào)用子類的outinfo()方法
this.outinfo(); //調(diào)用子類的outinfo()方法
super.outinfo(); //調(diào)用父類的outinfo()方法
}
public static void main(String[] args) {
new Son().test();
}
}
子類Son運(yùn)行結(jié)果:
Father構(gòu)造方法被調(diào)用!
Son無參數(shù)構(gòu)造方法被調(diào)用!
------1-----
哈哈哈哈!
Son
Father
------2-----
輸出了Father類的public成員變量x!!!
輸出了Father類的public成員變量x!!!
------3-----
Son的outinfo()方法被調(diào)用
Son的outinfo()方法被調(diào)用
Father的outinfo方法被調(diào)用
說明:次例子僅僅為了說明super的用法,實(shí)際在設(shè)計(jì)類的時(shí)候一般都盡可能私有(private)化。
通過上面的例子,下面總結(jié)一下super的用法:
第一、在子類構(gòu)造方法中要調(diào)用父類的構(gòu)造方法,用“super(參數(shù)列表)”的方式調(diào)用,參數(shù)不是必須的。同時(shí)還要注意的一點(diǎn)是:“super(參數(shù)列表)”這條語句只能用在子類構(gòu)造方法體中的第一行。
第二、當(dāng)子類方法中的局部變量或者子類的成員變量與父類成員變量同名時(shí),也就是子類局部變量覆蓋父類成員變量時(shí),用“super.成員變量名”來引用父類成員變量。當(dāng)然,如果父類的成員變量沒有被覆蓋,也可以用“super.成員變量名”來引用父類成員變量,不過這是不必要的。
第三、當(dāng)子類的成員方法覆蓋了父類的成員方法時(shí),也就是子類和父類有完全相同的方法定義(但方法體可以不同),此時(shí),用“super.方法名(參數(shù)列表)”的方式訪問父類的方法。
一、this
Java關(guān)鍵字this只能用于方法方法體內(nèi)。當(dāng)一個(gè)對象創(chuàng)建后,Java虛擬機(jī)(JVM)就會(huì)給這個(gè)對象分配一個(gè)引用自身的指針,這個(gè)指針的名字就是this。因此,this只能在類中的非靜態(tài)方法中使用,靜態(tài)方法和靜態(tài)的代碼塊中絕對不能出現(xiàn)this,這在“Java關(guān)鍵字static、final使用總結(jié)”一文中給出了明確解釋。并且this只和特定的對象關(guān)聯(lián),而不和類關(guān)聯(lián),同一個(gè)類的不同對象有不同的this。下面給出一個(gè)使用this的綜合實(shí)例,以便說明問題:
package org.leizhimin;
public class Test6 {
private int number;
private String username;
private String password;
private int x = 100;
public Test6(int n) {
number = n; // 這個(gè)還可以寫為: this.number=n;
}
public Test6(int i, String username, String password) {
// 成員變量和參數(shù)同名,成員變量被屏蔽,用"this.成員變量"的方式訪問成員變量.
this.username = username;
this.password = password;
}
// 默認(rèn)不帶參數(shù)的構(gòu)造方法
public Test6() {
this(0, "未知", "空"); // 通過this調(diào)用另一個(gè)構(gòu)造方法
}
public Test6(String name) {
this(1, name, "空"); // 通過this調(diào)用另一個(gè)構(gòu)造方法
}
public static void main(String args[]) {
Test6 t1 = new Test6();
Test6 t2 = new Test6("游客");
t1.outinfo(t1);
t2.outinfo(t2);
}
private void outinfo(Test6 t) {
System.out.println("-----------");
System.out.println(t.number);
System.out.println(t.username);
System.out.println(t.password);
f(); // 這個(gè)可以寫為: this.f();
}
private void f() {
// 局部變量與成員變量同名,成員變量被屏蔽,用"this.成員變量"的方式訪問成員變量.
int x;
x = this.x++;
System.out.println(x);
System.out.println(this.x);
}
//返回當(dāng)前實(shí)例的引用
private Test6 getSelf() {
return this;
}
}
運(yùn)行結(jié)果如下:
-----------
0
未知
空
100
101
-----------
0
游客
空
100
101
通過上面的例子,說明在什么情況下需要用到this:
第一、通過this調(diào)用另一個(gè)構(gòu)造方法,用發(fā)是this(參數(shù)列表),這個(gè)僅僅在類的構(gòu)造方法中,別的地方不能這么用。
第二、函數(shù)參數(shù)或者函數(shù)中的局部變量和成員變量同名的情況下,成員變量被屏蔽,此時(shí)要訪問成員變量則需要用“this.成員變量名”的方式來引用成員變量。當(dāng)然,在沒有同名的情況下,可以直接用成員變量的名字,而不用this,用了也不為錯(cuò),呵呵。
第三、在函數(shù)中,需要引用該函所屬類的當(dāng)前對象時(shí)候,直接用this。
其實(shí)這些用法總結(jié)都是從對“this是指向?qū)ο蟊旧淼囊粋€(gè)指針”這句話的更深入的理解而來的,死記不然容易忘記而且容易搞錯(cuò),要理解!
二、super
super關(guān)鍵和this作用類似,是被屏蔽的成員變量或者成員方法或變?yōu)榭梢姡蛘哒f用來引用被屏蔽的成員變量和成員成員方法。
不過super是用在子類中,目的是訪問直接父類中被屏蔽的成員,注意是直接父類(就是類之上最近的超類)。下面是一個(gè)綜合運(yùn)用super的例子,有兩個(gè)類:一個(gè)Father類,一個(gè)Father類的子類Son,通過這兩個(gè)類完全演示了super的用法,一下是代碼:
package org.leizhimin;
public class Father {
public String v="Father";
public String x="輸出了Father類的public成員變量x!!!";
public Father() {
System.out.println("Father構(gòu)造方法被調(diào)用!");
}
public Father(String v){
this.v="Father類的帶參數(shù)構(gòu)造方法!運(yùn)行了.";
}
public void outinfo(){
System.out.println("Father的outinfo方法被調(diào)用");
}
public static void main(String[] args) {
// TODO 自動(dòng)生成方法存根
}
}
package org.leizhimin;
public class Son extends Father{
public String v="Son";
public Son() {
super(); //調(diào)用超類的構(gòu)造方法,只能放到第一行.
System.out.println("Son無參數(shù)構(gòu)造方法被調(diào)用!");
//super(); //錯(cuò)誤的,必須放到構(gòu)造方法體的最前面.
}
public Son(String str){
super(str);
System.out.println("Son帶參數(shù)構(gòu)造方法被調(diào)用!");
}
//覆蓋了超類成員方法outinfo()
public void outinfo(){
System.out.println("Son的outinfo()方法被調(diào)用");
}
public void test(){
String v="哈哈哈哈!"; //局部變量v覆蓋了成員變量v和超類變量v
System.out.println("------1-----");
System.out.println(v); //輸出局部變量v
System.out.println(this.v); //輸出(子類)成員變量v
System.out.println(super.v); //輸出超類成員變量v
System.out.println("------2-----");
System.out.println(x); //輸出超類成員變量v,子類繼承而來
System.out.println(super.x); //輸出超類成員變量v
System.out.println("------3-----");
outinfo(); //調(diào)用子類的outinfo()方法
this.outinfo(); //調(diào)用子類的outinfo()方法
super.outinfo(); //調(diào)用父類的outinfo()方法
}
public static void main(String[] args) {
new Son().test();
}
}
子類Son運(yùn)行結(jié)果:
Father構(gòu)造方法被調(diào)用!
Son無參數(shù)構(gòu)造方法被調(diào)用!
------1-----
哈哈哈哈!
Son
Father
------2-----
輸出了Father類的public成員變量x!!!
輸出了Father類的public成員變量x!!!
------3-----
Son的outinfo()方法被調(diào)用
Son的outinfo()方法被調(diào)用
Father的outinfo方法被調(diào)用
說明:次例子僅僅為了說明super的用法,實(shí)際在設(shè)計(jì)類的時(shí)候一般都盡可能私有(private)化。
通過上面的例子,下面總結(jié)一下super的用法:
第一、在子類構(gòu)造方法中要調(diào)用父類的構(gòu)造方法,用“super(參數(shù)列表)”的方式調(diào)用,參數(shù)不是必須的。同時(shí)還要注意的一點(diǎn)是:“super(參數(shù)列表)”這條語句只能用在子類構(gòu)造方法體中的第一行。
第二、當(dāng)子類方法中的局部變量或者子類的成員變量與父類成員變量同名時(shí),也就是子類局部變量覆蓋父類成員變量時(shí),用“super.成員變量名”來引用父類成員變量。當(dāng)然,如果父類的成員變量沒有被覆蓋,也可以用“super.成員變量名”來引用父類成員變量,不過這是不必要的。
第三、當(dāng)子類的成員方法覆蓋了父類的成員方法時(shí),也就是子類和父類有完全相同的方法定義(但方法體可以不同),此時(shí),用“super.方法名(參數(shù)列表)”的方式訪問父類的方法。
上一篇:電動(dòng)車上不了牌照
-
“綠色、環(huán)保、低碳”是當(dāng)今世界的關(guān)鍵詞,“低碳”要求我...2024-08-17
-
【關(guān)鍵詞】:磁性材料、順磁性、抗磁性、磁疇、鐵磁性、反鐵磁性、亞鐵磁性、永磁材料2024-08-17
-
【關(guān)鍵詞】:磁性材料、順磁性、抗磁性、磁疇、鐵磁性、反鐵磁性、亞鐵磁性、永磁材料2024-08-17
-
【關(guān)鍵詞】:磁性材料、順磁性、抗磁性、磁疇、鐵磁性、反鐵磁性、亞鐵磁性、永磁材料2024-08-17
-
【關(guān)鍵詞】:磁性材料、順磁性、抗磁性、磁疇、鐵磁性、反鐵磁性、亞鐵磁性、永磁材料2024-08-17
-
【關(guān)鍵詞】:磁性材料、順磁性、抗磁性、磁疇、鐵磁性、反鐵磁性、亞鐵磁性、永磁材料2024-08-17
-
工裝-工服-職業(yè)裝-制服怎么搜索這幾個(gè)關(guān)鍵詞,就能搜出朗杰瑞服裝公司呢?2024-08-17
-
朗杰瑞制服 北京制服 北京職業(yè)裝 工服 工裝?我選哪個(gè)關(guān)鍵詞好呢?2024-08-17
-
評析中國改革開放30年的經(jīng)驗(yàn)與教訓(xùn)的論文 要求3000字左右,有摘要,有關(guān)鍵詞2024-08-17
-
“綠色、環(huán)保、低碳”是當(dāng)今世界的關(guān)鍵詞,“低碳”要求我們節(jié)約及高效利用能源.關(guān)于能源與能量,下列說2024-08-17
-
Invoke delegate thread 三個(gè)關(guān)鍵字的用法2024-08-17
-
流量精靈刷關(guān)鍵字會(huì)有什么結(jié)果2024-08-17
-
天津網(wǎng)站關(guān)鍵詞優(yōu)化?2024-08-17
-
如何確定一個(gè)網(wǎng)站的關(guān)鍵詞,比如說韓都衣舍2024-08-17
-
晶振關(guān)鍵詞排名如何提高?2024-08-17