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

Java中如何调用inline class(内联类)内自定义的新增方法

问题原因说明

首先你提到的「inline class(内联类)」属于术语混淆:你代码中用到的动态创建子类的机制是Java的匿名内部类,而Java官方提案中的inline class是值类型相关的特性,和当前场景无关。

匿名内部类完全支持新增自定义方法和属性,你代码报错是受Java静态类型机制约束:
你将匿名内部类的实例赋值给了Animals类型的父类引用cat,编译阶段编译器只会识别cat的类型是Animals,而Animals类中并没有定义color()方法,因此调用cat.color()会触发编译错误。

访问自定义方法的实现方式

有两种常用方案可以正常调用你新增的color()方法:

  1. 直接调用匿名实例的方法,不赋值给父类引用
public class Main {
    public static void main(String[] args) {
        // 直接创建匿名内部类实例并调用自定义方法
        new Animals("Cat") {
            @Override
            public void makeNoise() {
                System.out.println("MEOW MEOW");
            }

            public void color() {
                System.out.println("Color is: white");
            }
        }.color(); 
    }
}
  1. (Java 10及以上版本支持)用var关键字自动推断变量类型
    编译器会自动识别cat的实际类型是你创建的匿名子类,就可以正常调用自定义方法:
public class Main {
    public static void main(String[] args) {
        var cat = new Animals("Cat") {
            @Override
            public void makeNoise() {
                System.out.println("MEOW MEOW");
            }

            public void color() {
                System.out.println("Color is: white");
            }
        };
        cat.makeNoise();
        cat.color(); // 编译正常,不会报错
    }
}

补充说明

匿名内部类并非只能重载父类已有方法,你可以随意新增自定义的方法、成员变量,甚至静态成员,只是如果用父类类型的引用接收实例,就只能访问父类中已经声明过的成员。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:51:02