java初始化顺序,java初始化
分享于 点击 45710 次 点评:32
java初始化顺序,java初始化
java初始化顺序
1、无继承情况下java初始化顺序
/**
* 无继承情况下java初始化顺序:
* @author nier_ni
*
*/
public class NotExtendJava {
public static void main(String[] args) {
Text text = new Text();
}
}
class ToPrint{
ToPrint(String str){
System.out.println(str);
}
ToPrint(){
System.out.println("ToPrint默认构造函数被调用");
}
}
class Text{
static ToPrint str = new ToPrint("静态成员str初始化");
ToPrint strtamp = new ToPrint("strtamp成员初始化");
static{
System.out.println("static块执行");
if(str==null)
System.out.println("str is null");
str = new ToPrint("static块内初始化str成员变量");
}
Text(){
System.out.println("Text默认构造函数被调用");
}
}
结果如下图所示:
得出结论:
a、静态成员变量首先被初始化。(注意:static就是静态成员,其执行顺序是按声明顺序初始化的)
b、static块执行。(注意:static块多个,按顺序执行)
c、普通成员变量。
d、被调用的构造函数。
对于静态成员(static块可以看成普通的一个静态成员,其并不一定在类初始化时首先执行)和普通成员,其初始化顺序只与类定义中的顺序由关,和其他因素无关。
/**
* 无继承情况下java初始化顺序:
* @author nier_ni
*
*/
public class NotExtendJava {
static{
System.out.println("static 块 1 执行");
}
static ToPrint str1 = new ToPrint("静态成员str1初始化");
ToPrint strtamp1 = new ToPrint("strtamp1成员初始化");
static{
System.out.println("static 块 2 执行");
}
static ToPrint str2 = new ToPrint("静态成员str1初始化");
NotExtendJava(){
System.out.println("NotExtendJava默认构造函数被调用");
}
ToPrint strtamp2 = new ToPrint("strtamp2成员初始化");
public static void main(String[] args) {
NotExtendJava notExtendJava = new NotExtendJava();
}
}
结果如图所示:
2、继承情况下java初始化顺序:
/**
* 继承情况下java初始化顺序:
* @author nier_ni
*
*/
public class ExtendJava {
public static void main(String[] args) {
SubText subText = new SubText();
}
}
class Print{
Print(String str){
System.out.println(str);
}
Print(){
System.out.println("ToPrint默认构造函数被调用");
}
}
class SuperText{
static Print str = new Print("父类静态成员str初始化");
Print strtamp = new Print("父类成员strtamp初始化");
static{
System.out.println("父类static块初始化");
if(str == null)System.out.println("str is null");
str = new Print("父类static内部成员str初始化");
}
SuperText(){
System.out.println("父类SuperText默认构造函数被调用");
}
}
class SubText extends SuperText{
static Print subStr = new Print("子类SubText静态成员subStr初始化");
Print subStrTamp = new Print("子类成员subStrTamp初始化");
static{
System.out.println("子类static块初始化");
if(subStr == null)System.out.println("subStr is null");
subStr = new Print("子类static内部成员subStr初始化");
}
SubText(){
System.out.println("子类SubText默认构造函数被调用");
}
}
结果如下图所示:
得出结论:
a、父类静态成员变量首先被初始化。(注意:static就是静态成员,其执行顺序是按声明顺序初始化的)
b、父类static块执行。(注意:static块多个,按顺序执行)
c、子类静态成员变量首先被初始化。(注意:static就是静态成员,其执行顺序是按声明顺序初始化的)
b、子类static块执行。(注意:static块多个,按顺序执行)
e、子类成员变量。
f、默认父类构造函数。
g、子类成员变量。
h、被调用的子类构造函数。
相关文章
- 暂无相关文章
用户点评