Java调用抽象类方法创建子类实例编译报错原因求解
问题原因及修复方案
直接报错原因
你编写的new Money.dollar(5)存在语法误用:
new关键字在Java中用于实例化类,编译器会将Money.dollar识别为待实例化的类名,但你代码中dollar是Money类的实例方法而非内部类,自然会抛出「找不到符号dollar类」的错误。- 实例方法必须依托类的实例调用,但
Money是抽象类,本身无法直接实例化,这套写法从逻辑上就不成立。
深层结构错误
你将Money、Dollar都定义为Test的非静态内部类,和参考代码的结构完全不符:
- 非静态内部类会隐式持有外部类
Test的实例引用,无法脱离外部类实例独立使用。 - Java语法明确规定非静态内部类中不能定义静态方法,这就是你把
dollar改成static后会额外报错的原因。 - 你参考的代码中
Money是独立的顶级类,dollar是Money的静态工厂方法,不需要实例化Money就能直接调用。
修复方案
方案1:对齐参考代码结构,将Money、Dollar改为独立顶级类
// Money.java abstract class Money{ protected int amount; // 定义为静态工厂方法 public static Dollar dollar(int amount){ return new Dollar(amount); } } // Dollar.java class Dollar extends Money{ public Dollar(int amount){ this.amount= amount; } } // Test.java class Test{ public void testMultiplication(){ // 去掉new关键字,直接调用静态方法获取实例 Money d = Money.dollar(5); } public static void main(String args[]){} }
方案2:保持单文件结构,将内部类改为静态
class Test{ // 加static修饰为静态内部类 static abstract class Money{ protected int amount; public static Dollar dollar(int amount){ return new Dollar(amount); } } // 加static修饰为静态内部类 static class Dollar extends Money{ public Dollar(int amount){ this.amount= amount; } } public void testMultiplication(){ Money d = Money.dollar(5); } public static void main(String args[]){} }
内容的提问来源于stack exchange,提问作者JoelNash-Xuuki
相关产品推荐
相关产品推荐

