如何调用匿名类的多个方法?附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
相关产品推荐
相关产品推荐

