java内部类
// 代码1:内部类对外部类可见
class Outer1 {
// 创建私有内部类对象
public Inner in = new Inner();
// 私有内部类
private class Inner {
//这里面增加了包可见的构造方法
//ter1$Inner(Outer1, Outer1$Inner);
//所以outer1中可以创建Inner对象
//private Outer1$Inner(Outer);
//final Outer this$0; 这个东西指向外部类对象
}
}
// 代码2:外部类对内部类可见
class Outer2 {
// 外部类私有数据域
private int data = 0;
/*
* 添加了
* static int access$0(Outer2);
*
* 外部类中偷偷添加了访问私有变量的静态方法,
* 从而能从内部类中访问外部类的 私有field
*/
// 内部类
class Inner {
void print() {
// 内部类访问外部私有数据域
System.out.println(data);
/*
* System.out.println(this$0.access$0(Outer2));
* this$0 是 外部类对象的引用
*/
}
}
}
// 代码3:静态内部类对外部变量的引用
class Outer3 {
private static int i = 0;
int unstatici = 1;
// 创建静态内部类对象
public Inner in = new Inner();
// 静态
private static class Inner {
/*
* private Outer3$Inner();
* Outer$Inner(Outer3$Inner);
*
* 没有了指向外部类对象的this$0
*
* 所以静态内部类 无法 访问外部类的 非static field
*/
public void print() {
System.out.println(i); // 如果i不是静态变量,这里将无法通过编译。
// int i = unstatici;
}
}
}
//代码4
class Outter4{
public void outMethod(){
final int beep=0;
int i = 1;
class Inner{
/*
* 局部内部类(方法中的类)
* 只能访问
* 局部final变量(方法中的final field)
*/
/*
* why?
*
* 这里多了一个beep的备份
* final int val$i;
* 为了保持外部与内部的一致性规定为final
*/
//使用beep
void test(){
int temp = beep;
// temp = i;
}
}
Inner in=new Inner();
}
}
内部类基本使用方法: http://www.cnblogs.com/nerxious/archive/2013/01/24/2875649.html
原文地址 http://hxraid.iteye.com/blog/494230
浙公网安备 33010602011771号