A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李政 中级黑马   /  2012-10-15 15:28  /  1838 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李政 于 2013-7-26 10:07 编辑

下面的代码是毕老师第22课编写的一个代码 我有个疑问,在这个代码中,主函数是在FrameDemo的类中被执行的,
那么主函数在执行new FrameDemo()的时候不是会继续执行一次new FrameDemo()吗?
这样子不就无限循环下去了?但为什么能正常执行而没有出问题呢?
import java.awt.*;
import java.awt.event.*;


class  FrameDemo
{

        //定义该图形中所需的组件的引用。
        private Frame f;
        private Button but;

        FrameDemo()
        {
                init();
        }

        public void init()
        {
                f = new Frame("my frame");

                //对frame进行基本设置。
                f.setBounds(300,100,600,500);
                f.setLayout(new FlowLayout());

                but = new Button("my button");

                //将组件添加到frame中
                f.add(but);


                //加载一下窗体上事件。
                myEvent();

                //显示窗体;
                f.setVisible(true);

        }
        private void myEvent()
        {
                f.addWindowListener(new WindowAdapter()
                {
                        public void windowClosing(WindowEvent e)
                        {
                                System.exit(0);
                        }
                });

                //让按钮具备退出程序的功能
                /*
                按钮就是事件源。
                那么选择哪个监听器呢?
                通过关闭窗体示例了解到,想要知道哪个组件具备什么样的特有监听器。
                需要查看该组件对象的功能。
                 通过查阅button的描述。发现按钮支持一个特有监听addActionListener。

                */
                but.addActionListener(new ActionListener()
                {
                        private int count = 1;
                        public void actionPerformed(ActionEvent e)
                        {
                                //System.out.println("退出,按钮干的");
                                //System.exit(0);
                                
                                //f.add(new Button("Button-"+(count++)));
                                //f.setVisible(true);
                                //f.validate();

                                //System.out.println(e.getSource());
                                Button b = (Button)e.getSource();
                                
                                Frame f1 = (Frame)b.getParent();

                                f1.add(new Button("button-"+count++));
                                f1.validate();


                        }
                });
        }



        public static void main(String[] args)
        {
                new FrameDemo();
        }
}

问题解决:

JVM只能识别类中成员函数为主函数

主函数中创建的本类对象,这个对象中的主函数只是一个方法,并不能被JVM识别

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1

查看全部评分

2 个回复

倒序浏览
假设猪函数里边只有一句输出语句
System.out.println("完了吗?完了!“);

执行完之后整个函数就结束了。
new FrameDemo();
这句也同样。
回复 使用道具 举报
本帖最后由 陈军 于 2012-10-15 16:12 编辑

new FrameDemo();
表示创建了一个匿名对象,并执行对应构造函数。
你说的死循环new对象一般2种,1是因为构造函数里面New自己对象,而new的时候又调用构造,又new...
                             2构造一个属性new自己对象,结果构造又调用这个引用属性
比如这个
class A{
        private A aa=new A();
        int i=0;
        A(){
                aa.i=20;
        }        
}再调用这个类的话
        就会一直new下去,才会一直执行。不停止
而而毕老师这个,明显没有死循环,它new的不是本类,而是引进的Frame类。只在初始化时才执行。

所以你如果在创建自己本类对象作为属性,构造函数就别调用这个属性。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马