`

[#0x0014] 匿名内部类:简化形式及自动向上转型

    博客分类:
  • Java
 
阅读更多

  内部类的一个重要作用是隐藏继承或是对接口的实现,典型的形式是:内部类来继承或是实现接口,由外部类提供代理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(),可以看作是自动的向上转型。

  如果匿名内部类的创建要传参,那么可以直接写在new Intf()的括号里。

  如果匿名内部类里要直接使用某个变量或是参数,那么这个变量或是参数必须是final(new Intf()的括号里也需要说明)(Todo:另作一篇详述)。

(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
			{
				......
			}

			// function allowed here
			return-type xxx(arg list)
			{
				......
			} 
		};
	}
}

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics