java中的内部类
- java中的内部类
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类
java中的内部类
java内部类分为:成员内部类、静态内部类、局部内部类、匿名内部类。
使用场景:
- 成员内部类:不想被其他类公开使用的类,因为外部类只能定义为public或者缺省。类是属于对象的,所以不能有静态属性
- 静态内部类:一个类与另一个类关联性比较强,但是又可以不依赖外部类而独立存在。比如HashMap与Node。静态内部类是属于类的,跟普通类使用没什么区别。
- 局部内部类:局部内部类访问方法中定义的final类型的局部变量,局部类完全对外部隐藏,比较少用
- 匿名内部类:适用于快速构造对象,lambda表达式等场景
成员内部类
-
内部类的对象总有一个隐式引用,它指向创建它的外部类的对象,编译器修改了所有的内部类的构造器,添加了一个外围类引用的参数
-
内部类构造器: = new A().newB()
-
内部类不允许有static变量(static final除外)和方法
-
内部类拥有访问特权,可以访问外围类的私有域
// 只能public或缺省修饰
public class Outer {
private static String name;
private String key;
private String getKey() {
return key;
}
// public、private、protected或缺省修饰
private class Inner {
// static变量必须为常量
private static final int LEN = 1;
// 不能有static方法
private void inner() {
// 可以直接访问外部类的所有属性与方法
System.out.println(key);
// 外部类的static属性也可以访问
System.out.println(name);
}
}
}
静态内部类
- 静态内部类没有外围类对象的引用特权
- 静态内部类可以有静态域和方法
- 声明在接口中的内部类自动成为public static类
public class Outer {
private String key;
static class Inner{
// 可以有static属性
private static int len = 1;
// 可以有static方法
private static void inner() {
// 不能访问外部类属性key
System.out.println(len);
}
}
}
局部内部类
- 局部类不能用public或private声明,作用域被限定在声明这个局部类的块中
- 不能有static方法和属性(static final除外)
- 只能访问局部的final变量
public class Outer {
public static void main(String[] args) {
final Object a = new Object() ;
Object b = new Object();
class Inner{
// 不能有static与属性
private void test() {
// 只能访问final对象a
System.out.println(a);
}
}
// b重新赋值,否则可能会将b优化为final
b = new Object();
}
}
匿名内部类
- 匿名类不能有构造器,将构造器参数传递给超类的构造器
- 匿名类的equals方法无法判断:if (getClass() != ()) return false;
- “双括号初始化”
- 匿名内部类类名为OutClass$数字
invite(new ArrayList<String>() { {add("Harry"); add("Tony"); } } )