java代码:new 类名(){方法定义}应该如何理解?

下面这些代码是放在一个类的内部的。
class test { //class开始
jPanel2 = new JPanel (){
protected void paintComponent(Graphics g){
//代码
}
};
componet.addMouseListener(new MouseAdapter() {
public void mouseReleased(MouseEvent me) {
// 这里写你想做的事情
}
});

问题:1、 new 类名(){方法定义};
这些应该如何理解?java类的定义我是明白的,但这种写法不明白。
2、监听mouse事件不应该实现MouseListener这个接口吗?上例(2)中怎么是MouseAdapter?

new 类名(){方法定义} 这种写法是匿名内部类。


1、匿名内部类就是没有名字的内部类。这是Java为了方便程序员编写程序,而设计的一个机制。因为有时候有的内部类只需要创建一个它的对象就可以了,以后再不会用到这个类,这时候使用匿名内部类就比较合适,而且也免去了给它取名字的烦恼。

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

3、用匿名内部类创建多线程有两种方式,和创建一个线程是一样的。

第①种继承Thread:

new Thread(){
    public void run(){
//do something
    };
}.start();



第②种实现 Runnable接口:

new Thread(new Runnable() {
    public void run() {
 //do something
    };
}) { }.start();

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-03-26
1、 new 类名(){方法定义};
定义完类名以后,就在类里面定义想要的方法。
2、监听mouse事件不应该实现MouseListener这个接口吗?上例(2)中怎么是MouseAdapter?
MouseAdapter 实现了MouseListener接口,如果直接实现MouseListener,必须实现接口的5个方法(mouseClicked,mouseEntered, mouseExited,mousePressed,mouseReleased)。但是这里只想要实现其中一个方法mouseReleased,所以可以使用实现了MouseListener接口的类MouseAdapter ,这样就可以只写自己想要用的方法,别的方法都不用管。本回答被提问者采纳
第2个回答  2012-03-26
new 类名(){方法定义};是对应一个内部类。
MouseAdapter事故addMouseListener的调用参数。
第3个回答  2015-11-17
匿名内部类:
顾名思义,没有名字的内部类。表面上看起来它们似乎有名字,实际那不是它们的名字。
当程序中使用匿名内部类时,在定义匿名内部类的地方往往直接创建该类的一个对象。匿名内部类的声明格式如下:
new ParentName(){
...// 内部类的定义
}[1]
匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:
·只用到类的一个实例 。
·类在定义后马上用到。
·类非常小(SUN推荐是在4行代码以下)
·给类命名并不会导致你的代码更容易被理解。
在使用匿名内部类时,要记住以下几个原则:
·匿名内部类不能有构造方法。
·匿名内部类不能定义任何静态成员、静态方法。
·匿名内部类不能是public,protected,private,static。
·只能创建匿名内部类的一个实例。
·一个匿名内部类一定是在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 another 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();
}
}
上面的代码很怪,好像是在实例化一个接口。事实并非如此,接口式的匿名内部类是实现了一个接口的匿名类。而且只能实现一个接口。
C、参数式的匿名内部类。
class Bar{
void doStuff(Foo f){
f.foo();
}
}
interface Foo{
void foo();
}
class Test{
static void go(){
Bar b = new Bar();
b.doStuff(new Foo(){
public void foo(){
System.out.println("foofy");
}
});
}
}
第4个回答  2015-11-10
这是内部类的写法
相似回答