调用超类构造函数

时间:2018-03-17 06:30:06

标签: java inheritance

我有一个有趣的问题,也许我正在接近这个问题,但我觉得我走在了正确的轨道上。我正在尝试创建一个我的子类可以引用的超类。所以我有大部分的代码设置,但无法弄清楚这里的默认构造函数是我得到的错误:

  

在调用超类型构造函数之前,不能引用'GregorianDate.day'。

public class GregorianDate extends Date {
    //Initialise the variables
    public int month = 1;
    public int day = 1;
    public int year = 1970;


    //*************** Constructors ***********************
    GregorianDate() {
        super(month,day,year);
        long numToAdd = System.currentTimeMillis();
        numToAdd += java.util.TimeZone.getDefault().getRawOffset();
        numToAdd /= 86400000;
        super.addDays(numToAdd);
    }

    //Parameterized constructor
    GregorianDate(int passedYear, int passedMonth, int passedDay){
        super(passedMonth, passedDay, passedYear);
    }

SuperClass文件:

public class Date {
    public int month;
    public int day;
    public int year;

    Date(int passedMonth, int passedDay, int passedYear){
       month = passedMonth;
       day = passedDay;
       year = passedYear;
    }

我尝试添加一个没有任何内容的默认构造函数并通过super()调用它;结果相同。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:3)

您的代码存在一些问题。

首先,正如错误所示,您不能在超级调用之前使用成员变量,因为该对象尚未完全初始化。其次,您的子类不应该与超类具有相同的公共变量。第三,Java中的常见做法是使用getter / settter而不是公共变量。

以下是我的代码版本:

public class GregorianDate extends Date {
    //Define constants
    private final static int MONTH = 1;
    private final static int DAY = 1;
    private final static int YEAR = 1970;


    //*************** Constructors ***********************
    GregorianDate() {
        super(MONTH,DAY,YEAR);
        long numToAdd = System.currentTimeMillis();
        numToAdd += java.util.TimeZone.getDefault().getRawOffset();
        numToAdd /= 86400000;
        super.addDays(numToAdd);
    }

    //Parameterized constructor
    GregorianDate(int passedYear, int passedMonth, int passedDay){
        super(passedMonth, passedDay, passedYear);
    }

    //getters and setters here
}

SuperClass文件:

public class Date {
    private int month;
    private int day;
    private int year;

    Date(int passedMonth, int passedDay, int passedYear){
       this.month = passedMonth;
       this.day = passedDay;
       this.year = passedYear;
    }

    //Getters and setters here
}

答案 1 :(得分:1)

因为日,月,年是格里高利班的实例变量。 所以它们只有在课程实例化后才可用。因此,在您的情况下,编译器在调用父类时无法找到这些值。

所以在你的空构造函数中没有收到任何日,月,年的值,所以抛出一个编译错误

答案 2 :(得分:0)

我认为你必须先调用超级构造函数。

你可以尝试一下

public class Date {
public int month;
public int day;
public int year;

Date()
Date(int passedMonth, int passedDay, int passedYear){
   month = passedMonth;
   day = passedDay;
   year = passedYear;
}

然后在类构造函数之前首先在构造函数中使用它。

public class GregorianDate extends Date {
//Initialise the variables
public int month = 1;
public int day = 1;
public int year = 1970;


//*************** Constructors ***********************


GregorianDate() {
    super(month,day,year);
    long numToAdd = System.currentTimeMillis();
    numToAdd += java.util.TimeZone.getDefault().getRawOffset();
    numToAdd /= 86400000;
    super.addDays(numToAdd);
}

//Parameterized constructor
GregorianDate(int passedYear, int passedMonth, int passedDay){
    super(passedMonth, passedDay, passedYear);
}