Java 在子类超级构造函数内调用父方法

Java 在子类超级构造函数内调用父方法,java,Java,我正在自学java,正在解决我的继承教科书中的一些问题。问题基本上是创建一个超类个人,并增加两个类学生和讲师,其中学生有一个专业,讲师有一份薪水 无论如何,到目前为止,这就是我所拥有的 public class Person { private String name; private String date; public Person(String name, String date) { this.name = name; t

我正在自学java,正在解决我的继承教科书中的一些问题。问题基本上是创建一个超类
个人
,并增加两个类
学生
讲师
,其中学生有一个专业,讲师有一份薪水

无论如何,到目前为止,这就是我所拥有的

public class Person {
    private String name;
    private String date;
    public Person(String name, String date)
    {
        this.name = name;
        this.date = date;
    }
    public String getName()
    {
        return name;
    }
    public String getDate()
    {
        return date;
    }
    public String toString()
    {
        return "The name of the person is :" + getName() + " And this person was born in " + getDate();
    }
}
Student.java

public class Student extends Person {

    private String major;

    public Student(String major)
    {
        super(super.getName(),super.getDate()); // ERROR
        this.major = major;
     }
}
我的思维过程

因为每个学生都有自己的名字和出生日期,所以当我调用超级构造函数时,我可以在我原来的超级类中传入返回
人名的方法。显然,正如你所知道的,这是行不通的,解决办法就是这样做

public Student(String name, String birthDate, String major)
{
           super(name,birthDate);
           this.major = major;
}
我原以为只要调用方法
.getName()
.getDate()
,就可以省去在构造函数
Student
中创建两个额外变量的麻烦,我将再次阅读本章,但我并不真正理解问题所在

TLDR 线路怎么了

super(super.getName(),super.getDate());

非常感谢

类就像是创建对象的蓝图

在您的例子中,有两个类,
Person
作为基类,然后是继承自
Person
Student

当您试图通过构造函数方法从
Student
类创建对象时,编译器将首先构建
Person
对象,但请注意,在此阶段,基类
Person
尚未构建,直到您调用
super()
构造函数

因此,当您说,我想使用我的“尚未构建基类(Person)”中的方法,因为编译器知道这不会起作用,因为父对象(可以从
super
关键字访问)在
super()
返回(完成运行)之前还不存在。因此,在生成父类之前执行父类。
getName()
方法无效

正如许多其他人所说,即使您能够使用
super.getName()
方法,它也不会有任何值,因为它没有设置默认值


希望这有帮助,很高兴进一步讨论。

您不能在构造函数中引用super的方法。超级对象在运行子类的构造函数时为空。

假设您可以执行
super(super.getName(),super.getDate())
,哪些值实际上会传递给超级构造函数(在
Person
中)?因为每个
Person
都有一个名字和出生日期,这些值不会作为学生的基本信息传递吗?从那里,我可以有一些方法来操纵学生的
专业
,他们有名字和生日了吗?让我们以您当前的示例为例,
getName()
返回什么?您可能想调用
newstudent(“Engineering”)
。它将有什么名称?超级构造函数分配变量。
getXXX()
方法返回变量。在
super()
设置变量之前获取变量是没有意义的。它既不会“死”也不会“失败”。但是,它可能会为超类中的变量提供意外的值。@EJP给您垃圾值是不正确的,因为编译器首先不会编译。这不是C++。我已经用Java8验证了我的事实。试试看。我想我现在明白了,
学生
不知道
姓名
出生日期
是什么,但这就是我的代码出错的原因吗?或者,正如你在回答中所说的,在调用
super()
之前,还没有构建任何东西???@SamuelToh“给你一个垃圾值”既不是死亡,也不是失败。程序正在按编写的方式运行。这不是C++的事实,OK C++与否并不重要,因为我引用一个例子,如果你在C++中使用一个未初始化的变量,你就有可能得到垃圾值,而内核会把你的应用程序转储。