Java多态报错解析:Larry var3=new Jerry();调用method3()为何出错?
问题分析与解决方案
咱们来一步步拆解你遇到的问题哈!从你给出的代码和执行报错的情况来看,核心问题基本和类的继承关系、方法定义以及Java的转型规则脱不了干系,下面具体说:
1. 先补全你没贴全的代码逻辑
你贴的Larry类里method1有个...,而且提到了Jerry类和method3,我先基于常见的报错场景补全一下代码(毕竟你没贴全,这是合理推测):
public class Harry { public void method1() { System.out.println("harry 1"); } public void method2() { method1(); System.out.println("harry 2"); } } public class Larry extends Harry { @Override public void method1() { System.out.println("larry 1"); } // 假设Larry有method3方法(不然调用会报错) public void method3() { // 这里应该是你要输出内容的逻辑 } } // 你提到的Jerry类,大概率是这样的(没继承Larry是关键) public class Jerry { public void method3() { System.out.println("mary 3"); } }
2. 最可能的报错原因:Jerry没继承Larry,类型不兼容
当你写Larry var3 = new Jerry();时,Java有个硬性规则:只有子类对象才能赋值给父类引用。如果Jerry没有继承Larry,这行代码直接就会编译报错:Incompatible types: Jerry cannot be converted to Larry——连编译都过不了,更别说执行var3.method3()了。这应该就是你报错的核心原因。
3. 要实现预期输出的正确写法
想要输出larry 1 harry 1 mary 3,你需要调整类的继承关系和方法实现,具体步骤如下:
第一步:让Jerry继承Larry
首先得让Jerry成为Larry的子类,这样向上转型才合法:
public class Jerry extends Larry { // 这里可以重写method3,或者直接用父类的实现 }
第二步:修正Larry的method3逻辑(避免直接调用爷爷类方法的坑)
Java不允许直接用super.super调用爷爷类(Harry)的方法,所以我们换个方式在Larry里做处理:
public class Larry extends Harry { @Override public void method1() { System.out.println("larry 1"); } // 新增一个方法专门调用父类Harry的method1 public void callHarryMethod1() { super.method1(); } // 完善method3的逻辑,对应你的预期输出 public void method3() { this.method1(); // 输出larry 1 callHarryMethod1(); // 输出harry 1 System.out.println("mary 3"); // 输出mary 3 } }
第三步:执行代码
现在再运行你写的代码:
Larry var3 = new Jerry(); var3.method3();
就能得到你想要的输出:
larry 1 harry 1 mary 3
4. 其他可能的报错情况
- 如果Larry里根本没定义method3方法,那就算Jerry继承了Larry,执行
var3.method3()也会编译报错:Cannot resolve method 'method3()' in 'Larry',这时候得确保Larry里先有method3的定义。 - 如果是运行时报错,那大概率是method3内部的逻辑有问题(比如空指针),但从你的预期输出和描述来看,最可能还是编译阶段的类型不兼容问题。
内容的提问来源于stack exchange,提问作者James Nguyen
相关产品推荐
相关产品推荐

