java类的初始化顺序比较


/*
由这个实例可看出同一个类中初始化的先后顺序是:
1.静态变量&&静态代码块(靠前的先初始化)
2.非静态变量&&非静态代码块(靠前的先初始化)
*/
public class InitializeDemo {
{
System.out.println("block 1");
}
static{
System.out.println("static block 1");
}
String a = f();
{
b = "string b2";
System.out.println("block 2");
}
static String b = "string b1";
static{
System.out.println(b);
System.out.println("static block 2");
}
String f(){
System.out.println("f()");
return b;
}
public static void main(String[] args) {
/*
注释掉1、2行可以发现:
静态代码块、静态变量初始化在该类被使用之前执行
非静态代码块、非静态变量在创建对象时被执行
*/
InitializeDemo ini = new InitializeDemo(); //1
System.out.println(ini.a); //2
System.out.println(b);
}
}

[size=large]从下面这个实例可看出基类与导出类的初始化顺序[/size]

/*
*由此实例可知导出类及基类的初始化顺序是:
*1.基类的静态变量&&静态代码块
*2.导出类的静态变量&&静态代码块
*3.基类的非静态变量&&非静态代码块
*4.基类的构造方法
*5.导出类的非静态变量&&非静态代码块
*6.导出类的构造方法
*/
//可理解为extends IniA是对IniA的一次调用,于是IniA中的static执行
public class InitializeDemo2 extends IniA{
static{
System.out.println("static block");
}
InitializeDemo2(){
System.out.println("InitializeDemo2()");
}
{
System.out.println("block");
}
public static void main(String[] args) {
new InitializeDemo2();
}
}
class IniA{
static{
System.out.println("IniA static block");
}
IniA(){
System.out.println("IniA()");
}
{
System.out.println("IniA block");
}
}


/*
* 这个实例说明:
* 在其他任何事物发生之前,对象的存储空间初始化为二进制的零
* 构造器应尽可能在不调用方法的条件下使用简单的方法使对象进入正常状态(以免多态性造成灾难)
* 构造器可安全调用的方法是final方法(private方法属于final方法)
*/
import static java.lang.System.*;
class Ini1{
public Ini1(){
out.println("Ini1() before");
draw();
draw2();
draw3();
out.println("Ini1() after");
}
public void draw(){
out.println("Ini1.draw()");
}
private void draw2(){
out.println("Ini1.draw2()");
}
public final void draw3(){
out.println("Ini1.draw3()");
}
}
public class InitializeDemo3 extends Ini1{
private int r = 1;
public void draw(){
out.println("InitializeDemo3.draw("+r+")");
}
public void draw2(){
out.println("InitializeDemo3.draw2("+r+")");
}
public InitializeDemo3(){
draw2();
out.println("InitializeDemo3() after");
}
{
out.println("Initialize!");
}
/* 报错!不能覆盖基类final方法
public void draw3(){
out.println("Ini1.draw3()");
}
*/
public static void main(String[] args) {
new InitializeDemo3();
}
}


[size=large]初始化顺序总结如下:[/size]
[color=red][size=large]0.存储空间初始化为二进制的零
1.static先于非static
2.基类先于导出类
3.非static先于构造器
4.导出类static先于基类非static
只要存在对类的调用(extends视为对其调用),该类的static就会执行。
只有创建该类的对象,非static才会执行。[/color][/size]

[size=x-large][color=orange]也可以抽象理解为优先级:static>继承关系>非static>构造器
同一优先级的,按先后顺序进行初始化[/color][/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值