1

スーパークラス「Sam」とサブクラス「SubSam」があります

 public class Sam {

String msg;
String msg1;

Sam(String mm, String mm1) {
    msg = mm;
    msg1 = mm1;
}

@Override
public String toString() {
    return this.msg + "  " + this.msg1;
    }
}

class SubSam extends Sam {

String msg1="C";

public static void main(String[] args) throws Exception {
    SubSam obj = new SubSam();
    System.out.println(obj);
}

SubSam() {
    super("A", "B");
}
}

出力は次のとおりです。

A  B

「toString()」が「SubSam」ではなく「Sam」のインスタンス フィールドを参照している理由。出力は次のようになります: AC

ずいぶん前から考えているのですが、できませんか?

4

3 に答える 3

4

Java のインスタンス変数はオーバーライドされないためです。サブクラスは、そのスーパークラスの 1 つで定義されたものと同じ名前の変数を定義できますが、すべての意図と目的に対して別の変数としてカウントされます。

たとえば、次のコードを考えてみましょう。

public class A {
    public String var;
}

public class B extends A {
    public int var;
}

これらの定義を考えると、 のインスタンスにBは 2 つの変数があり、1 つは typeStringで、もう 1 つは typeintですが、両方とも という名前になりますvar。これらは、個別に割り当てて読み取ることができる別個の変数であり、Java はこれに問題があるとは見なしません。

必要に応じて動作をオーバーライドする場合は、代わりにメソッドを使用する必要があります。たとえば、次のようにできます。

public class A {
    public String msg;
    private String msg1;

    public A(String mm, String mm1) {
        this.msg  = mm;
        this.msg1 = mm1;
    }

    public String msg1() {
        return(this.msg1);
    }

    @Override
    public String toString() {
        return(this.msg + " " + msg1());
    }
}

public class B extends A {
    public B() {
        super("A", "B");
    }

    @Override
    public String msg1() {
        return("C");
    }
}

ここで、 を呼び出すとSystem.out.println(new B());、 が出力されますA C

于 2012-12-09T18:34:48.590 に答える
1

toString をオーバーライドしていないため、スーパークラスの toString メソッドが呼び出されます。サブクラスではなく、スーパークラスの msg と msg1 を出力します。

于 2012-12-09T18:36:11.690 に答える
0

msg1サブクラスでを設定していますが、そのコンストラクターで渡しています

super("A","B");

この時点で、メイン クラスのコンストラクターで初期化されている変数は、メソッドのキーワードをsuper使用して使用されているメイン クラスの変数です。thistoString

于 2012-12-09T18:39:34.767 に答える