在 JDK 1.8.0 环境下,掌握 Java 内部类的正确使用方式非常关键。下面重点介绍如何创建内部类实例,以及从内部类中如何准确调用外部类的方法,避免常见误区。
创建内部类对象
实例化内部类时,必须先存在一个外部类对象,语法清晰简洁:
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() 始终指向外部类。这一机制确保了在多层嵌套结构中,方法调用的路径清晰可控,有效避免混淆。
