`
wlh269
  • 浏览: 455967 次
  • 性别: 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 中的静态变量与非静态变量之间的主要区别在于它们的生命周期、存储位置以及访问方式。静态变量是类级别的,与对象无关,而实例变量是对象级别的,每个对象都有自己的一份副本。理解这两种变量类型...

    易语言静态变量初始化

    总的来说,易语言中的静态变量初始化是程序设计中的一个重要概念,尤其是在需要保存函数间状态或者实现某种计数功能时。理解并恰当使用静态变量,可以极大地提高代码的效率和可读性。在实际编程过程中,应根据需求...

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

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

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

    在本文中,我们讨论了 Java 类加载器中的静态变量初始化机制,了解了静态变量的初始化顺序和类加载器的生命周期。通过对静态变量初始化机制的理解,我们可以更好地掌握 Java 语言的基础知识,并更好地应用 Java 语言...

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

    Java静态和非静态成员变量初始化过程解析 Java静态和非静态成员变量初始化过程解析是Java语言中一个非常重要的概念。了解Java静态和非静态成员变量的初始化过程对大家的学习或者工作具有一定的参考学习价值。 首先...

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

    总的来说,理解Java中静态变量的初始化顺序对于编写可靠的代码非常重要。开发者应避免依赖这种顺序来初始化变量,因为这可能导致难以预料的行为。在编写代码时,推荐的做法是保持静态变量的初始化尽可能简单,避免...

    Java中的静态变量静态方法静态块与静态类.docx

    在静态块中,我们通常进行一些需要进行异常捕获的静态变量的初始化。 例如: ```java public class StaticExample { static { System.out.println("StaticExample static block"); str = "Test"; setCount(2);...

    学习java静态数据初始化.doc

    在 Java 中,静态变量的初始化顺序是按照它们在类中的定义顺序进行的。如果一个静态变量依赖于另一个静态变量的值,那么这两个变量的初始化顺序是重要的。 在给定的代码中,我们可以看到有多个静态变量的声明和初始...

    静态变量与非静态变量获取配置文件application中变量值的区别.docx

    本文将详细介绍静态变量和非静态变量在获取配置文件中变量值的区别,并通过实例代码展示如何正确地使用静态变量和非静态变量。 首先,让我们看一下非静态变量的使用。在 Controller 文件中,我们可以使用 `@Value` ...

    Java变量初始化

    Java 变量初始化的时机是指在 Java 语言中变量的初始化过程,包括变量的声明、初始化和赋值的步骤。 Java 变量声明 在 Java 语言中,每个变量必须先声明,然后才能使用。声明变量时必须指定该变量的数据类型。...

    java类变量初始化顺序

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

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

    C++中的全局变量初始化是一个重要的话题,涉及到程序的正确性和可预测性。全局变量,即具有静态存储期的变量,其生命周期始于程序开始,终于程序结束。本文将深入探讨全局变量初始化的时机、方式以及一些处理特殊...

    C#中静态变量的使用

    1. 内存分配:静态变量在应用程序初始化时创建,而非静态变量需要被实例化后才会分配内存。 2. 生命周期:静态变量生存周期为应用程序的存在周期,而非静态变量的生存周期取决于实例化的类的存在周期。 3. 调用方式...

    Java静态初始化块和对象初始化块

    总之,理解并有效地使用静态和对象初始化块是Java开发中的关键技能,它们可以帮助我们更好地控制类和对象的初始化过程,确保代码的高效性和正确性。在实际编程中,我们应该根据需求谨慎选择合适的初始化策略,以优化...

    java类中静态域、块,非静态域、块,构造函数的初始化顺序

    ### Java 类中静态域、块,非静态域、块,构造函数的初始化顺序 #### 一、概述 在 Java 编程语言中,类的初始化顺序对于理解程序的行为至关重要。特别是当涉及到静态域(静态变量)、非静态域(实例变量)、静态块...

    static静态变量使用@Value注入方式.md

    静态变量在类加载时就已经初始化完毕,而Spring Bean的初始化通常发生在应用程序启动过程中,两者的时间点不同步。因此,直接在静态变量上使用`@Value`会导致注入失败,并且在编译或运行时出现警告或错误信息。 ###...

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

    在这个“易语言静态变量初始化源码.zip”压缩包中,我们可以预见到它包含了一个或多个示例程序,这些程序主要展示了如何在易语言中使用静态变量进行初始化。 在编程中,变量是存储数据的容器,而静态变量有别于普通...

    java-静态变量方法块

    它通常用于初始化静态变量,如`EX3_1`中的静态代码块就设置了`sa`的初始值。静态代码块的执行早于类的任何实例化和静态方法调用。 静态方法是与类关联的,而不是与对象关联的。它们可以直接通过类名调用,无需创建...

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

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

Global site tag (gtag.js) - Google Analytics