作者:熔岩
日期:2007-03-01
MSN :[email protected]
好久沒有對所學知識做總結了,發現好多都生疏了,為了鞏固基礎,對就知識做一個系統的總結,如有不完善或不正确的地方,還請各位廣開言論,共同進步!
Java關鍵字this、super使用總結
一、this
Java關鍵字this隻能用于方法方法體内。當一個對象建立後,Java虛拟機(JVM)就會給這個對象配置設定一個引用自身的指針,這個指針的名字就是this。是以,this隻能在類中的非靜态方法中使用,靜态方法和靜态的代碼塊中絕對不能出現this,這在“Java關鍵字static、final使用總結”一文中給出了明确解釋。并且this隻和特定的對象關聯,而不和類關聯,同一個類的不同對象有不同的this。下面給出一個使用this的綜合執行個體,以便說明問題:
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; // 這個還可以寫為: this.number=n;
}
public Test6(int i, String username, String password) {
// 成員變量和參數同名,成員變量被屏蔽,用"this.成員變量"的方式通路成員變量.
this.username = username;
this.password = password;
// 預設不帶參數的構造方法
public Test6() {
this(0, "未知", "空"); // 通過this調用另一個構造方法
public Test6(String name) {
this(1, name, "空"); // 通過this調用另一個構造方法
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(); // 這個可以寫為: this.f();
private void f() {
// 局部變量與成員變量同名,成員變量被屏蔽,用"this.成員變量"的方式通路成員變量.
int x;
x = this.x++;
System.out.println(x);
System.out.println(this.x);
//傳回目前執行個體的引用
private Test6 getSelf() {
return this;
}
運作結果如下:
-----------
未知
空
100
101
遊客
看着上面的例子,說明在什麼情況下需要用到this:
第一、通過this調用另一個構造方法,用發是this(參數清單),這個僅僅在類的構造方法中,别的地方不能這麼用。
第二、函數參數或者函數中的局部變量和成員變量同名的情況下,成員變量被屏蔽,此時要通路成員變量則需要用“this.成員變量名”的方式來引用成員變量。當然,在沒有同名的情況下,可以直接用成員變量的名字,而不用this,用了也不為錯,呵呵。
第三、在函數中,需要引用該函所屬類的目前對象時候,直接用this。
其實這些用法總結都是從對“this是指向對象本身的一個指針”這句話的更深入的了解而來的,死記不然容易忘記而且容易搞錯,要了解!
二、super
super關鍵和this作用類似,是被屏蔽的成員變量或者成員方法或變為可見,或者說用來引用被屏蔽的成員變量和成員成員方法。
不過super是用在子類中,目的是通路直接父類中被屏蔽的成員,注意是直接父類(就是類之上最近的超類)。下面是一個綜合運用super的例子,有兩個類:一個Father類,一個Father類的子類Son,通過這兩個類完全示範了super的用法,一下是代碼:
public class Father {
public String v="Father";
public String x="輸出了Father類的public成員變量x!!!";
public Father() {
System.out.println("Father構造方法被調用!");
public Father(String v){
this.v="Father類的帶參數構造方法!運作了.";
public void outinfo(){
System.out.println("Father的outinfo方法被調用");
}
public static void main(String[] args) {
// TODO 自動生成方法存根
public class Son extends Father{
public String v="Son";
public Son() {
super(); //調用超類的構造方法,隻能放到第一行.
System.out.println("Son無參數構造方法被調用!");
//super(); //錯誤的,必須放到構造方法體的最前面.
public Son(String str){
super(str);
System.out.println("Son帶參數構造方法被調用!");
//覆寫了超類成員方法outinfo()
public void outinfo(){
System.out.println("Son的outinfo()方法被調用");
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(); //調用子類的outinfo()方法
this.outinfo(); //調用子類的outinfo()方法
super.outinfo(); //調用父類的outinfo()方法
new Son().test();
子類Son運作結果:
Father構造方法被調用!
Son無參數構造方法被調用!
------1-----
哈哈哈哈!
Son
Father
------2-----
輸出了Father類的public成員變量x!!!
------3-----
Son的outinfo()方法被調用
Father的outinfo方法被調用
說明:次例子僅僅為了說明super的用法,實際在設計類的時候一般都盡可能私有(private)化。
通過上面的例子,下面總結一下super的用法:
第一、在子類構造方法中要調用父類的構造方法,用“super(參數清單)”的方式調用,參數不是必須的。同時還要注意的一點是:“super(參數清單)”這條語句隻能用在子類構造方法體中的第一行。
第二、當子類方法中的局部變量或者子類的成員變量與父類成員變量同名時,也就是子類局部變量覆寫父類成員變量時,用“super.成員變量名”來引用父類成員變量。當然,如果父類的成員變量沒有被覆寫,也可以用“super.成員變量名”來引用父類成員變量,不過這是不必要的。
第三、當子類的成員方法覆寫了父類的成員方法時,也就是子類和父類有完全相同的方法定義(但方法體可以不同),此時,用“super.方法名(參數清單)”的方式通路父類的方法。
this、super的用法也不過這些,隻有了解了其中的原理,才不會跌入陷阱!
參考資料
Thinking in Java
Java2參考大全
還有什麼書都不記得了。
特别聲明:本文是作者憑着工作經驗和對曾經學習過書籍的了解來寫的,目的是對知識做一個總結,文中的例子都是當即寫的,如有雷同純屬巧合!