Java内部类创建与外部方法调用实战指南
在 JDK 1.8.0 中操作内部类时,需注意对象创建与外部方法调用的细节。下面首先演示内部类实例的构建方式,再说明从内部类中安全调用外部类方法的正确做法。
内部类实例的创建方式
实例化内部类时必须持有外部类对象的引用,语法如下:
Outer outer = new Outer(1L,"fater");
Outer.Inner inner = outer.new Inner(2L,"son");
需要留意 outer.new Inner(...) 这种写法——每个内部类实例都绑定到特定外部类对象上,形成强关联。
从内部类调用外部类方法的正确姿势
一个常见的误区:当内部类与外部类方法名不冲突时,内部类可直接调用外部类方法;若出现同名方法(例如同时存在 test()),则必须通过 Outer.this.method() 显式指定外部类版本,否则默认调用内部类自身方法,极易导致无限递归异常。
以下完整示例可以清晰说明这一点:
public class Outer {
private Long id;
private String name;
public Outer(Long id, String name) {
this.id = id;
this.name = name;
}
public void test(){
System.out.println("Outer " + this.id + "--" + this.name);
}
class Inner{
private Long id;
private String name;
public Inner(Long id, String name) {
this.id = id;
this.name = name;
}
//public void test(){
// System.out.println("Inner " + this.id + "--" + this.name);
// System.out.println("my fater is");
// //test(); // 会调用内部类的test()方法,无限循环报错
// Outer.this.test(); // 调用外部类方法
//}
public void test2(){
System.out.println("Inner " + this.id + "--" + this.name);
System.out.println("my fater is");
Outer.this.test();
//test(); // 两种方式皆可,调用外部类方法
}
}
public static void main(String[] args) {
Outer outer = new Outer(1L,"fater");
Outer.Inner inner = outer.new Inner(2L,"son");
inner.test2();
}
}
示例中 Inner.test2() 通过 Outer.this.test() 精准调用了外部类的 test() 方法。如果内部类中同样定义了 test()(但此处被注释),直接写 test() 会优先匹配内部类版本;而 Outer.this.test() 则始终指向外部类。这种机制确保了嵌套环境下方法调用的明确性。