含main方法的类能否继承其他类?构造器不可见问题咨询
关于带main方法的类继承及protected构造器的问题解答
首先明确:包含main方法的类完全可以继承其他类——main方法只是Java程序的入口点,和类的继承特性没有任何冲突,你遇到的问题和main方法本身无关,核心是protected构造器的访问规则。
为什么protected构造器在子类的main方法里不可用?
你可能混淆了protected成员(方法/属性)和protected构造器的访问规则:
- 对于protected方法/属性:子类实例可以直接调用父类的protected成员,不管子类和父类是否在同一个包下——这也是你说“子类可使用父类的protected方法”的原因。
- 对于protected构造器:它的访问限制更严格:
- 同一个包内的类可以直接实例化该类(调用protected构造器);
- 子类只能在自身的构造器中通过
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
相关产品推荐
相关产品推荐

