先看下面的程序:
package c05.net;
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)子类构造方法
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/painss/archive/2009/01/05/3714115.aspx
分享到:
相关推荐
Static变量 `static`变量,亦称为静态变量或类变量,与实例变量相对。其最显著的特点在于,无论创建多少个该类的实例,`static`变量在内存中仅存在一份拷贝,这意味着所有实例共享同一份变量值。这不仅节约了内存...
总的来说,理解Java中静态变量的初始化顺序对于编写可靠的代码非常重要。开发者应避免依赖这种顺序来初始化变量,因为这可能导致难以预料的行为。在编写代码时,推荐的做法是保持静态变量的初始化尽可能简单,避免...
C++中的全局变量初始化是一个重要的话题,涉及到程序的正确性和可预测性。全局变量,即具有静态存储期的变量,其生命周期始于程序开始,终于程序结束。本文将深入探讨全局变量初始化的时机、方式以及一些处理特殊...
### C语言中static变量使用方法详解 在C语言编程中,`static`关键字扮演着一个非常重要的角色,尤其是在处理变量的存储方式、作用域以及生命周期方面。本文将深入探讨C语言中`static`变量的使用方法,包括静态局部...
综上所述,`static`关键字在Java中具有多种用途,包括定义类变量、类方法、静态初始化块以及静态内部类。理解和正确使用`static`对于编写高效、可维护的Java代码至关重要。在实际编程中,要根据需求选择是否使用`...
因此,static 成员变量不能在定义对象时对变量初始化,用构造函数来初始化。其正确的初始化方式是: ```cpp class Foo { private: static int i; }; int Foo::i = 100; // 在类体外初始化 ``` 这表明: * 初始化...
### Java中类的初始化顺序详解 #### 一、概述 在Java编程语言中,类的初始化是一个非常重要的概念。类的初始化涉及到多个方面,包括静态成员变量、实例成员变量、静态初始化块、实例初始化块以及构造函数等。本文...
总之,深入理解Java的ClassLoader机制和类变量初始化顺序是提升Java编程技能的重要步骤。通过学习这些知识点,开发者可以更好地优化代码、设计更健壮的系统,并解决与类加载和初始化相关的复杂问题。
本文将深入探讨Java中的静态块与静态方法,解析它们的区别、联系以及执行顺序,帮助读者更全面地理解`static`关键字在Java中的运用。 ### 静态方法 静态方法是通过`static`关键字声明的,它属于类而不属于类的任何...
在VB6.0编程环境中,Static变量是一种特殊的变量类型,它在函数或过程中扮演着持久化存储的角色。Static变量的特点在于,即使函数或过程执行完毕,它的值也不会被清除,而是保留下来,等待下一次调用时继续使用。这...
在Java编程语言中,`static`关键字扮演着重要的角色,特别是在初始化类的静态成员时。`static`静态初始化块是用来初始化类级别的变量,也就是说,这些变量是属于类本身,而不是类的实例。当我们讨论“Java static...
以下是对Java程序初始化顺序的详细说明: 1. **类加载阶段**: - **加载**:当Java虚拟机(JVM)首次遇到一个类的引用时,会通过类加载器进行加载。加载过程包括找到类的.class文件,读取其字节码,并转化为内存中...
在Java编程语言中,初始化块是程序执行时用于初始化对象或类的重要机制。这里我们将深入探讨两种类型的初始化块:静态初始化块(Static Initializer Block)和对象初始化块(Instance Initializer Block)。这两种...
Java 中的 static 关键字 ...在 Java 中,类装载器把一个类装入 Java 虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的。
在 Java 中,实例变量的初始化顺序是按照定义的顺序进行的,而静态变量的初始化顺序则是按照定义的顺序,并且只在第一次访问时初始化。 在上面的示例代码中,我们可以看到,类变量和实例变量的初始化顺序是按照定义...
这个顺序表明,无论类之间的继承关系如何,初始化顺序始终是:静态变量和静态初始化块先于非静态成员。在创建对象时,父类的初始化先于子类。这是Java语言规范所规定的,确保在子类访问父类的静态或非静态成员时,...
需要注意的是,在 Java 中,数组变量必须在使用前进行初始化,否则将会抛出 NullPointerException。 二维数组的初始化 在 Java 中,二维数组可以通过多种方式进行初始化。 1. 声明数组变量:`int[][] a;`,这只...
本文详细介绍了Java中的`static`属性,包括静态成员变量、静态方法以及静态语句块的概念和使用方法。通过具体的代码示例,我们不仅了解了`static`关键字的基本用法,还深入探讨了静态成员变量如何在整个类之间共享,...
4. 用 private 修饰的 static 成员变量和成员方法,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用),但是不能在其他类中通过类名来直接引用,这一点很...