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

Java调用抽象类方法创建子类实例编译报错原因求解

问题原因及修复方案

直接报错原因

你编写的new Money.dollar(5)存在语法误用:

  • new关键字在Java中用于实例化类,编译器会将Money.dollar识别为待实例化的类名,但你代码中dollar是Money类的实例方法而非内部类,自然会抛出「找不到符号dollar类」的错误。
  • 实例方法必须依托类的实例调用,但Money是抽象类,本身无法直接实例化,这套写法从逻辑上就不成立。

深层结构错误

你将Money、Dollar都定义为Test的非静态内部类,和参考代码的结构完全不符:

  1. 非静态内部类会隐式持有外部类Test的实例引用,无法脱离外部类实例独立使用。
  2. Java语法明确规定非静态内部类中不能定义静态方法,这就是你把dollar改成static后会额外报错的原因。
  3. 你参考的代码中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:24:03