5

簡単な質問。Tester2という別のクラスを拡張するTester1というクラスを作成しました。Tester2には、「ABC」というパブリック文字列が含まれています。

これがTester1です。

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

代わりに5行目を

super.ABC = "Hello"; 

私はまだまったく同じことをしていますか?

4

4 に答える 4

8

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

ABC内で変数を宣言した場合も違いTester1があります。のフィールドはのフィールドを非表示にしますが、を使用すると、内のフィールドを参照することになります。ただし、そうしないでください。変数を非表示にすることは、コードを保守不可能にするための非常に迅速な方法です。Tester1Tester2superTester2

サンプルコード:

// 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
    }
}
于 2011-07-29T23:07:27.520 に答える
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
    }
}
于 2011-07-29T23:12:41.657 に答える
1

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

于 2011-07-29T23:07:05.913 に答える
1

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

一方、ABCが親クラスでプライベートとしてマークされている場合、superが使用されている場合でも(もちろん、派手なリフレクションを使用せずに)、子クラスからその変数にアクセスする方法はありません。

もう1つの注意点は、変数が親クラスでプライベートに定義されている場合、子クラスでまったく同じ名前の変数を定義できることです。しかし、繰り返しになりますが、superは親変数へのアクセスを許可しません。

于 2011-07-29T23:11:15.413 に答える