如何在子类中调用父类默认构造方法并设置为当前日期
解决子类调用父类默认构造并初始化当前日期的问题
嘿,我来帮你梳理下这个问题。首先,你现在的代码有两个小问题:一是父类的默认构造是空的,没法帮你初始化日期;二是子类里调用了super.addDays(),但父类压根没这个方法,编译肯定会报错。接下来咱们一步步解决:
核心知识点
在Java里,子类的构造方法如果没有显式调用父类的构造方法,JVM会自动帮你隐式调用父类的无参构造。但如果你想显式写出来(更清晰),必须把super();放在子类构造方法的第一行,这是语法要求。
方案1:父类默认构造直接初始化当前日期
如果你希望父类的默认构造直接把日期设为当前系统日期,那咱们可以用Java 8+的LocalDate类(比手动处理时区、闰年靠谱多了)来实现。同时要给父类补上addDays方法,不然子类里的调用会报错。
修改后的父类代码
import java.time.LocalDate; public class Date { private int month; private int day; private int year; // 默认构造:直接初始化当前日期 Date() { LocalDate currentDate = LocalDate.now(); this.month = currentDate.getMonthValue(); this.day = currentDate.getDayOfMonth(); this.year = currentDate.getYear(); } // 参数化构造:保持你原来的逻辑 Date(int passedMonth, int passedDay, int passedYear) { month = passedMonth; day = passedDay; year = passedYear; } // 补上子类需要的addDays方法 public void addDays(long daysToAdd) { // 用LocalDate处理日期计算,避免手动处理边界情况 LocalDate date = LocalDate.of(year, month, day); date = date.plusDays(daysToAdd); // 更新回成员变量 this.year = date.getYear(); this.month = date.getMonthValue(); this.day = date.getDayOfMonth(); } // 可选:添加getter方便测试和获取日期值 public int getMonth() { return month; } public int getDay() { return day; } public int getYear() { return year; } }
修改后的子类代码
public class GregorianDate extends Date { // 默认构造:显式调用父类默认构造(不写的话JVM也会自动调用,写出来更直观) GregorianDate() { super(); // 这行就是调用父类的无参构造,必须放在第一行 // 注意:如果你原来的addDays逻辑是想从纪元日计算当前日期,那这里不能直接用父类的当前日期初始化 // 这种情况看下面的方案2 } // 参数化构造:保持你原来的逻辑不变 GregorianDate(int passedYear, int passedMonth, int passedDay) { super(passedMonth, passedDay, passedYear); } }
方案2:通过纪元天数计算当前日期(匹配你原来的子类逻辑)
如果你原来的子类代码是想通过计算从1970年1月1日到现在的天数来得到当前日期,那父类的默认构造应该初始化到纪元起始日,然后子类再调用addDays来计算当前日期。
调整后的父类默认构造
Date() { // 初始化到Unix纪元起始日:1970年1月1日 this.month = 1; this.day = 1; this.year = 1970; }
调整后的子类默认构造
GregorianDate() { super(); // 先调用父类默认构造,初始化到1970-01-01 // 保留你原来的天数计算逻辑 long numToAdd = System.currentTimeMillis(); numToAdd += java.util.TimeZone.getDefault().getRawOffset(); numToAdd /= 86400000; super.addDays(numToAdd); }
这样就能完美实现你的需求:子类默认构造调用父类默认构造,同时完成当前日期的赋值。
内容的提问来源于stack exchange,提问作者user9501082
相关产品推荐
相关产品推荐

