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

含main方法的类能否继承其他类?构造器不可见问题咨询

关于带main方法的类继承及protected构造器的问题解答

首先明确:包含main方法的类完全可以继承其他类——main方法只是Java程序的入口点,和类的继承特性没有任何冲突,你遇到的问题和main方法本身无关,核心是protected构造器的访问规则。

为什么protected构造器在子类的main方法里不可用?

你可能混淆了protected成员(方法/属性)和protected构造器的访问规则:

  • 对于protected方法/属性:子类实例可以直接调用父类的protected成员,不管子类和父类是否在同一个包下——这也是你说“子类可使用父类的protected方法”的原因。
  • 对于protected构造器:它的访问限制更严格:
    1. 同一个包内的类可以直接实例化该类(调用protected构造器);
    2. 子类只能在自身的构造器中通过super()调用父类的protected构造器,而不能在子类的其他方法(比如main)中直接创建父类的实例。

看你的代码:

  • Saving类在second包,SavingTest在third包,属于不同包的子类;
  • 在SavingTest的main方法里直接new Saving(100),这是尝试在子类的普通方法中调用父类的protected构造器,违反了访问规则,所以报错“The Constructor Saving(int) is not visible”。

解决办法

根据你的需求,有两种常见方案:

方案1:调整构造器的访问修饰符

如果需要在不同包的子类中直接实例化Saving类,把Saving的构造器改成public(这也是你之前解决问题的方式):

package second;
import first.Accumulator;
public class Saving extends Accumulator {
    public Saving() { super(); }
    public Saving(int num) { super(num); }
    protected void addAmount(int amount) { add(amount); }
    protected void showAmount() { show(); }
}

方案2:保持protected构造器,创建子类实例

如果不想把Saving的构造器改成public,可以在SavingTest中调用父类构造器创建子类实例,而不是直接创建Saving的实例:

package third;
import second.Saving;
public class SavingTest extends Saving {
    // 子类构造器调用父类的protected构造器
    public SavingTest(int num) {
        super(num);
    }
    public static void main(String[] args) {
        // 创建子类实例,而非父类实例
        SavingTest saving = new SavingTest(100);
        saving.addAmount(100);
        saving.showAmount();
    }
}

总结一下

  • 带main方法的类继承其他类完全没问题;
  • protected构造器和protected方法的访问规则有差异,子类不能在非构造器方法中直接调用父类的protected构造器;
  • 调整构造器修饰符或创建子类实例,都能解决你遇到的问题。

内容的提问来源于stack exchange,提问作者user10937085

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:00:23