簡體   English   中英

調用超類構造函數

[英]Calling Super class Constructor

我有一個有趣的問題,也許我是錯誤地解決了這個問題,但是我覺得自己走在正確的道路上。 我正在嘗試創建我的子類可以引用的超類。 因此,我完成了大多數代碼設置,但無法弄清楚默認構造函數,這是我得到的錯誤:

在調用超類型構造函數之前無法引用'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()調用它; 結果相同。 任何幫助表示贊賞。

您的代碼有一些問題。

首先,由於錯誤提示,您不能在超級調用之前使用成員變量,因為該對象尚未完全初始化。 其次,您的子類不應具有與父類相同的公共變量。 第三,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
}

超類文件:

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
}

因為日,月,年是公歷類的實例變量。 因此,只有在類實例化之后,它們才可用。 因此,在您的情況下,編譯器將無法在調用父類時找到這些值。

因此,在您的空構造函數中未接收到日,月,年的任何值,因此引發編譯錯誤

我認為您必須先調用超級構造函數。

你可以試試

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM