黑马程序员技术交流社区
标题:
关于父类静态代码块和子类静态代码块以及父类构造函数.....
[打印本页]
作者:
乔叶旭
时间:
2012-12-1 22:50
标题:
关于父类静态代码块和子类静态代码块以及父类构造函数.....
本帖最后由 乔叶旭 于 2012-12-3 21:39 编辑
父类静态代码块,父类构造器,子类静态代码块,父类构造代码块,子类构造函数,子类构造代码块的执行顺序是什么样的啊???
作者:
方建平
时间:
2012-12-1 23:53
构造器初始化顺序如下:
1 基类static成员初始化
2 子类static成员初始化
3 基类对象成员默认初始化(按照声明的顺序)
4 子类成员默认初始化(按照声明的顺序)
5 子类构造函数调用父类构造函数(如果子类构造器中没有显式的调用父类构造函数,那么父类必须提供一个无参构造器供子类调用。如果所有子类构造器中显式调用父类其他的构造函数,那么就不会执行父类默认构造函数,并且编译时不会强制父类提供默认构造函数)
6 子类构造函数执行
下面的代码输出结果如下:
Base Static Init
Derived Static Init
BaseInit with args:0
DerivedInit
--------------------
BaseInit with args:1
DerivedInit with args:1
class Puppy{
public Puppy(String name)
{
System.out.println( name);
}
}
class BaseInit{
public static Puppy basePuppy = new Puppy("Base Static Init");
/* Unless every derived class's constructors call base class's constructors
* explicitly, base class must have a default constructor
*/
/*
public BaseInit()
{
System.out.println("BaseInit");
}
*/
public BaseInit(Integer i)
{
System.out.println("BaseInit with args:"+i);
}
}
class DerivedInit extends BaseInit{
public static Puppy derivedPuppy= new Puppy("Derived Static Init");
public DerivedInit()
{
/* call base class's constructor explicitly */
super(0);
System.out.println("DerivedInit");
}
public DerivedInit(Integer i)
{
super(i);
System.out.println("DerivedInit with args:"+i);
}
}
public class InitOrder {
public static void main(String args[]){
DerivedInit derivedInit = new DerivedInit();
System.out.println("--------------------");
DerivedInit derivedInit2 = new DerivedInit(1);
}
}
复制代码
作者:
深井看海
时间:
2012-12-1 23:59
Person p = new Person(“zhangsan”,20);
这句话都做了什么事情?
1. 因为new用到了Person .class,所以会先找到Person .class文件并加载到内存中
2. 执行该类中的static代码块,如果有的话,给Person .class类进行初始化
3. 在堆内存中开辟空间,分配内存地址
4. 在堆内存中建立对象的特有属性,并进行默认初始化
5. 对属性进行显示初始化
6. 对对象进行构造代码块初始化
7. 对对象进行对应的构造函数初始化
8. 将内存地址赋给栈内存中的p变量
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2