日期:2014-05-20  浏览次数:20658 次

高手大侠请进,我们好几人都无法解释的编译现象...
请耐心看下:
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的声明放到前面就行了。比如