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

如何调用匿名类的多个方法?附LinkedList匿名类代码示例

在匿名类外部调用多个方法的解决方案

你遇到的问题核心在于:匿名类没有显式类名,要是创建对象后直接链式调用单个方法,就没法再引用这个对象去调用其他方法了;而且如果把它赋值给父类(比如LinkedList)的变量,父类并没有你新增的dummy1()和dummy2()方法,自然也没法调用。下面给你两种实用的解决办法:

方法一:使用var关键字(Java 10+推荐)

从Java 10开始,var可以自动推断变量的类型为匿名类的实际类型,这样你就能调用匿名类中所有公共方法了:

void methodOC_3() {
    int x = 0;
    // 用var接收匿名类对象,类型会自动推断
    var customLinkedList = new LinkedList() {
        private static final long serialVersionUID = -2091001803840835817L;

        public void dummy1() {
            System.out.println(x);
        }

        public void dummy2() {
            dummy1();
            System.out.println("Hey there :) ");
        }
    };
    // 现在可以随意调用多个方法了
    customLinkedList.dummy1();
    customLinkedList.dummy2();
    // 也能调用LinkedList本身的方法,比如add()
    customLinkedList.add("test");
}

方法二:定义接口并让匿名类实现(兼容Java 8及以下)

如果你的项目还在用Java 8或更早版本,var不可用,那可以先定义一个包含你需要的方法的接口,让匿名类同时继承LinkedList并实现这个接口:

// 先定义一个包含自定义方法的接口
interface CustomListMethods {
    void dummy1();
    void dummy2();
}

void methodOC_3() {
    int x = 0;
    // 用接口类型接收匿名类对象
    CustomListMethods customLinkedList = new LinkedList() implements CustomListMethods {
        private static final long serialVersionUID = -2091001803840835817L;

        @Override
        public void dummy1() {
            System.out.println(x);
        }

        @Override
        public void dummy2() {
            dummy1();
            System.out.println("Hey there :) ");
        }
    };
    customLinkedList.dummy1();
    customLinkedList.dummy2();
    // 如果需要调用LinkedList的方法,可以转型为LinkedList
    ((LinkedList) customLinkedList).add("test");
}

你可能遗漏的匿名类知识点

  • 匿名类的类型限制:匿名类是没有名字的子类/实现类,如果你把它赋值给父类/父接口的变量,只能调用父类/父接口中存在的方法,子类新增的方法无法直接调用——这就是你之前只能链式调用一个方法的根本原因。
  • effectively final变量:匿名类可以访问外部方法中的局部变量,但这些变量必须是effectively final(即从声明后就没有被修改过),或者显式声明为final。你代码里的x没有被修改,所以是effectively final,可以正常读取;如果尝试修改x(比如x=4),就会编译报错。
  • 匿名类的使用场景:匿名类适合只需要使用一次的简单类,如果你需要多次复用这个类的功能,最好定义一个普通的子类(比如CustomLinkedList extends LinkedList),而不是用匿名类。
  • 序列化注意事项:因为LinkedList实现了Serializable,所以你的匿名类也继承了这个接口,显式声明serialVersionUID是正确的做法,可以避免序列化时的版本冲突问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:37:12