我有一个有趣的问题,也许我正在接近这个问题,但我觉得我走在了正确的轨道上。我正在尝试创建一个我的子类可以引用的超类。所以我有大部分的代码设置,但无法弄清楚这里的默认构造函数是我得到的错误:
在调用超类型构造函数之前,不能引用'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()调用它;结果相同。任何帮助表示赞赏。
答案 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);
}