Java 内部类
内部类分类:
- 成员内部类
- 局部内部类
- 匿名内部类(实质是局部内部类的一种
成员内部类
- 在一个类中定义另一个类,即为成员内部类
- 内部类可以随意访问外部类成员,但外部类必须借助内部类才能访问内部类成员
- 成员内部类的访问方式:
- 间接访问:通过在外部类方法中使用内部类,然后在mian方法中通过调用此方法实现对内部类的调用
- 直接访问:外部类.内部类 对象名 = new 外部类().new 内部类();
访问方法如下:
package te;
public class Outter {
public void function() {
Inner inner = new Inner();
System.out.println("通过调用外部类方法实现对内部类的调用");
inner.method();
}
public class Inner{
public void method() {
System.out.println("调用内部类的方法");
}
}
}
package te;
public class Test {
public static void main(String[] args) {
Outter outter = new Outter();
//通过外部类方法对内部类进行调用
outter.function();
//直接调用
Outter.Inner i = new Outter().new Inner();
i.method();
}
}
局部内部类
- 在外部类成员方法中定义的类为局部内部类
- 局部内部类只有当前方法可以使用
- 若局部内部类想要访问外部类的成员变量,这个变量必须是有效final的,即不能改变
- 局部内部类的访问方式:
- 在局部内部类所在的方法中new一个内部类对象,使用这个内部类对象调用内部类成员
- 通过调用局部内部类所在的成员方法实现对局部内部类的调用
//外部类与局部内部类
public class Outter {
private int a = 10;
// a = 20; 若局部内部类想要访问外部类的成员变量,这个变量必须是有效final的,即不能改变
//定义为private final int a = 10就更为保险
public void out() {
class Inner{ //注意:局部内部类不能有public等修饰符
private int a = 20;
public void method() {
int a = 30;
System.out.println(a); //输出内部类method方法中局部变量a=30
System.out.println(this.a); //输出内部类的成员变量a=20
System.out.println(Outter.this.a); //输出外部类成员变量a=10
}
}
Inner inner = new Inner();
inner.method();
}
}
//定义测试类:
public class Test {
public static void main(String[] args) {
Outter outter = new Outter();
outter.out();
}
}
运行结果如下:
匿名内部类
- 匿名内部类的使用场景:接口的实现类只需使用唯一的一次,则可省略掉接口实现类的定义,转而使用匿名内部类
- 匿名内部类使用方法:接口名称 对象名称 = new 接口名称(){//实现所有抽象方法};
使用接口实现类与使用匿名内部类的比较:
//定义一个接口,里面包含一个抽象方法method()
public interface OutterInterface {
public void method();
}
//定义一个接口实现类,实现接口的抽象方法method
public class ImplOutterInterface implements OutterInterface {
public void method() {
System.out.println("使用实现类实现接口的method方法");
}
}
//定义一个测试类,在这个测试类里比较匿名内部类与接口实现类
public class Test {
public static void main(String[] args) {
ImplOutterInterface obj = new ImplOutterInterface();
obj.method();
OutterInterface out = new OutterInterface() {
public void method() {
System.out.println("使用匿名内部类实现接口的method方法");
}
};
out.method();
}
}