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 ,与子类的 age 值相同,不应该是 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 的“年龄”成员,因此 this.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 的子类)时,该子类会继承超类的所有字段(变量)。但是,只有一组变量:年龄只有一个值,即使它是继承的。换句话说,当一个类继承一个字段时,它不会创建它的新副本——每个学生只有一个副本。

于 2011-06-16T23:11:29.507 回答
1

在这个源码中,thissuper都是同一个实例变量,因为你在超类中定义它一个继承在子类中。

当你创建你的学生时,你将它初始化为 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 回答