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

时间:2016-09-01 01:22:32

标签: java

我自学java,正在处理我的继承教科书中的一些问题。问题基本上是创建一个超类Person并添加另外两个类studentinstructor,其中学生有专业,教师有薪水。

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

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;
     }
}

我的思维过程

由于每个学生都有姓名和出生日期,当我调用超级构造函数时,我可以传入在我的原始超类中返回Person名称的方法。显然,你可以说这不起作用解决方案就是

public Student(String name, String birthDate, String major)
{
           super(name,birthDate);
           this.major = major;
}

我以为我会在构造函数Student中保存两个额外的变量,只需调用方法.getName().getDate(),我再次阅读本章,但我真的不明白问题所在。

TLDR 这条线的错误

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

非常感谢

2 个答案:

答案 0 :(得分:1)

类就像是如何创建对象的蓝图。

在您的情况下,您有2个类,Person作为基类,然后Student继承自Person

当您尝试通过构造函数方法从Student类创建对象时,编译器将首先构建Person对象,但请注意,在此阶段,基类{{1在你调用Person构造函数之前,还没有构建。

所以当你说,我想使用我的"尚未构建的基类(Person)"中的方法,因为编译器知道一个时间的推移,这不会起作用因为在super() 返回(已完成运行)之前,父对象(可从super关键字访问)尚未到达。因此,在构建父级之前执行父类。super()方法是无效的。

也像许多人说的那样,即使您能够使用getName()方法,它也不会有任何值,因为它没有设置默认值。

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

答案 1 :(得分:0)

你不能在构造函数中引用超级方法。在运行子类的构造函数时,超级对象不是(null)。