先看下面的程序:
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 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...
详细讲解java类中静态变量,普通标量,对象、基本类型的初始化顺序。
static所声明的变量在Java中有一个初始化的先后顺序,带着这个问题接下来我们就来进行Java中static静态变量的初始化完全解析:
易语言源码易语言静态变量初始化源码.rar 易语言源码易语言静态变量初始化源码.rar 易语言源码易语言静态变量初始化源码.rar 易语言源码易语言静态变量初始化源码.rar 易语言源码易语言静态变量初始化源码.rar ...
注意:本文所说的全局变量指的是 variables with static storage,措词来自 c++ 的语言标准文档。 什么时候初始化 ... static initialization: 静态初始化指的是用常量来对变量进行初始化,主要包括 zero init
主要介绍了Java静态和非静态成员变量初始化过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
我们知道类的生命周期分为装载、连接、初始化...这种情况比较特殊,主要问题是由于静态变量是一个对象的引用,那么必须初始化这个对象之后才能将引用指向它。因此如果要把一个引用定义成static的,必须在定义的时候对其
Java类加载器:静态变量初始化.docx
g++中的局部静态变量的初始化机制及线程安全
易语言静态变量初始化源码.zip这个是易语言源码,希望是你需要的例程,只有学习才会进步,感谢你的关注。谢谢
} } 但是php中并没有一个类似java中的静态构造器/静态块的东西,就没有合适的时机对其进行初始化了。 对于共有的成员还有办法解决,例如: class A { static public $child; } A::$child = new B()
童鞋们在学习C++的时候,往往只是按照书本上的原文去强行记忆各种特性,比方说,静态变量只初始化一次。你心中一定在默念:一定要记住,static只会初始化一次云云,希望自己能够记住。告诉你,你为什么总是记不住,...
我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这一点:
资源介绍: 源码演示了易语言静态变量的用法。是易语言初级例程, 资源作者:
提供惰性初始化静态变量的支持。用于在 Rust 中声明延迟计算的静态的宏。使用此宏,可以有需要代码的 s 在运行时执行以进行初始化。 这包括任何需要堆分配的东西,如向量或哈希映射, 以及任何需要计算非常量函数...
为您提供易语言静态变量初始化源码下载,易语言静态变量初始化源码系统结构:静态变量初始化例子, ======窗口程序集_启动窗口 | | | |------ __启动窗口_创建完毕 | | | |------ _按钮1_被单击 | | | |------ 静态...
静态变量只存在于函数作用域内,静态变量只存活在栈中。一般的函数内变量在函数结束后会释放,比如局部变量,但是静态变量却不会。... //这里定义并初始化一个静态变量 $nums public static $nums=0; func