1

次のJavaコードでは

public class Person {
    int age = 18;
}

class Student extends Person {
    public Student() {
        this.age = 22;
    }

    public static void main(String[] args) {
        Student student = new Student();
        student.doSomthing();
    }

    void doSomthing() {
        System.out.println(this.age);
        System.out.println(super.age);// Here is something weird, at least for me till rightNow()
    }
}  

super.ageの値が22で、サブクラスの年齢の値と同じである理由は、18であるはずではありません。
どんな助けでも大歓迎です。
前もって感謝します。

4

8 に答える 8

7

年齢はスーパークラスのフィールドです。サブクラスのコンストラクタで this.age = 22 と言うと、スーパークラスのインスタンス変数を更新しています。

次のことを試してみてください...手元にコンパイラがありませんが、期待どおりの結果が得られると思います。

public class Person {
    int age = 18;
}

class Student extends Person {

    int age; // Hides the super variable

    public Student() {
        this.age = 22;
    }

    public static void main(String[] args) {
        Student student = new Student();
        student.doSomthing();
    }

    void doSomthing() {
        System.out.println(this.age);
        System.out.println(super.age);
    }
}  
于 2011-06-16T23:14:29.360 に答える
4

これは期待どおりに動作しています。Student の「age」メンバーを宣言していないため、当然、this.age はスーパークラスで定義された「age」を参照します。

以下のコードは、期待どおりの動作を提供します (ただし、そのような変数をシャドーイングすることは、多くの場合、非常に悪い考えです)。

public static class Person {
    int age = 18;
}

public static class Student extends Person {
    int age = 18;

    public Student() {
        this.age = 22;
    }

    void doSomthing() {
        System.out.println(this.age);
        System.out.println(super.age);
    }
}
于 2011-06-16T23:13:58.180 に答える
2

いいえ、その通りです。コンストラクターでは、スーパークラスの年齢をオーバーライドしています。代わりに、次のようなことを行うことができます。

public class Person {
    public int getAge() {
        return 18;
    }
}

class Student extends Person {
    public Student() {
    }

    @Override
    public int getAge() {
        return 22;
    }

    public static void main(String[] args) {
        Student student = new Student();
        student.doSomthing();
    }

    void doSomthing() {
        System.out.println(this.getAge()); //22
        System.out.println(super.getAge()); //18
    }
}  
于 2011-06-16T23:14:46.073 に答える
1

生徒は親から年齢を継承するため、年齢とsuper.ageに違いはありません

于 2011-06-16T23:11:27.840 に答える
1

いいえ、起こっていることは正しいです。サブクラス(StudentはPersonのサブクラス)を作成すると、そのサブクラスはスーパークラスからすべてのフィールド(変数)を継承します。ただし、変数のセットは1つだけです。継承されている場合でも、ageの値は1つだけです。つまり、クラスがフィールドを継承する場合、そのフィールドの新しいコピーは作成されません。生徒ごとに1つのコピーしかありません。

于 2011-06-16T23:11:29.507 に答える
1

このソースでは、thissuperは、サブクラスで継承されたスーパー クラスで定義するため、同じインスタンス変数です。

Student を作成するときは、それを 22 に初期化します。それだけです。

于 2011-06-16T23:12:01.077 に答える
1

何もおかしくなく、正しく動作しています。クラスには、親変数を上書きStudentするプライベート変数がありません。age

于 2011-06-16T23:14:08.590 に答える
0

クラスで設定ageしていますStudentが、親が宣言ageしていて、同じ変数を共有しているため、値が変更されたことは理にかなっています。ただし、オーバーライドされたメソッドは異なります。

于 2011-06-16T23:13:36.217 に答える