Java 调用超类构造函数
我有一个有趣的问题,也许我处理这个问题是错误的,但我觉得我在正确的轨道上。我试图创建一个我的子类可以引用的超类。因此,我已经完成了大部分代码设置,但无法确定默认构造函数。下面是我遇到的错误: 无法在调用超类型构造函数之前引用“GregorianDate.day” 超类文件:Java 调用超类构造函数,java,inheritance,Java,Inheritance,我有一个有趣的问题,也许我处理这个问题是错误的,但我觉得我在正确的轨道上。我试图创建一个我的子类可以引用的超类。因此,我已经完成了大部分代码设置,但无法确定默认构造函数。下面是我遇到的错误: 无法在调用超类型构造函数之前引用“GregorianDate.day” 超类文件: public class Date { public int month; public int day; public int year; Date(int passedMonth, in
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;
}
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
}
我尝试添加一个没有任何内容的默认构造函数,并用super()调用它;同样的结果。非常感谢您的帮助。我想您必须先打电话给超级构造函数 你可以试试
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);
}
您的代码有一些问题 首先,正如错误所提示的,您不能在超级调用之前使用成员变量,因为对象尚未完全初始化。其次,您的子类不应具有与超类相同的公共变量。第三,Java中的一种常见做法是使用getter/setter代替公共变量 以下是我的代码版本:
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
}
超类文件:
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;
}
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
}
为什么两个类都有相同的变量?还有其他方法吗?因为还有另一个类具有不同的初始值(Julian)。我确实发现添加关键字“static”解决了我的问题。可能是重复的,所以我也尝试了,并且成功了。然而,我发现我可以使用关键字static,它也起作用了。有什么区别?你在哪里使用了静态关键字?您可以访问类的静态成员,而无需创建任何类实例。看看,好吧,这很有道理!非常感谢。我甚至不必叫这个名字。correct@user9501082我刚才看到你在问题下的评论
static
意味着在初始化任何实例之前,当VM的类加载器加载该类时,该字段将被初始化,并且该类的所有实例共享相同的值<代码>最终使其成为常量