2011-07-29 20 views
5

簡単な質問。私はTester1と呼ばれるクラスを作りました。これはTester2という名前のクラスを拡張しています。 Tester2には「ABC」という名前のパブリック・ストリングが含まれています。ここでJava - 'super'キーワードを使用

がTester1です:

public class Tester1 extends Tester2 
{ 
    public Tester1() 
    { 
     ABC = "Hello"; 
    } 
} 

私が代わりに

super.ABC = "Hello"; 

に5行目を変更した場合、私はまだ正確に同じことをやっていますか?

+2

これは実際には良い質問です。 'super'がオーバーライドされたメソッドでどのように動作するかはかなりよく知られていますが、フィールドは異なります。 –

答えて

8

はい。オブジェクト内には1つのABC変数しかありません。しかし、まずフィールドを公開しないでください。フィールドはほとんど常にプライベートにする必要があります。

あなたは、同様Tester1を変数ABCを宣言した場合は、差があるだろう - Tester1内のフィールドはTester2フィールドを非表示にしますが、superを使用すると、あなたはまだフィールドを参照することだろうTester2内。しかし、そのようにしないでください。変数を隠すことは、コードをメンテナンスできないようにする本当に迅速な方法です。

サンプルコード:

// Please don't write code like this. It's horrible. 
class Super { 
    public int x; 
} 

class Sub extends Super { 
    public int x; 

    public Sub() { 
     x = 10; 
     super.x = 5; 
    } 

} 

public class Test { 
    public static void main(String[] args) { 
     Sub sub = new Sub(); 
     Super sup = sub; 
     System.out.println(sub.x); // Prints 10 
     System.out.println(sup.x); // Prints 5 
    } 
} 
+0

静的でない限り。営業担当者は、それが静的ではないと実際には言わなかったが、それはおそらくそうではないことを示した。 :) –

+0

@レイ:はい、私は静的ではないと仮定しています... –

+0

静的ではありません。素晴らしい例と説明! – WildBamaBoy

1

最初に、変数ABCをクラスTester2で宣言する必要があります。そうなら、そうです。

+0

私は、Tester1にスーパークラスABC変数をシャドーイングしているメンバ変数ABCがあった場合にのみ問題になると思います。 – Kevin

1

あなたがしています。 ABCがTester1(子クラス)に見えていることを考えると、ABCはプライベート以外の何ものでも宣言されているとみなされ、そのためサブクラスには可視です。この場合、super.ABCの使用は、変数が親で定義されているという事実を補強するだけです。

一方、ABCが親クラスでプライベートとマークされていた場合、スーパークラスが使用されていてもその変数にアクセスする方法はありません(もちろん、 。

注意しなければならないことは、変数が親クラスでprivateに定義されている場合、子クラスにまったく同じ名前の変数を定義できるということです。しかし、再びスーパーはあなたに親変数へのアクセスを許可しません。

2

はい、スーパー修飾子は不要ですが同じ動作をします。明確にする:

public static class Fruit { 

    protected String color; 
    protected static int count; 
} 

public static class Apple extends Fruit { 

    public Apple() { 
     color = "red"; 
     super.color = "red"; // Works the same 
     count++; 
     super.count++; // Works the same 
    } 
}