调用父类构造函数

3

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

在调用超类型构造函数之前无法引用 '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);
    }

超类文件:

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() 进行调用,结果与之前相同。 感谢任何帮助。


1
为什么这两个类有相同的变量? - tkausl
有没有其他方法可以做到这一点?因为还有另一个类具有不同的初始值(朱利安历)。我发现添加关键字“static”可以解决我的问题。 - user9501082
2个回答

4

您的代码存在几个问题。

首先,正如错误提示所示,在调用super之前不能使用成员变量,因为对象尚未完全初始化。其次,子类不应该有与超类相同的公共变量。第三,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 {
    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
}

好的,那很有道理!谢谢你!我甚至不需要调用this。正确的。 - user9501082
@user9501082,我刚看到你在问题下的评论。static 表示这是一个字段,在 VM 的类加载器加载类时初始化,在任何实例初始化之前,该类的所有实例共享相同的值。final 则使其成为一个常量。 - SwiftMango

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

所以我只是好奇,我也尝试了一下,它确实有效。然而,我发现我可以使用关键字static,它也有效。有什么区别吗? - user9501082
你在哪里使用了static关键字?你可以在不创建任何类实例的情况下访问类的静态成员。查看 https://www.quora.com/Why-cant-static-method-access-this-or-super-in-Java - Kamol Chandra Roy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接