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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© java陈辉 中级黑马   /  2013-12-18 20:50  /  1269 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

下面这段代码为什么先执行了构造代码块中的语句,然后在执行构造函数中的语句?而不是只执行构造函数里面的语句,不执行构造代码块的语句?构造代码块里面的语句一定要执行吗?求解释。
public class Test {

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

        }

}
class A
{
    int num=8;
    {
            System.out.println("cons code num="+num);
    }

    A(){
            System.out.println("cons function num="+num);
    }
}


评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

6 个回复

倒序浏览
http://www.cnblogs.com/ShawnWithSmallEyes/p/3374235.html
回复 使用道具 举报
先执行构造代码块→后执行构造函数 , 构造代码块是给所有对象进行统一初始化。而构造函数只给对应的对象初始化。只要new一个对象2个一定都执行的
public class Test {

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

        }

}
class A
{
    int num=8;
    { int num=82;
            System.out.println("cons code num="+num);//构造代码块先执行cons code num=82
    }

    A(){
            int num=18;
            System.out.println("cons function num="+num);//构造函数后执行cons function num=18
    }
}

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
毕老师有讲过的,一个对象实例化的过程如下:
(1)加载classA进内存;
(2)加载该类的静态变量、静态代码块、静态方法,所有静态依据代码顺序执行;
(3)执行该类的构造代码块;
(4)在内存开辟空间,加载该类的非静态变量,并默认初始化;
(5)执行该类类构造函数;
(6)给变量显示初始化。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
感觉没有为什么,就像问为什么System.out.println()是输出语句,就是按照顺序执行的。
先静态代码块初始化,再构造代码块初始化,再父类构造器初始化,
再显示初始化,再子类构造器初始化。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
构造函数:
作用:对象一建立就会调用与之对应的构造函数,所以可以给对象进行初始化。
构造代码块:作用:给对象进行初始化。对象一建立就运行,而且优先于构造函数执行。
构造代码块与构造函数的区别:构造代码块是给所有对象进行统一初始化。而构造函数只给对应的对象初始化
楼主的public class Test {

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

         }

}
class A
{
     int num=8;//这是构造代码块,优于构造函数先执行。
     {
             System.out.println("cons code num="+num);
     }

     A(){
             System.out.println("cons function num="+num);//这是构造函数,后执行,
     }
楼主明白了吗

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
静态代码块:用于给类初始化,类加载时就会被加载执行,只加载一次。
构造代码块:用于给对象初始化的。只要建立对象该部分就会被执行,且优先于构造函数。
构造函数:  给对应对象初始化的,建立对象时,选择相应的构造函数初始化对象。               
创建对象时,三者被加载执行顺序:静态代码块--->构造代码块--->构造函数

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马