2、静态内部类 —— 在方法间定义的内部类,静态
内部类也有静态的区别,这就是静态内部类,我们来看看代码:
package hr.test;
//代码3:静态内部类对外部变量的引用
public class Outer{
private static int i=0;
//创建静态内部类对象
public Inner in=new Inner();
//静态内部类
private static class Inner{
public void print(){
System.out.println(i); //如果i不是静态变量,这里将无法通过编译
}
}
}
静态内部类和私有内部类最大的区别在于,静态内部类中无法引用到其外围类的非静态成员。这是为什么?我们还是来看看静态内部类Outer$Inner中发生了什么吧?
//反编译代码
class Outer$Inner
{
private Outer$Inner();
Outer$Inner(hr.test.Outer$Inner);
}
与上面私有内部类反编译1比较发现,少了一个指向外围类对象的引用final Outer this$0; 也就是说静态内部类无法得到其外围类对象的引用,那么自然也就无法访问外围类的非静态成员了。因此,静态内部类只能访问其外围类的静态成员,除此之外与非静态内部类没有任何区别。
3、局部内部类 —— 在方法中定义的内部类
方法内部类也有两个特点
(1) 方法中的内部类没有访问修饰符, 即方法内部类对包围它的方法之外的任何东西都不可见。
(2) 方法内部类只能够访问该方法中的局部变量,所以也叫局部内部类。而且这些局部变量一定要是final修饰的常量。
例如
class Outter{
public void outMethod(){
final int beep=0;
class Inner{
//使用beep
}