内部类会被编译成OutClass$InClasss.class,匿名类会被编译成OutClass$i.class,i代表从1开始的整数。
一:局部变量、内部类成员变量和外部类成员变量重名的问题
class Out{
private int i = 0;
public class In{
private int i = 1;
public void print(int i){
i++; //局部变量i
this.i++; //内部类成员变量i
Out.this.i++; //外部类成员变量i
System.out.println("局部变量i:" + i);
System.out.println("内部类成员变量i:" + this.i);
System.out.println("外部类成员变量i:" + Out.this.i);
}
}
}
二:使用内部类
public static void main(String[] args) {
Out out = new Out();
Out.In in = out.new In();
in.print(2);
}
下面这样创建内部类是错误的:
Out.In in = new Out.In(); //错误的创建形式
注:因为内部类对象依赖于外部类的实例而存在,所以必须先创建外部类的实例。一个外部类对象可以被多个内部类对象依赖。
三:静态内部类(嵌套类)
见博客http://blog.youkuaiyun.com/zhangzeyuaaa/article/details/17201125
四:接口内部类
/**
* 接口内部类
*/
interface A{
public void aF();
public interface B{
public void bF();
}
public class C implements A, B{
@Override
public void bF() {}
@Override
public void aF() {}
}
}
注:放到接口中的任何类都自动地是public和static的,所以以上内部类实际上静态内部类。
五:方法中定义内部类(局部内部类)
interface In{
public int print();
}
class Out{
private int outVar = 0;
public In inClass(){
final int var = 1; //必须定义为常量才能被局部内部类访问
class InImpl implements In{ //局部内部类不能有访问修饰符
public int print(){
return outVar + var;
}
}
return new InImpl();
}
}
测试:
public static void main(String[] args) {
Out out = new Out();
In in = out.inClass();
System.out.println(in.print());
}
内部类分为局部内部类(方法内定义)、成员内部类、匿名类以及静态内部类。
内部类形成一个闭包,能直接访问定义它环境的资源,包括private成员,但是它的外围不能直接访问它的成员,必须通过它的引用才能访问内部类成员。
内部类之所以能访问外围类的所有资源,是因为在创建内部类(非静态)的时候,把外围类的引用隐式地传入了内部类。