黑马程序员技术交流社区

标题: 构造代码块 [打印本页]

作者: love$$-IT    时间: 2015-2-27 22:58
标题: 构造代码块
构造代码块的加载顺序?int i=1000;{  };和构造函数的顺序?
作者: Hsidar    时间: 2015-2-27 23:14
类的成员变量的定义先于构造代码块的执行,而构造代码块又先于构造函数执行,在构造代码块中可以对类的成员变量进行初始化等,所以成员变量都已在构造代码块执行前定义好,构造代码块又是多个构造函数的公共的部分(一般构造函数的公共部分会在构造代码块中),所以优先于构造函数执行。
作者: ㏒假™面具    时间: 2015-2-27 23:21
成员变量先运行,构造代码块是对所有对象进行初始化,构造函数是对指定的对象进行初始化,所以构造代码块先运行
作者: fantacyleo    时间: 2015-2-27 23:42
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

作者: 埗箬    时间: 2015-2-28 10:04
静态代码块->赋值->构造代码块->构造函数
作者: 埗箬    时间: 2015-2-28 10:08
确切的顺序应该是:静态代码块->静态常量赋值->变量赋值->构造代码块->静态构造函数->构造函数
作者: 奋斗小青年    时间: 2015-2-28 10:45
1.首先要明白构造代码块是将所有构造函数的共性放于构造代码块中,所以其是优先于构造函数执行。即构造代码块的优先级大。
2.对于Static{} 静态代码块,当加载类的过程中,Static静态代码块就会执行,static的静态代码块对于同一个类只加载一次,如new person();new person();只会加载一次静态代码块,与抽取的共性的构造代码块有所区别。
3.我给出了具体执行顺序,代码块的优先执行顺序为:Static{}静态代码块 (类加载过程就会执行一次)>构造代码块(原因是当产生对象时才会调用)>构造函数,static优先于主函数执行,因为它随着类的加载而加载,而主函数需要调用。

作者: 自学小番薯    时间: 2015-2-28 11:42
进来长知识了




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