Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 调用超类构造函数_Java_Inheritance - Fatal编程技术网

Java 调用超类构造函数

Java 调用超类构造函数,java,inheritance,Java,Inheritance,我有一个有趣的问题,也许我处理这个问题是错误的,但我觉得我在正确的轨道上。我试图创建一个我的子类可以引用的超类。因此,我已经完成了大部分代码设置,但无法确定默认构造函数。下面是我遇到的错误: 无法在调用超类型构造函数之前引用“GregorianDate.day” 超类文件: public class Date { public int month; public int day; public int year; Date(int passedMonth, in

我有一个有趣的问题,也许我处理这个问题是错误的,但我觉得我在正确的轨道上。我试图创建一个我的子类可以引用的超类。因此,我已经完成了大部分代码设置,但无法确定默认构造函数。下面是我遇到的错误:

无法在调用超类型构造函数之前引用“GregorianDate.day”

超类文件:

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的类加载器加载该类时,该字段将被初始化,并且该类的所有实例共享相同的值<代码>最终使其成为常量