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
相关产品推荐
相关产品推荐

