内部类
通俗的讲,为了更好的封装,将一些只在本类依赖使用的类用内部类的书写。带点逼格,其实是为了优雅的设计数据结构。
常规内部类
定义在类的内部,跟类变量同级,写法和常规类无区别。不加修饰符Public外部不能访问。不能定义为static。
匿名内部类
不需要类名,只使用一次,实现的是一个抽象方法或接口。推荐使用java8的lambda表达式来实现。
局部内部类
定义在方法或代码块中,生命周期也仅在改范围内,写法与常规无异。不加任何修饰符。
静态内部类
定义在类内部,使用static修饰,只能访问外部类的静态方法和变量。可以不依赖于外部类实例对象来声明,直接依赖外部类。
内部类和外部类之间
访问外部类成员变量
非静态,直接访问变量名。静态(静态内部类、或者非静态内部类的静态方法),先实例化外部类再访问。
class Inner1{
void Test1 (){
System.out.println(i);
System.out.println(string);
}
}
static class Inner2{
void Test1 (){
System.out.println(new Outter().i);
System.out.println(string);
}
}
外部访问内部成员变量
静态方法访问非静态内部类成员
new Outter().new Inner();
非静态方法访问非静态内部类成员
new Inner();
new Outter.Inner();
静态方法访问静态内部类的成员
先“外部类.内部类”访问至内部类。
Outter.Inner inner = new Outter.Inner();
inner.i;
Outter.Inner.string; #静态内部类的静态成员可以直接访问
总的来说,因为将内部类理解为外部类的一个普通成员,所以外面的访问里面的需先new一个对象。
匿名内部类访问外部成员变量时,成员变量前应加final关键字。
注意
在内部类和外部类有同名变量情况下,默认是访问内部成员变量。可使用如下来进行访问:
外部类.this.成员变量
外部类.this.成员方法