高手大侠请进,我们好几人都无法解释的编译现象...
请耐心看下:
Java code
import java.awt.*;
import java.awt.event.*;
public class Cen
{
private static Button b;
private static Button c;
public static void main(String args[])
{
Frame f=new Frame("Test");
b=new Button("Bc");
b.addActionListener(new ButtonHandler());
c=new Button("C");
c.addActionListener(new ButtonHandler());
f.setLayout(new FlowLayout());
f.add(b);
f.add(c);
f.setSize(200,100);
f.setVisible(true);
class ButtonHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
System.out.println("all");
if(e.getSource().equals(b))
System.out.println("b");
if(e.getSource().equals(c))
System.out.println("c");
}
}
}
}
这个程序是编译会出错的.这是肯定的.
现在的问题是在同一个目录下有已经ButtonHandler.class(它是编译正确的)
这样的情况使javac Cen.java 居然能编译正确.
这是为何,按理说内部类应该生成 Cen&ButtonHandler.class.
希望大家支持下,解释下...
------解决方案--------------------老兄,你好好看看,你的匿名类是写在方法中的,写在方法中的匿名类是不会出现Cen&ButtonHandler.class这种类的,因为Cen&ButtonHandler.class代表是Cen下的一个匿名类,而他是属于这个方法,而不是属于这个类的。
over!给分吧
------解决方案--------------------因为你的类定义在main方法中,其实生成的是Cen$1ButtonHandler.class
但是main方法无法访问它,如果只定义不使用,可以通过编译,否则根本编译不通过。
自己写程序注意这种非法的写法就是了。
------解决方案--------------------跟楼上一样 接分~~~
建议楼主别在main方法里写代码 在静态方法里写东西很不方便
------解决方案--------------------你的耦合太多了,我在另一个帖子里写了一个修改的,可以看看。
------解决方案--------------------偶是本论坛的新手,现在想问个问题,可是每次发新帖的时候都提示“无效的论坛编号
请核对论坛编号,请确定论坛存在且为”,因为新帖都不能发,所以不知道怎样问别人如何发帖子。情非得已,只好把问题附在lz的帖子下,希望lz莫要见怪。也请各位老鸟指点一下。
我的帖子是在“Java J2SE / 基础类 小论坛”上面发的。不知道为什么这个论坛发帖子怎么这么不人性化。现在很郁闷啊。
------解决方案--------------------
------解决方案--------------------这个程序根本不可能通过编译,更不用说调试了.
------解决方案--------------------class ButtonHandle
定义在了main()方法里,怎么行呢
------解决方案--------------------你这的确是内部类,但是不是匿名内部类,既然你自己给自己名字了,为什么还指望javac给你起个名字呢?
------解决方案--------------------你这的确是内部类,但是不是匿名内部类,既然你自己给自己名字了,为什么还指望javac给你起个名字呢?
------解决方案--------------------不知道lz在用什么环境编程序,你写的过程中ide不就提醒你什么错误吗?
------解决方案--------------------
------解决方案--------------------编译都通不过,注意以后怎么写内部类,要不然就创建匿名对象吧
------解决方案--------------------你的方法里面的 ButtonHandler根本没有被main方法使用,所以编译器实际去找的是外部的ButtonHandler.class
------解决方案--------------------修改方法很简单,你把内部class的声明放到前面就行了。比如