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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:04:15