2016-09-16 82 views
1

我是新來的java。最近我看到一些代碼,這是類同的:當訪問繼承成員時,「this」和「super」之間的區別

class A { 
    protected int myInt; 

    public static void main(String[] args) { 
     B b = new B(); 
     b.myFunction(); 
    } 
} 

class B extends A { 
    public void myFunction() { 
     this.myInt = 10; 
    } 
} 

據我所知,創建一個子類的實例時,其父的一個實例被創建爲好。基類的所有受保護和公共成員都可以從子類訪問。 如果我覆蓋myInt,將會有this.myIntsuper.myInt之間的差異,因爲每個類將有它自己的myInt(B將有權訪問兩者)。

所以,我的問題是:如果我不覆蓋myInt,哪種形式更可取,this.myIntsuper.myInt

+0

您不覆蓋字段。而'B'也是'A',但只有一個實例被創建 - 不是兩個。 –

+2

可能的重複http://stackoverflow.com/questions/4023344/difference-between-this-andsuper-keywords-in-java –

+0

通過@ElliottFrisch澄清評論:如果您還在'B'中聲明'myInt',不要重寫*字段,你在* A中隱藏*同名字段。請參閱[Java™教程 - 隱藏字段](https://docs.oracle.com/javase/tutorial/java/IandI/hidevariables.html)。 – Andreas

回答

1

這是一個品味和項目的標準/準則,而不是別的。

就我個人而言,我也不會使用,只會寫myInt = 10

+1

感謝您將您的第二段定性爲您的*意見*。 +1 – Andreas

2

您只需要使用thissuper,當需要指定您使用/指向哪個範圍時。就你而言,我寧願省略this以簡化可讀性。

super用於表示父類的當前實例,而this用於表示當前類。如果某個變量或方法與廣泛範圍內的某個變量或方法重疊(具有相同的名稱),則只需使用this或super。

例如。如果您已經定義了一個名稱與class屬性相同的方法參數,則需要使用它來表示您正在使用class屬性而不是方法參數。

public class A { 

    public int myInt = 1; 

    public static void main(String[] args) { 
     B b = new B(); 
     b.myFunction(3); 
    } 
} 

class B extends A { 

    public int myInt = 2; 

    public void myFunction(int myInt){ 

     System.out.println(myInt); // The parameter 
     System.out.println(this.myInt); // myInt from the current class (B) 
     System.out.println(super.myInt); // myInt from the parent class (A) 
    } 
} 

這個例子會打印:

3 
2 
1 

如果你不具備這種collission的,使用這是可選的:創建

public void myFunction2(){ 
    System.out.println(myInt);  // Both refers to the same 
    System.out.println(this.myInt); // variable myInt from class B 
} 
+1

*意見:*在這種情況下,我寧願使用'super。'來記錄被引用的繼承字段。同樣,我寧願在非繼承字段上使用'this.'來記錄一​​個字段被引用,而不是變量/參數。這是一個代碼風格的決定,它將代碼澄清爲隨便讀者,我發現它比「簡單」,不太清晰的代碼更好。 – Andreas

0

只有一個實例。如果實例化派生對象,父構造函數被調用,但只創建一個對象。另外,當在一個類中引用具有相同名稱的不同變量時,更多地使用術語this。 例如一個簡單的構造:

class SupClass{ 
    public int a = 1; 
    int incA(){ 
     return ++a; 
    } 
} 
class MyClass extends SupClass { 
    public int a = 10; 
    public int b = 20; 
    MyClass() {}; 
    MyClass(int a, int b){ 
     this.a = a; 
     this.b = b; 
    } 

    int incA(){ 
     return ++a; 
    } 
    public static void main(String args[]) 
    { 
     SupClass d = new MyClass(); 
     System.out.println(d.a); //1, members known of type SupClass at compile-time, 
     System.out.println(d.incA()); //11, methods are virtual, decided at run-time 
    } 
} 

當你要明確地使用在超類值只使用super方法。要回答你的問題,只有方法可以被覆蓋,成員變量不能。

相關問題