less than 1 minute read

内部类的一个重要作用是隐藏继承或是对接口的实现,典型的形式是:内部类来继承或是实现接口,由外部类提供代理 constructor 方法。这些代理 constructor 方法一般都利用的向上转型,即不返回内部类对象,而是返回内部类继承的父类对象或是实现的接口对象。如:

interface Intf {...}  
  
class Outer {  
	class Inner implements Intf {...}  
  
	public Intf createInner() {  
		return new Inner();  
	}  
} 

而匿名内部类实际是对上述代码的简化,如:

interface Intf {...}  
  
class Outer {  
	public Intf createInner() {  
		return new Intf() {...};  
	}  
}  

这里的匿名内部类表示:我要创建一个 implements Intf 的 class,这个 class 的定义是 {...}。由于这个 class 没有名字,我们用的是 new Intf(),可以看作是自动的向上转型。


2014-05-18补充:匿名内部类可以是继承,不一定是 new Intf()

public class InnerBase {  
	...
}  
  
public class Outer {
	private InnerBase ib = new InnerBase() {
		@Override
		public String toString() {
			return "whatever";
		}
	};
}

4月7日补充:匿名内部类的另一种用法

interface Intf {  
	int sum();  
}  
  
public class Outer {  
	public static int getSum() {  
		return new Intf() {  
			public int sum() {  
				return 1;  
			}  
		}.sum();  
	}  
	  
	public static void main(String[] args) {  
		System.out.println(getSum());  
	}  
} 

因为对匿名内部类的使用是直接 new 一个匿名内部类对象,所以也可以直接使用这个对象的方法或是域。

7月27日补充:匿名内部类的另一种用法

interface Intf {...}  
  
class Outer {  
	public Intf createInner() {  
		return new Intf() {  
			// Anonymous inner class CANNOT have a named constructor  
			// only an instance initializer here  
			{  
				......  
			}  
  
			// method allowed here  
			return-type xxx(arg list) {  
				......  
			}   
		};  
	}  
}  

匿名内部类没有构造器, 只能 有一个 initializer (当然,你不用也可以);另外,可以在匿名内部类中写方法。

Comments