黑马程序员技术交流社区

标题: 关于主程序加载时运行顺序的问题 [打印本页]

作者: 张洁    时间: 2012-6-6 19:28
标题: 关于主程序加载时运行顺序的问题
代码如下:
public class MainDemo {

        /**
         * @param args
         */
       
        static {
                System.out.println("hehe");
        }
       
        public static void main(int x) {
                System.out.println("hehe0");
        }
       
        public static void main(String[] args) {                       
                System.out.println("hehe1");
               
        }
       
        {
                System.out.println("hehe2");
        }
       
        static {
                System.out.println("hehe3");
        }

}

最后输出结果是:
hehe
hehe3
hehe1
为什么是这个顺序?还有我的hehe0  hehe2为什么不输出呢?
作者: 黑马张扬    时间: 2012-6-6 19:59
本帖最后由 黑马张扬 于 2012-6-6 20:03 编辑

静态代码块是用来初始化类 的  类一加载就执行了 是最先执行的  按你的代码顺序 所以打印了 hehe  hehe3
然后执行主函数里的代码语句   打印了hehe1   然后你的构造代码里是打印hehe2
构造代码块是在创建对象是初始化对象的 优先于构造函数  你并没有创建对象 所以就没执行!
  public static void main(int x) {
                System.out.println("hehe0");
        }
这个静态函数 你都没调用 当然也不会执行
作者: 梁小波    时间: 2012-6-6 20:06
程序首先执行的是静态代码快的内容;
然后是main函数;
你的 public static void main(int x) {
                System.out.println("hehe0");
        }
参数不对,所以是个重载形式;不会是程序入口;
必须调用才会出现;
你的hehe2是在构造代码块中吗!所以必须new MainDemo();才会初始化这一句;

作者: 信义明    时间: 2012-6-6 20:11
类加载时会优先运行静态代码块中内容,且只执行一次,因此先打印hehe和hehe3
紧接着运行主函数,打印hehe1
hehe0和hehe2都没有运行
作者: 李文富    时间: 2012-6-6 20:12
package interview;
public class MainDemo {
    /**
     * @param args
     */
   
    static {
            System.out.println("hehe");
           //静态代码块随类的调用优先加载到内存,因为放在main函数之前故比main还要先载入;
    }
   
    public static void main(int x) {
            System.out.println("hehe0");
            //普通的静态方法,方法名叫main,接受int型;
            //可以看下面的调用,因为虽和main同名但是不是接受 String[] args 故非主函数;

    }
   
    public static void main(String[] args) {                        
            System.out.println("hehe1");
            main(1);
            new MainDemo();//此处可以看到打印结果;

    }
   

   
    static {
         //同理
            System.out.println("hehe3");
    }
   
    //类的默认代码块,随类的创建实例对象而加载 ,一个类只可一个这样的代码块
    {
     System.out.println("hehe2");
     }
}
/*hehe
hehe3
hehe1
hehe0
hehe2*/


作者: 丰亚彬    时间: 2012-6-6 20:14
论坛里面有个贴子,总结的非常好,去看看就知道了
作者: 吴小铁你好    时间: 2012-6-6 20:31
本帖最后由 吴小铁你好 于 2012-6-6 20:32 编辑

这涉及到java中程序的执行顺序,
1.静态代码块。
2.块。
3.构造器
4.父类构造器。
在这段代码中选执行静态代码块static,所以先答应:hehe hehe3.最后执行主函数:hehe1.

在主函数中没有调用hehe0,和hehe2所以不会执行。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2