You need to enable JavaScript to run this app. Java实现Animal/Cat/Bird继承结构时代码无法正常启动、异常运行旧程序
优惠活动
大模型
产品
解决方案
定价
更多

Java实现Animal/Cat/Bird继承结构时代码无法正常启动、异常运行旧程序

Java继承练习题运行异常排查

核心问题根源

  • 主方法签名错误,无法被识别为程序入口:Java规定JVM识别的程序启动入口必须是public static void main(String[] args),你当前写的public void main缺少static关键字,根本不符合入口规范。IDE在找不到合法启动入口时,会自动调用之前项目里缓存的、存在合法入口的旧程序,这就是每次运行都会启动旧程序的直接原因。
  • 类定义位置违规:你把Animal、Cat、Bird三个类全部嵌套在main方法内部,属于局部内部类的写法,既不符合题目要求的独立类继承结构要求,也没有实际执行逻辑。当你把类实例化、方法调用的代码删掉后,剩下的嵌套类定义不会产生任何可执行输出,自然就会出现运行无响应、无输出的现象。
  • 权限修饰符的判断本身没有问题:
  • 给eat加protected修饰,本身就支持包内所有类访问,完全匹配「eat仅包内可见」的要求
  • 给sleep加final修饰(搭配默认的包级访问权限),方法无法被子类重写扩展,也符合「类层次结构内可见、不可被扩展」的要求

正确代码实现

按照题目的结构要求,所有独立类要定义在同级层级,不能嵌套在方法内部,主方法签名要补全static,同时按照「调用时打印自身名称」的要求调整输出逻辑:

class Animal {
    // protected修饰:包内可见的eat方法
    protected void eat() {
        // 通过当前对象类名实现打印自身名称的要求
        System.out.println(this.getClass().getSimpleName() + " eat");
    }

    // 包级访问权限+final修饰:类层次内可见、不可重写扩展的sleep方法
    final void sleep() {
        System.out.println(this.getClass().getSimpleName() + " sleep");
    }
}

class Cat extends Animal {
    void haveFur() {
        System.out.println(this.getClass().getSimpleName() + " haveFur");
    }
}

class Bird extends Animal {
    void haveFeathers() {
        System.out.println(this.getClass().getSimpleName() + " haveFeathers");
    }
}

// 带合法启动入口的主类
public class Main {
    public static void main(String[] args) {
        Bird bird = new Bird();
        Cat cat = new Cat();
        bird.eat();
        bird.sleep();
        bird.haveFeathers();
        cat.eat();
        cat.sleep();
        cat.haveFur();
    }
}

后续排查注意事项

  • 修改代码后先执行项目的清理、重新编译操作,避免旧的class文件残留在构建路径中,被误识别为启动入口
  • 开启IDE的Java语法校验提示,一旦主方法签名缺失static、类定义位置违规,IDE会直接给出标红提示,不需要等到运行时才排查问题
  • 方法输出逻辑不要写死固定字符串,要通过获取当前运行时的类名实现「打印自身名称」的要求,避免不同子类调用同一个继承方法时,输出内容完全一致不符合题目要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 00:27:01