黑马程序员技术交流社区
标题:
对象实例化过程--构造函数初始化是哪步?
[打印本页]
作者:
idream
时间:
2014-4-21 13:14
标题:
对象实例化过程--构造函数初始化是哪步?
本帖最后由 idream 于 2014-4-21 21:30 编辑
对象实例化过程
1,默认初始化
2,调用构造函数进行初始化
3,super();调用父类的构造函数进行初始化
4,显性初始化
5,进行子类构造函数的特定初始化
那么,构造函数初始化是哪步,是第2步呢?还是2,3,4,5都叫构造函数初始化呢?
作者:
tjsyj
时间:
2014-4-21 13:20
对象的初始化过程:
Person p=new Person("张",20);
1.new person类之后,加载person.class文件加载到内存中
2.执行该类中的static代码块,对Person.class进行初始化
3.在堆内存中开辟空间,分配内存地址
4.在堆内存中建立对象的特有属性,并对其默认初始化
5.对特定属性进行显示初始化
6.对对象进行构造代码块初始化
7.进行构造函数初始化
8.将内存地址付给栈中的对象变量。
作者:
悠然丶
时间:
2014-4-21 13:42
本帖最后由 悠然丶 于 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的构造函数
作者:
tacyjay在路上
时间:
2014-4-21 13:47
本帖最后由 tacyjay在路上 于 2014-4-21 14:00 编辑
class StaticCode
{
int num=9;
StaticCode()//构造函数,new建立对象时就会调用
{
System.out.println("d");
}
static //静态代码块:随类加载,且只加载一次
{
System.out.println("a");//此处加上num的话,不能编译通过,静态随类加载时,非静态的num还未创建。
}
//构造代码块,也叫结构代码块:只有创建对象,构造代码块才会执行。由于构造代码块是在构造函数调用的,每次创建对象都会执行1遍(且优于构造函数)!
{
System.out.println("e"+num);
}
StaticCode(int x)//构造函数,new建立对象时就会调用
{
System.out.println("f");
}
public static void show()
{
System.out.println("show run");
}
}
class StaticCodeDemo
{
static
{
System.out.println("b");
}
public static void main(String[] args)
{
StaticCode.show();//调用类中方法,静态代码块随之加载。
new StaticCode();//创建匿名对象,创建d,但不会再次创建a,因为调用show()时,静态代码块就已经加载一次了。
new StaticCode(4);//构造函数,只调用对应的。
System.out.println("over");
}
static
{
System.out.println("c");
}
}
</p>
复制代码
构造函数初始化,是跟new一起的,一创建对象,就会调用构造函数初始化,然后第2步完成 ,
不过如果有父类的话,子类的构造函数第一行是会调用父类中默认空参数的构造函数的,所以构造函数的初始化,可以说包括2,3这两步。
我扩展了毕老师的那个例子,可以用来判断 静态代码块、构造函数、构造代码块 等的加载顺序,也可以帮助你理解一下。
吐槽:不知道为什么高级模式编辑的时候,添加代码都是在最上面,抓狂ing。。。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2