内部类
	(1)把类定义在另一个类的内部,该类就被称为内部类。
		举例:把类B定义在类A中,类B就被称为内部类。
	(2)内部类的访问规则
		A:可以直接访问外部类的成员,包括私有
		B:外部类要想访问内部类成员,必须创建对象
	(3)内部类的分类
		A:成员内部类
		B:局部内部类
	(4)成员内部类
		A:private 为了数据的安全性
		B:static 为了访问的方便性
		
		成员内部类不是静态的:
			外部类名.内部类名 对象名 = new 外部类名.new 内部类名();
		成员内部类是静态的:
			外部类名.内部类名 对象名 = new 外部类名.内部类名();
	(5)成员内部类的面试题(填空)
		
class Outer { public int num = 10; class Inner { public int num = 20; public viod show() { int num = 30; System.out.println(num); System.out.println(this.num); System.out.println(Outer.this.num); } } }
输出:30,20,10
	(6)局部内部类
		A:局部内部类访问局部变量必须加final修饰。
		B:为什么呢?
			因为局部变量使用完毕就消失,而堆内存的数据并不会立即消失。
			所以,堆内存还是用该变量,而改变量已经没有了。
			为了让该值还存在,就加final修饰。
			通过反编译工具我们看到了,加入final后,堆内存直接存储的是值,而不是变量名。
	(7)匿名内部类(掌握)
		A:是局部内部类的简化形式
		B:前提
   存在一个类或者接口
		C:格式:
			new 类名或者接口名() {
    重写方法;
			}
		D:本质:
			其实是继承该类或者实现接口的子类匿名对象
	(8)匿名内部类在开发中的使用
		我们在开发的时候,会看到抽象类,或者接口作为参数。
		而这个时候,我们知道实际需要的是一个子类对象。
		如果该方法仅仅调用一次,我们就可以使用匿名内部类的格式简化。
如在多线程中:
public class Demo {
    public static void main(String[] args) {
        Thread t = new Thread() {
            public void run() {
                for (int i = 1; i <= 5; i++) {
                    System.out.print(i + " ");
                }
            }
        };
        t.start();
    }
}
运行结果:1 2 3 4 5
public class Demo {
    public static void main(String[] args) {
        Runnable r = new Runnable() {
            public void run() {
                for (int i = 1; i <= 5; i++) {
                    System.out.print(i + " ");
                }
            }
        };
        Thread t = new Thread(r);
        t.start();
    }
}
运行结果:1 2 3 4 5
原文:http://www.cnblogs.com/sunTin/p/6618691.html