高手大侠请进,小弟我们好几人都无法解释的编译现象.

高手大侠请进,我们好几人都无法解释的编译现象...请耐心看下:Java codeimport java.awt.*import java.awt

高手大侠请进,我们好几人都无法解释的编译现象...
请耐心看下:

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 / 基础类 小论坛”上面发的。不知道为什么这个论坛发帖子怎么这么不人性化。现在很郁闷啊。
[解决办法]
探讨
还是这个问题,如果把ButtonHandler.class在当前目录下删除
把编译出错.
有这个就正确.
这是为什么?????????????????????????????????

main读取这个匿名类的路线是怎么样的???

[解决办法]
这个程序根本不可能通过编译,更不用说调试了.
[解决办法]
class ButtonHandle
定义在了main()方法里,怎么行呢
[解决办法]
你这的确是内部类,但是不是匿名内部类,既然你自己给自己名字了,为什么还指望javac给你起个名字呢?
[解决办法]
你这的确是内部类,但是不是匿名内部类,既然你自己给自己名字了,为什么还指望javac给你起个名字呢?
[解决办法]
不知道lz在用什么环境编程序,你写的过程中ide不就提醒你什么错误吗?
[解决办法]
探讨
如果我在同目录下建一个ButtonHandler.class
编译就可以通过,大家试试看

[解决办法]
编译都通不过,注意以后怎么写内部类,要不然就创建匿名对象吧
[解决办法]
你的方法里面的 ButtonHandler根本没有被main方法使用,所以编译器实际去找的是外部的ButtonHandler.class


[解决办法]
修改方法很简单,你把内部class的声明放到前面就行了。比如


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[]) {    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");      }    }    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);  }}
[解决办法]
虽然写内部类也是可以的,但作为一个注重质量的程序员,我建议根本不要用这种写法.
多写一个文件也不麻烦,而且绝对避免了这样的问题,你就不会浪费时间在这里问这个问题了.

切记:最规范的是最有品质保证的! 除非你是牛人!
[解决办法]
探讨
虽然写内部类也是可以的,但作为一个注重质量的程序员,我建议根本不要用这种写法.
多写一个文件也不麻烦,而且绝对避免了这样的问题,你就不会浪费时间在这里问这个问题了.

切记:最规范的是最有品质保证的! 除非你是牛人!

[解决办法]
貌似这个是新手问题。。。。。。。。

你不知道原因是因为你没有明白使用原理所在。不过上面的人都说了,哈哈哈哈。