高手大侠请进,我们好几人都无法解释的编译现象...请耐心看下: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 / 基础类 小论坛”上面发的。不知道为什么这个论坛发帖子怎么这么不人性化。现在很郁闷啊。
[解决办法]
[解决办法]
这个程序根本不可能通过编译,更不用说调试了.
[解决办法]
class ButtonHandle
定义在了main()方法里,怎么行呢
[解决办法]
你这的确是内部类,但是不是匿名内部类,既然你自己给自己名字了,为什么还指望javac给你起个名字呢?
[解决办法]
你这的确是内部类,但是不是匿名内部类,既然你自己给自己名字了,为什么还指望javac给你起个名字呢?
[解决办法]
不知道lz在用什么环境编程序,你写的过程中ide不就提醒你什么错误吗?
[解决办法]
[解决办法]
编译都通不过,注意以后怎么写内部类,要不然就创建匿名对象吧
[解决办法]
你的方法里面的 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); }}
[解决办法]
虽然写内部类也是可以的,但作为一个注重质量的程序员,我建议根本不要用这种写法.
多写一个文件也不麻烦,而且绝对避免了这样的问题,你就不会浪费时间在这里问这个问题了.
切记:最规范的是最有品质保证的! 除非你是牛人!
[解决办法]
[解决办法]
貌似这个是新手问题。。。。。。。。
你不知道原因是因为你没有明白使用原理所在。不过上面的人都说了,哈哈哈哈。
