一、内部类
定义:定义在类内部的类
二、种类
- 成员内部类:以定义成员变量方式定义在类内部的类,修饰权限同成员变量
- 静态内部类:通过关键字static修饰的成员内部类
- 局部内部类:定义在方法内部的类
- 匿名内部类:没有名字的内部类
三、实例
interface NoName{
public void test();
}
public class Outer {
// 成员内部类
private class Inner{
public void test(){
System.out.println("============");
}
}
// 静态内部类
private static class Inner1{
public void test(){
System.out.println("-------------");
}
}
public void test(){
// 局部内部类
class Inner2{
public void test(){
System.out.println("-=-=-=-=-=-=-=");
}
}
//局部内部类实例化
Inner2 inner2 = new Inner2();
inner2.test();
}
public NoName getNoName(){
// 匿名内部类
return new NoName() {
@Override
public void test() {
System.out.println("------------ no-name");
}
};
}
public static void main(String[] args) {
// 成员内部类实例化
Outer out = new Outer();
Inner inner = out.new Inner();
inner.test();
// 静态内部类实例化
Inner1 inner1 = new Outer.Inner1();
inner1.test();
NoName no = out.getNoName();
no.test();
}
}
四、内部类特点
局部内部类和匿名内部类使用局部变量时,变量为final类型,其目的是为了保证方法内和内部类使用的是同一变量,不是为了防止内存可能出现泄漏,方法内定义的局部变量可以不加final关键字,但是反编译可以看到,被自动加上
public void test(){
Pst p = new Pst();
// 局部内部类
class Inner2{
public void test(){
System.out.println(p);
System.out.println("-=-=-=-=-=-=-=");
}
}
System.out.println(p);
Inner2 inner2 = new Inner2();
inner2.test();
}
Luyten反编译后
public void test() {
final Pst pst = new Pst();
System.out.println(pst);
class Inner2
{
public void test() {
System.out.println(pst);
System.out.println("-=-=-=-=-=-=-=");
}
}
new Inner2().test();
}
五、使用场景
Java类是单继承,内部类可以解决多重继承问题