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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张洁 中级黑马   /  2012-6-6 19:28  /  1774 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

代码如下:
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为什么不输出呢?

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

6 个回复

倒序浏览
本帖最后由 黑马张扬 于 2012-6-6 20:03 编辑

静态代码块是用来初始化类 的  类一加载就执行了 是最先执行的  按你的代码顺序 所以打印了 hehe  hehe3
然后执行主函数里的代码语句   打印了hehe1   然后你的构造代码里是打印hehe2
构造代码块是在创建对象是初始化对象的 优先于构造函数  你并没有创建对象 所以就没执行!
  public static void main(int x) {
                System.out.println("hehe0");
        }
这个静态函数 你都没调用 当然也不会执行

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

回复 使用道具 举报
程序首先执行的是静态代码快的内容;
然后是main函数;
你的 public static void main(int x) {
                System.out.println("hehe0");
        }
参数不对,所以是个重载形式;不会是程序入口;
必须调用才会出现;
你的hehe2是在构造代码块中吗!所以必须new MainDemo();才会初始化这一句;
回复 使用道具 举报
类加载时会优先运行静态代码块中内容,且只执行一次,因此先打印hehe和hehe3
紧接着运行主函数,打印hehe1
hehe0和hehe2都没有运行
回复 使用道具 举报
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:32 编辑

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

在主函数中没有调用hehe0,和hehe2所以不会执行。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马