Skip to the content.

王孝东的个人空间

内部类解析

1.成员内部类

public class Outer {
	private int i = 10;

	class Inner{
		// 成员内部类对象中不能有静态成员
		// public static Object obj = new Object();

		public void seeOuter(){
			System.out.print(i);
		}
	}

	/**
	 * 外部类实例方法中可以直接创建内部内
	 */
	public void makeInner(){
		Inner inner = this.new Inner();
		Inner in = new Inner();
		in.seeOuter();
	}

	/**
	 * 必须先有外部类的实例  才能创建成员内部类对象
	 * 外部类静态方法中必须先创建外部类实例变量,再用这个外部类创建的实例变量来创建内部类
	 */
	public static void makeInnerInStatic(){
		Outer outer = new Outer();
		Outer.Inner in = outer.new Inner();
		in.seeOuter();
	}
}

2. 局部内部类local inner class

class LocalInnerClass {
	public void doSomething() {
		class Inner{
			public void seeOuter(){
				System.out.println("inner class");
			}
		}

		Inner inner = new Inner();
		inner.seeOuter();
	}
}

3. 匿名内部类Anonymous Inner Class

class Car {
	public void drive(){
		System.out.println("Driving a car!");
	}
}

interface  Vehicle {
	public void drive();
}

class Bar{
	void doStuff(Foo f){}
}

interface Foo {
	void foo();
}

class Test{
	public static void main(String[] args) {
		// 1. 示例1: 继承式的匿名内部类
		Car car = new Car(){
			public void drive(){
				System.out.println("Driving another car!");
			}
		};
		car.drive();

		// 2. 示例2: 接口式的匿名内部类
		Vehicle v = new Vehicle(){
			public void drive(){
				System.out.println("Driving a car!");
			}
		};
		v.drive();

		// 3. 实例3: 参数式的匿名内部类
		Bar b = new Bar();
		b.doStuff(new Foo(){
			public void foo(){
				System.out.println("foofy");
			}
		});
	}
}

4. 静态内部类static inner class

class StaticInnerClass {
	private static int a = 1;
	// 静态内部类
	public static class Inner
	{
		public void test()
		{
			// 静态内部类可以访问外部类的静态成员
			// 并且它只能访问静态的
			System.out.println(a);
		}

	}
}

参考文章:内部类解析