java匿名内部类

  匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:
  ·只用到类的一个实例。
  ·类在定义后马上用到。
  ·类非常小(SUN推荐是在4行代码以下)
  ·给类命名并不会导致你的代码更容易被理解。
  在使用匿名内部类时,要记住以下几个原则:
  ·匿名内部类不能有构造方法。
  ·匿名内部类不能定义任何静态成员、方法和类。
  ·匿名内部类不能是public,protected,private,static。
  ·只能创建匿名内部类的一个实例。
  ·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
  ·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。

如果匿名内部类需要访问外部类的局部变量,则必须使用final修饰符来修饰外部类的局部变量,否则系统将报错。

定义匿名内部类的格式如下:
 new 父类构造器(参数列表)|实现接口()
{
//匿名内部类的类体部分
}



A、继承式的匿名内部类
 
public class Car{
public void drive(){
System.out.println("Driving a car!");
}

public static void main( String[] args){
Car car = new Car(){
public void drive(){
System.out.println("Driving anther car!");
}
};

car.drive();
}
}

  结果输出了:Driving another car! Car引用变量不是引用Car对象,而是Car匿名子类的对象。
通过继承父类来创建匿名内部类时,匿名内部类将拥有和父类相似的构造器,此处的相似指的是拥有相同的形参列表。


B、接口式的匿名内部类。
  
interface Vehicle
{
public void drive();
}

class Test
{
public static void main( String[] args )
{
Vehicle v = new Vehicle()
{
public void drive()
{
System.out.println( "Driving a car!" );
}
};
v.drive();
}
}

  上面的代码很怪,好像是在实例化一个接口。事实并非如此,接口式的匿名内部类是实现了一个接口的匿名类。而且只能实现一个接口。
当通过实现接口来创建匿名内部类时,匿名内部类也不能显示创建构造器,因此匿名内部类只有一个隐式的无参数构造器,故new接口名后的括号里不能传入参数值。
当创建匿名内部类时,必须实现接口或抽象父类里的所有抽象方法。如果有需要,也可以重写父类中的普通方法


C、参数式的匿名内部类。
  
Class Bar{
void doStuff( Foo f )
{
}
}

interface Foo
{
void foo();
}

class Test
{
static void go()
{
Bar b = new Bar();
b.doStuff( new Foo()
{
public void foo()
{
System.out.println( "foofy" );
}
} );
}
}


参考:
内部类[url]http://www.iteye.com/topic/442435[/url]
匿名内部类[url]http://blog.csdn.net/liuzhidong123/article/details/6561521[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值