`
wlh269
  • 浏览: 445367 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java中静态变量和非静态变量的初始化顺序

    博客分类:
  • J2SE
阅读更多
先看下面的程序:



class Bowl {
Bowl(int marker) {
System.out.println("Bowl(" + marker + ")");
}

void f1() {
System.out.println("Ok");
}
}

class Cupboard {
Bowl b1 = new Bowl(1);

static Bowl b2 = new Bowl(2);

Cupboard() {
System.out.println("Cupboard()");
}

static Bowl b3 = new Bowl(3);
}

class Table {
Table() {
System.out.println("Table()");
}
Table(String a,int i){
this();
System.out.println("Ok");
}
}

public class Order {
static Cupboard t1 = new Cupboard();

static Table t2;

Bowl t3 = new Bowl(10);

void print() {
t3.f1();
}

public static void main(String[] args) {
System.out.println("Creating new Cupboard() in main");
new Cupboard();
System.out.println("Creating new Cupboard() in main");
Order od = new Order();
od.t3.f1();
Table t4 = new Table("aa",1);
}
}


运行结果:

Bowl(2)
Bowl(3)
Bowl(1)
Cupboard()
Creating new Cupboard() in main
Bowl(1)
Cupboard()
Creating new Cupboard() in main
Bowl(10)
Ok
Table()
Ok


分析:首先程序从public类开始,装载Order,class,运行static Cupboard t1 = new Cupboard();

由于t1是一个对象引用变量,首先得到初始化,然后转到Cupboard类的实例中,这时候程序开始初始化

该实例中的变量,按照先static后非static变量初始化的顺序原则开始初始化各个变量,此时,

static Bowl b2 = new Bowl(2);

static Bowl b3 = new Bowl(3);


这两块先得到初始化

然后    Bowl b1 = new Bowl(1);得到初始化(注意,这是非stataic变量)

然后转到Cupboard() 构造函数。

此时Cupboard类已经初始化完毕,程序返回到public类中,又发现有 static Table t2;

开始初始化,由于t2只是个声明的变量,并没有创建一个Table对象让它指向,因此不要管这个t2变量。

在public类中,由于此时再没有static变量可以初始化,那么程序转到static方法main中进行,

(注意:Bowl t3 = new Bowl(10); 这一句为什么得不到初始化,是因为此时没有创建类Order的实例,所以程序目前还不会初始化该代码,至于以后会不会初始化,还要看在main方法中是否会创建Order类的实例,如创建了,则一定初始化,否则不会。)

在main方法中,

System.out.println("Creating new Cupboard() in main");//首先打印该行要输出的语句


new Cupboard();   //创建了Cupboard类的实例,程序转到Cupboard中进行变量初始化,此时要注意:   

static变量的初始化,它只能初始化一次,也就是说,如果前面已经初始化过了,那么此时就不必要再初

始化了,这一点要牢记!!!




System.out.println("Creating new Order() in main");//程序转入此行打印要输出的语句


Order od = new Order();//创建Order对象实例,程序转入实例od中,此时Bowl t3 = new Bowl(10);

这一句的t3会得到初始化,程序转到Bowl类中进行有关的操作,操作完后返回到main方法中


od.t3.f1();   //调用实例t3中的方法f()


Table t4 = new Table("aa",1); //创建Table类的实例,让t4指向这个实例,t4得到初始化,调用Table含

有参数的构造方法,程序进行下去。



这样就完成了对这个程序的真个的流程的分析,如果有错误的地方,或者还要补充的地方,还希望大家

指点一下,谢谢!!!


最后再总结一下:

初始化顺序是:

(1) 先是父类的static变量和static初始化块

(2)然后是子类的static变量和static初始化块  

(3)父类的实例变量、初始化快

(4)父类的构造方法

(5)子类的实例变量、初始化快

(6)子类构造方法

分享到:
评论

相关推荐

    关于Java静态成员变量和静态初始化块等的初始化顺序的详细介绍

    详细介绍了Java的静态成员变量、静态数据块、非静态成员变量和非静态成员变量等初始化顺序

    易语言静态变量初始化

    易语言静态变量初始化源码,静态变量初始化,静态变量初始化例子

    java 静态非静态 字段方法 子类父类构造_初始化顺序!

    java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...

    java类变量初始化顺序

    详细讲解java类中静态变量,普通标量,对象、基本类型的初始化顺序。

    Java中static静态变量的初始化完全解析

    static所声明的变量在Java中有一个初始化的先后顺序,带着这个问题接下来我们就来进行Java中static静态变量的初始化完全解析:

    易语言源码易语言静态变量初始化源码.rar

    易语言源码易语言静态变量初始化源码.rar 易语言源码易语言静态变量初始化源码.rar 易语言源码易语言静态变量初始化源码.rar 易语言源码易语言静态变量初始化源码.rar 易语言源码易语言静态变量初始化源码.rar ...

    C++全局变量初始化的一点总结

    注意:本文所说的全局变量指的是 variables with static storage,措词来自 c++ 的语言标准文档。  什么时候初始化 ...  static initialization: 静态初始化指的是用常量来对变量进行初始化,主要包括 zero init

    Java静态和非静态成员变量初始化过程解析

    主要介绍了Java静态和非静态成员变量初始化过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java中的静态变量、静态方法与静态代码块

    我们知道类的生命周期分为装载、连接、初始化...这种情况比较特殊,主要问题是由于静态变量是一个对象的引用,那么必须初始化这个对象之后才能将引用指向它。因此如果要把一个引用定义成static的,必须在定义的时候对其

    Java类加载器:静态变量初始化.docx

    Java类加载器:静态变量初始化.docx

    g++中的局部静态变量的初始化机制及线程安全

    g++中的局部静态变量的初始化机制及线程安全

    易语言静态变量初始化源码.zip

    易语言静态变量初始化源码.zip这个是易语言源码,希望是你需要的例程,只有学习才会进步,感谢你的关注。谢谢

    php 静态变量的初始化

    } } 但是php中并没有一个类似java中的静态构造器/静态块的东西,就没有合适的时机对其进行初始化了。 对于共有的成员还有办法解决,例如: class A { static public $child; } A::$child = new B()

    C++ 怎么让静态变量只初始化一次

    童鞋们在学习C++的时候,往往只是按照书本上的原文去强行记忆各种特性,比方说,静态变量只初始化一次。你心中一定在默念:一定要记住,static只会初始化一次云云,希望自己能够记住。告诉你,你为什么总是记不住,...

    java面试题-类的初始化顺序.doc

    我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这一点:

    e语言-易语言静态变量初始化

    资源介绍: 源码演示了易语言静态变量的用法。是易语言初级例程, 资源作者:

    提供惰性初始化静态变量的支持

    提供惰性初始化静态变量的支持。用于在 Rust 中声明延迟计算的静态的宏。使用此宏,可以有需要代码的 s 在运行时执行以进行初始化。 这包括任何需要堆分配的东西,如向量或哈希映射, 以及任何需要计算非常量函数...

    易语言静态变量初始化源码

    为您提供易语言静态变量初始化源码下载,易语言静态变量初始化源码系统结构:静态变量初始化例子, ======窗口程序集_启动窗口 | | | |------ __启动窗口_创建完毕 | | | |------ _按钮1_被单击 | | | |------ 静态...

    php中的静态变量的基本用法

    静态变量只存在于函数作用域内,静态变量只存活在栈中。一般的函数内变量在函数结束后会释放,比如局部变量,但是静态变量却不会。... //这里定义并初始化一个静态变量 $nums public static $nums=0; func

Global site tag (gtag.js) - Google Analytics