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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© love$$-IT 中级黑马   /  2015-2-27 22:58  /  998 人查看  /  11 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

构造代码块的加载顺序?int i=1000;{  };和构造函数的顺序?

11 个回复

倒序浏览
类的成员变量的定义先于构造代码块的执行,而构造代码块又先于构造函数执行,在构造代码块中可以对类的成员变量进行初始化等,所以成员变量都已在构造代码块执行前定义好,构造代码块又是多个构造函数的公共的部分(一般构造函数的公共部分会在构造代码块中),所以优先于构造函数执行。

点评

学习了~~~  发表于 2015-2-28 11:37

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1 很给力!

查看全部评分

回复 使用道具 举报
成员变量先运行,构造代码块是对所有对象进行初始化,构造函数是对指定的对象进行初始化,所以构造代码块先运行
回复 使用道具 举报
Hsidar 发表于 2015-2-27 23:14
类的成员变量的定义先于构造代码块的执行,而构造代码块又先于构造函数执行,在构造代码块中可以对类的成员 ...

准确地说:
1. 构造代码块和成员变量定义优先于大多数而非全部构造函数代码。因为构造函数中调用父类构造函数的代码是优先于构造代码块和成员变量定义执行的。比如下面这段代码:
  1. public class Test {

  2.         public static void main(String[] args){
  3.                 new B();
  4.         }
  5. }

  6. class A {
  7.         public A() {
  8.                 System.out.println("A's constructor");
  9.         }
  10.        
  11. }

  12. class B extends A {
  13.         {
  14.                 System.out.println("B's initialization block");
  15.         }
  16.        
  17.         public B() {
  18.                 System.out.println("B's constructor");
  19.         }
  20.        
  21. }
复制代码


输出结果是:
A's constructor
B's initialization block
B's constructor

2. 构造代码块和成员变量声明的执行顺序取决于二者的先后位置。谁放在前面就先执行谁。因此,下面这段代码:
  1. public class Test {
  2. {
  3.                 System.out.println("initialization block");
  4.         }

  5.         String str = printStr();
  6.        
  7.         static String printStr() {
  8.                 System.out.println("printStr");
  9.                 return "str";
  10.         }
  11.         public static void main(String[] args){
  12.                 new Test();
  13.         }
  14. }
复制代码

的输出结果是:
initialization block
printStr


  1. public class Test {
  2.         String str = printStr();
  3.         {
  4.                 System.out.println("initialization block");
  5.         }

  6.        
  7.         static String printStr() {
  8.                 System.out.println("printStr");
  9.                 return "str";
  10.         }
  11.         public static void main(String[] args){
  12.                 new Test();
  13.         }
  14. }
复制代码

的输出结果是:
printStr
initialization block
回复 使用道具 举报
静态代码块->赋值->构造代码块->构造函数
回复 使用道具 举报
确切的顺序应该是:静态代码块->静态常量赋值->变量赋值->构造代码块->静态构造函数->构造函数

点评

呃。。还有你的那个代码是怎么粘上去的?就是那个可以粘贴的那个。@fantacyleo  发表于 2015-2-28 10:18
哦,如果不考虑继承,并且代码按常用顺序写的话,我这个应该是对的吧?。。  发表于 2015-2-28 10:17
不对。详见4楼  发表于 2015-2-28 10:10
回复 使用道具 举报
1.首先要明白构造代码块是将所有构造函数的共性放于构造代码块中,所以其是优先于构造函数执行。即构造代码块的优先级大。
2.对于Static{} 静态代码块,当加载类的过程中,Static静态代码块就会执行,static的静态代码块对于同一个类只加载一次,如new person();new person();只会加载一次静态代码块,与抽取的共性的构造代码块有所区别。
3.我给出了具体执行顺序,代码块的优先执行顺序为:Static{}静态代码块 (类加载过程就会执行一次)>构造代码块(原因是当产生对象时才会调用)>构造函数,static优先于主函数执行,因为它随着类的加载而加载,而主函数需要调用。
回复 使用道具 举报
进来长知识了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马