请耐心看下:
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.
希望大家支持下,解释下...

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【sure2003】截止到2008-07-14 16:52:32的历史汇总数据(不包括此帖):
    发帖的总数量:237                      发帖的总分数:10083                    每贴平均分数:42                       
    回帖的总数量:202                      得分贴总数量:5                        回帖的得分率:2%                       
    结贴的总数量:232                      结贴的总分数:9963                     
    无满意结贴数:2                        无满意结贴分:50                       
    未结的帖子数:5                        未结的总分数:120                      
    结贴的百分比:97.89 %               结分的百分比:98.81 %                  
    无满意结贴率:0.86  %               无满意结分率:0.50  %                  
    值得尊敬
      

  2.   

    老兄,你好好看看,你的匿名类是写在方法中的,写在方法中的匿名类是不会出现Cen&ButtonHandler.class这种类的,因为Cen&ButtonHandler.class代表是Cen下的一个匿名类,而他是属于这个方法,而不是属于这个类的。over!给分吧
      

  3.   

    因为你的类定义在main方法中,其实生成的是Cen$1ButtonHandler.class
    但是main方法无法访问它,如果只定义不使用,可以通过编译,否则根本编译不通过。
    自己写程序注意这种非法的写法就是了。
      

  4.   

    跟楼上一样  接分~~~建议楼主别在main方法里写代码  在静态方法里写东西很不方便
      

  5.   

    还是这个问题,如果把ButtonHandler.class在当前目录下删除
    把编译出错.
    有这个就正确.
    这是为什么?????????????????????????????????main读取这个匿名类的路线是怎么样的???
      

  6.   

    偶是本论坛的新手,现在想问个问题,可是每次发新帖的时候都提示“无效的论坛编号
    请核对论坛编号,请确定论坛存在且为”,因为新帖都不能发,所以不知道怎样问别人如何发帖子。情非得已,只好把问题附在lz的帖子下,希望lz莫要见怪。也请各位老鸟指点一下。
    我的帖子是在“Java J2SE / 基础类 小论坛”上面发的。不知道为什么这个论坛发帖子怎么这么不人性化。现在很郁闷啊。
      

  7.   

    class ButtonHandle
    定义在了main()方法里,怎么行呢
      

  8.   

    你这的确是内部类,但是不是匿名内部类,既然你自己给自己名字了,为什么还指望javac给你起个名字呢?
      

  9.   

    你这的确是内部类,但是不是匿名内部类,既然你自己给自己名字了,为什么还指望javac给你起个名字呢?
      

  10.   

    不知道lz在用什么环境编程序,你写的过程中ide不就提醒你什么错误吗?
      

  11.   

    如果我在同目录下建一个ButtonHandler.class
    编译就可以通过,大家试试看
      

  12.   

    16楼:你先写一段相对正确的代码:
    port java.awt.event.*;
    class ButtonHandler implements ActionListener
         {
         public void actionPerformed(ActionEvent e)
           {
             System.out.println("LoveLove");
           }
         }javac ButtonHandler 
    这样 和Cen.java 在同一目录下就有ButtonHandler.class
    你们相信吗?这样编译会成功的.
    请问为什么???
      

  13.   

    你的方法里面的 ButtonHandler根本没有被main方法使用,所以编译器实际去找的是外部的ButtonHandler.class
      

  14.   

    修改方法很简单,你把内部class的声明放到前面就行了。比如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);
      }
    }