匿名内部类

 

 

I:匿名内部类声明:


1.new Xxxx() { /* class body. */ }
    --where Xxxx is a class or interface name.


   2.Xxxx anXxxx = new Xxxx () { /* class body. */ };

 --Assign the reference to the constructed object into a variable.Notice that you must be sure to make a

complete statement, including the closing semicolon.


      3.someMethod(new Xxxx () { /* class body. */ });

--you might use the reference to the constructed object as an argument to a method call.

 

II:内部类构造函数:

如果继承的类的构造函数有参数,则必须传递一个参数。

If the anonymous inner class extends another class, and that parent class has constructors that take  

arguments, then you can arrange for one of these constructors to be invoked by specifying the argument list to

the construction of the anonymous inner class. An example follows:


// Assume this code appears in some method
Button b = new Button(“Anonymous Button “) {
// behavior for the button
};
// do things with the button b...
...

 

from http://blog.csdn.net/yakihappy/archive/2009/03/11/3979863.aspx

 

匿名类是一种特殊的内部类,它是在一个表达式内部包含一个完整的类定义。所谓的匿名就是该类连名字都没有匿名内部类不可以有构造器 因为匿名内部类是要扩展或实现父类或接口 匿名内部类可以继承其他类,因为是类就是继承自 Object 类的。

匿名内部类实现接口指的是类本身定义的时候



实现接口还是直接定义匿名内部类的时候


实现接口,前者肯定是可以的,后者应该是不行的,光从语法上都不能实现,如


class B { 

class C

public void z()

Thread t=new Thread(new A(){//
这里定义了一个无名内部类,要实现接口,语法上都是不能实现

public void run() { }

});


}


class A extends B implements Runnable,Serializable,Cloneable


{ //

如果在new 
以后写继承其他类或是实现接口都是错误


public void run(){ }


}


} 


public class A {



   int i = 1;



   public A() {



     Thread thread = new Thread() {//


匿名内部类




       public void run() {



         for(;;) {    

A.this.run();/
/
用到了外部类的 run 函数,用外部类的类名加上 this 引用来说明要调用的是外部类的方法 run

           try {



             sleep(1000);



           } catch(InterruptedException ie) {



           }



         }//for



       }//run



     };//Thread



     thread.start();



   } //A






()




   public void run() {



     System.out.println("i = " + i);



     i++;



   }



   public static void main(String[] args) throws Exception {


     new A();



   }

}

本地内部类与匿名内部类的区别在于本地内部类有构造函数,而匿名内部类只能实例初始化。

匿名内部类:通常用在Java 的事件处理上

 

package inner;
import java.applet.*;
import java.awt.event.*;
public class AnonymousInnerClassDemo extends Applet{
   public void init()   {
     addMouseListener(new MouseAdapter(){
       public void mousePressed(MouseEvent me){
       showStatus("Mouse Pressed!");//
这个匿名内部类可以访问外部类的方法showStatus. }
     });
   }
   public void showStatus(String str){

System.out.println(str); }
}


在上面的例子中, 方法addMouseListener 接受一个对象型的参数表达式, 于是, 在参数里, 我们定义了一个匿名内部类, 这个类是一个MouseAdapter 类型的类 , 同时在这个类中定义了一个继承的方法 mousePressed, 整个类做为一个参数. 这个类没有名称 , 但是当执行这个 表达式 时它被自动实例化 .

 

内部类的继承问题

http://blog.csdn.net/java2000_net/archive/2008/09/30/2994149.aspx

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值