You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在子类中调用父类默认构造方法并设置为当前日期

解决子类调用父类默认构造并初始化当前日期的问题

嘿,我来帮你梳理下这个问题。首先,你现在的代码有两个小问题:一是父类的默认构造是空的,没法帮你初始化日期;二是子类里调用了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:21:18