在网摘时看到一段这样的讨论,觉得有意思,主要内容如下:
我不知道我理解的匿名内部类和你理解的匿名内部类是否一样,不过应该是我这种理解,我给你举个例子:
import
java.awt.
*
;
import
java.awt.event.
*
;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
public
class
a
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
public a()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
System.out.println("eeeadfa");
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public static void main(String[] agrs)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
Frame f = new Frame();
Button b = new Button("OK");
b.addActionListener(new ActionListener()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
public ActionListener()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
System.out.println("eeeeee");
}
public void actionPerformed(ActionEvent e)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
System.out.println("aaaa");
}
});
f.add(b);
f.setSize(100,100);
f.setVisible(true);
new a();
}
}
这里面的ActionListener应该就叫匿名内部类了。可是这段程序连编译都通过不了,除非注释掉ActionListener的constructor才能正常运行。所以不要说只有一个,一个constructor都不能有,因为它是匿名内部类。我想楼主说的应该不是匿名内部类,要么是内部类吧??我想那就应该可以有多个constructor了。不知道我这样的理解是否正确,仅供参考。
你这个语法不对,当然编译不过了!
匿名内部类的constructor直接用花括号括起来就行了,不能加名字的。上面的程序中你应该
//public ActionListener()
{
System.out.println("eeeeee");
}
这样程序就可以过了!其中花括号中的就是constructor了!
呵呵,这个问题可以结贴了。:)我自己想出来了,真是愚昧啊!只要试下用两次花括号括起来就有了两个constructor,编译可以运行的!!当然这两个constructor都不带参数,其实应该还是理解为实质上一个constructor。举例如下:
public
class
Parcel9
...
{
public Destination
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
dest(final String dest, final float price) ...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
return new Destination() ...{
private int cost;
// Instance initialization for each object:
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
cost = Math.round(price);
if(cost > 100)
System.out.println("Over budget!");
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
System.out.println("The second constructor!");
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
private String label = dest;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public String readLabel() ...{ return label; }
};
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public static void main(String[] args) ...{
Parcel9 p = new Parcel9();
Destination d = p.dest("Tanzania", 101.395F);
//d.cost100();
System.out.println(d.readLabel());
}
}
Output是:
Over budget!
The second constructor!
Tanzania
Anonymous classes cannot have constructors, Java invokes their superclass constructor implicitly.
是不是很矛盾,为了弄清这个问题,或从中得到起发,我们先看看这段代码.
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/** */
/**
* @author Aaron
*
*/
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
public
class
A
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
System.out.println("1.I'm not sure who I am, so, I make the class A to test.");
};
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
static ...{
System.out.println("0.I'm a static block of A clasz.");
};
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public A(String string) ...{
this();
System.out.println(string);
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public A()...{
System.out.println("2.no arguments constructor");
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public static void main(String[] agrs) ...{
A a = new A("The first constructor");
a = new A("The second constructor");
}
}
程序运行结果如下:
0.I'm a static block of A clasz.
1.I'm not sure who I am, so, I make the class A to test.
2.no arguments constructor
The first constructor
1.I'm not sure who I am, so, I make the class A to test.
2.no arguments constructor
The second constructor
虽然这是一个我们熟得不能再熟的普通类了,但我想从其中能说明点问题.
1.先执行类中的静态块,这里要附带的讲一点就是,静态块实际是程序级的而不是类级的,什么意思呢,就是说不管你用不用类A,它都会在程序中被调用;并且是在main函数之前调用.
2."1.I'm not sure who I am, so, I make the class A to test."<==这是一个块; 并且有,每个类都可以申明多个"块",并且他在第次 new 的时候,在构造器之前被调用.
3.由第二点知识可以得知,Anonymous classes cannot have constructors是对的.而那个所谓"两个无参构造器"的段程序只是两个个块而已.