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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 idream 于 2014-4-21 21:30 编辑

                                         对象实例化过程
1,默认初始化
2,调用构造函数进行初始化
3,super();调用父类的构造函数进行初始化
4,显性初始化
5,进行子类构造函数的特定初始化

那么,构造函数初始化是哪步,是第2步呢?还是2,3,4,5都叫构造函数初始化呢?

3 个回复

正序浏览
本帖最后由 tacyjay在路上 于 2014-4-21 14:00 编辑
  1.        class StaticCode
  2.   {
  3.           int num=9;
  4.           StaticCode()//构造函数,new建立对象时就会调用
  5.           {
  6.                   System.out.println("d");
  7.           }
  8.           static //静态代码块:随类加载,且只加载一次
  9.           {
  10.                   System.out.println("a");//此处加上num的话,不能编译通过,静态随类加载时,非静态的num还未创建。
  11.           }        
  12.           //构造代码块,也叫结构代码块:只有创建对象,构造代码块才会执行。由于构造代码块是在构造函数调用的,每次创建对象都会执行1遍(且优于构造函数)!
  13.           {
  14.                   System.out.println("e"+num);
  15.           }
  16.                   StaticCode(int x)//构造函数,new建立对象时就会调用
  17.           {
  18.                   System.out.println("f");
  19.           }        
  20.           public static void show()
  21.           {
  22.                   System.out.println("show run");
  23.           }
  24.   }
  25.   class StaticCodeDemo
  26.   {
  27.           static
  28.           {
  29.                   System.out.println("b");
  30.           }
  31.           public static void main(String[] args)
  32.           {
  33.                   StaticCode.show();//调用类中方法,静态代码块随之加载。
  34.                   new StaticCode();//创建匿名对象,创建d,但不会再次创建a,因为调用show()时,静态代码块就已经加载一次了。
  35.                   new StaticCode(4);//构造函数,只调用对应的。
  36.                   System.out.println("over");        
  37.           }
  38.           static
  39.           {
  40.                   System.out.println("c");
  41.           }
  42.   }
  43. </p>
复制代码


构造函数初始化,是跟new一起的,一创建对象,就会调用构造函数初始化,然后第2步完成 ,
不过如果有父类的话,子类的构造函数第一行是会调用父类中默认空参数的构造函数的,所以构造函数的初始化,可以说包括2,3这两步。

我扩展了毕老师的那个例子,可以用来判断 静态代码块、构造函数、构造代码块 等的加载顺序,也可以帮助你理解一下。


吐槽:不知道为什么高级模式编辑的时候,添加代码都是在最上面,抓狂ing。。。。


评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 悠然丶 于 2014-4-21 13:43 编辑

这个我也不是很了解,上网专门查了资料..是这样说的..

1,在new B一个实例时首先要进行类的装载。
2,在装载类时,先装载父类A,再装载子类B
3,装载父类A后,完成静态动做
4,装载子类B后,完成静态动做

类装载完成,开始进行实例化
1,在实例化子类B时,先要实例化父类A
2,实例化父类A时,先成员实例化
3,父类A的构造函数
4,子类B的成员实例化
5,子类B的构造函数
回复 使用道具 举报
对象的初始化过程:

Person p=new Person("张",20);
1.new person类之后,加载person.class文件加载到内存中
2.执行该类中的static代码块,对Person.class进行初始化
3.在堆内存中开辟空间,分配内存地址
4.在堆内存中建立对象的特有属性,并对其默认初始化
5.对特定属性进行显示初始化
6.对对象进行构造代码块初始化
7.进行构造函数初始化
8.将内存地址付给栈中的对象变量。

评分

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

查看全部评分

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