今天想说说java在创建对象的时候的初始化顺序,其实大家如果笔试,或者面试的时候,经常会遇到一些初始化的问题,反正我是遇到过。今天我们就来看看。
先看下我写的几个示例类,一个父类,一个子类继承这个父类,最简单的模式。
Java代码
/**父类*/
package test;
public class Father {
static
{ System.out.println("父类静态初始化块");}
{ System.out.println("父类初始化块"); }
private static int b = 1;
public Father() {
System.out.println("调用了父类无参构造器");
}
public Father(int b) {
this.b = b;
System.out.println("调用父类的有参构造器");
}
}
/**父类*/
package test;
public class Father {
static
{ System.out.println("父类静态初始化块");}
{ System.out.println("父类初始化块"); }
private static int b = 1;
public Father() {
System.out.println("调用了父类无参构造器");
}
public Father(int b) {
this.b = b;
System.out.println("调用父类的有参构造器");
}
}
Java代码
/**子类*/
package test;
public class Son extends Father {
static
{ System.out.println("子类静态初始化块"); }
{ System.out.println("子类初始化块"); }
private static int a =1;
public Son() {
System.out.println("调用子类的构造器");
}
public Son(int a){
this.a=a;
System.out.println("调用子类的有参构造器");
}
}
/**子类*/
package test;
public class Son extends Father {
static
{ System.out.println("子类静态初始化块"); }
{ System.out.println("子类初始化块"); }
private static int a =1;
public Son() {
System.out.println("调用子类的构造器");
}
public Son(int a){
this.a=a;
System.out.println("调用子类的有参构造器");
}
} 单独的一个对象初始化,不含继承和其他情况
Java代码
package test;
public class Test {
public static void main(String[] args) {
Father father = new Father();
}
}
package test;
public class Test {
public static void main(String[] args) {
Father father = new Father();
}
}
打印的结果为:
父类静态初始化块
父类初始化块
调用了父类无参构造器
我们来分析下,大家都知道静态对象(包括静态块,静态方法,静态属性),都是和类相关联的。当第一次创建对象的时候,首先初始化的应该是静态对象,然后才是非静态对象,最后才是构造器去创建实例。所以大致的顺序应该是:静态对象-非静态对象-构造器。那么在静态对象或者非静态对象中是否也存在一个什么顺序呢?经过测试,我们发现其实在同等的优先级的情况下,是按照声明的顺序初始化的。
包含继承的子类初始化
下面讨论另外一个问题,设计到继承的问题,我们现在创建Son对象,他会执行父类的一些初始化么,他和子类的一些初始化之间又存在什么关联呢?
Java代码
package test;
public class Test {
public static void main(String[] args) {
Son son = new Son();
}
}
package test;
public class Test {
public static void main(String[] args) {
Son son = new Son();
}
}
打印语句:
父类静态初始化块
子类静态初始化块
父类初始化块
调用了父类无参构造器
子类初始化块
调用子类的构造器
打印语句告诉了我们,静态对象依然是第一个初始化的,然后呢?就是父类中的非静态对象-构造器,子类中的非静态对象-构造器。
包含继承和多态的子类初始化
再看如果是多态的情况下会有什么情况出现呢?
Java代码
package test;
public class Test {
public static void main(String[] args) {
Father father = new Son();
}
}
package test;
public class Test {
public static void main(String[] args) {
Father father = new Son();
}
} 打印语句:
父类静态初始化块
子类静态初始化块
父类初始化块
调用了父类无参构造器
子类初始化块
调用子类的构造器
和前面继承的情况完全一样,这里不再啰嗦了。
总的一个结论就是:静态对象总是在第一次创建对象前就已经初始化完毕,初始化的顺序从最顶端的父类到子类,只会初始化一次。然后就是从父类到子类中,依次初始化非静态对象和构造器。
分享到:
相关推荐
介绍java对象的创建、初始化、和引用。并分析一下JAVA中对象创建和初始化过程中涉及的相关概念问题。
介绍一下java程序初始化的顺序,这会对您以后的开发所有帮助
详细讲解java类中静态变量,普通标量,对象、基本类型的初始化顺序。
本篇文章主要介绍了Spring 中如何控制2个bean中的初始化顺序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
《Java程序设计基础教程》按内容分成五篇:Java 语言入门篇、面向对象篇、数据流应用篇、Java GUI编程篇和高级应用篇,共有二十四讲组成。
对java类初始化以及顺序,详解,由于转载仅供大家参考!
java对象的初始化顺序[参考].pdf
在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,网上关于Java中对象初始化顺序的文章很多,这篇文章我们将详细介绍Java中对象初始化顺序。有需要的可以参考学习。
类继承的初始化顺序类继承的初始化顺序类继承的初始化顺序类继承的初始化顺序
java面试题-类的初始化顺序.doc 大家在去参加面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量,构造器里可能还有一段代码对变量值进行了某种运算,...
具体内容见博客
java中对象创建、初始化、引用文.pdf
Java中StringBuffer对象的初始化.pdf 学习资料 复习资料 教学资源
详细介绍了Java的静态成员变量、静态数据块、非静态成员变量和非静态成员变量等初始化顺序
java语法\Java数组声明、创建、初始化
“礼让”原则学习Java对象初始化顺序
Java中创建初始化对象.pdf 学习资料 复习资料 教学资源
Java对象的创建与初始化.docx
一个java代码初始化具体过程的的demo