`
L.G.Alexander
  • 浏览: 157268 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(三): Java中的静态变量的执行顺序

阅读更多
public class StaticVariableTest {
	private static StaticVariableTest svt = new StaticVariableTest();//语句(1)
	private static int count1;//语句(2)
	private static int count2 = 0;//语句(3)
	
	private StaticVariableTest(){//语句(4)
		count1++;
		count2++;
	}
	public static StaticVariableTest getInstance(){//语句(5)
		return svt;
	}
	public static int getCount1() {
		return count1;
	}
	public static void setCount1(int count1) {
		StaticVariableTest.count1 = count1;
	}
	public static int getCount2() {
		return count2;
	}
	public static void setCount2(int count2) {
		StaticVariableTest.count2 = count2;
	}
	public static void main(String[] args) {
		StaticVariableTest svt = StaticVariableTest.getInstance();//语句(6)
		System.out.println("count1:" + svt.getCount1());//语句(7)
		System.out.println("count1:" + svt.getCount2());//语句(8)
	}
}

问题:当执行完语句(7)(8)时,打印结果分别是什么?为什么?
解答:当执行完语句(7)时,打印结果是1,当执行完语句(8)时,打印结果是0。分析:程序执行从main方法开始,首先执行语句(6),调用getInstance方法,然而当它去调用这个方法的时候,它是一个静态的方法,在这个类里面定义了多个静态的成员变量。根据java初始化的顺序我们知道,对于静态的内容肯定是先执行的,也就是说在执行getInstance方法之前,肯定先执行private static StaticVariableTest svt = new StaticVariableTest();而且它是从上到下分别执行静态的内容。换句话说,这个程序首先执行private static StaticVariableTest svt = new StaticVariableTest();而这里面又要调用一个构造方法StaticVariableTest(),则去执行这个构造方法private StaticVariableTest(),执行这个构造方法时发现它里面的功能是将count1加1,将count2加1,而这个count1和count2是我们定义的int类型的静态变量。根据java对成员变量的默认值,count1和count2初始化的时候都被设置为0,当执行完构造方法后count1和 count2都等于1,这时StaticVariableTest这个对象就生成了,已经在内存里面存在了。接着赋给svt这个引用。那么svt这个引用指向的StaticVariableTest类型的对象,它里面的count1是1,count2也是1。接着发现下面一行private static int count1;它是一个静态的,那么它要执行这行代码,这行代码只是一个声明,但是没有赋值,接着它就跳过这行不再赋值了(究其原因是因为count1已经被赋值了,已经被加1了,也就是count1为1)。当我执行private static int count2 = 0;时发现count2也是一个静态变量,而且有一个显示的去赋值的这样一个动作。我们知道count2已经被赋值1了,但是这儿有一个显示的赋值的动作,就把count2的值由1改变成了0。这个就是调用getInstance方法时程序的执行流程:语句(6)、语句(5)、语句(1)、语句(4)、语句(2)、语句(3)

思考:如果将语句(2)和语句(3)放在语句(1)前面,当执行完语句(7)时,打印结果是1,当执行完语句(8)时,打印结果是1,想想是为什么?  

总结:静态变量的执行顺序是按照它们定义在类里面的先后顺序,按照从上到下来执行的。
分享到:
评论

相关推荐

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

    Java 中的静态变量、静态方法、静态块和静态类 Java 中的静态变量、静态方法、静态块和静态类是 Java 编程语言的四个重要概念,它们之间存在着紧密的关系。下面将对这四个概念进行详细的介绍。 一、静态变量...

    java中静态与非静态的变量定义与使用

    总结起来,Java 中的静态变量与非静态变量之间的主要区别在于它们的生命周期、存储位置以及访问方式。静态变量是类级别的,与对象无关,而实例变量是对象级别的,每个对象都有自己的一份副本。理解这两种变量类型...

    static 静态变量加载

    statilocal java 静态变量和静态块加载顺序,静态变量和同名静态变量块加载的顺序。

    构造函数与静态块的执行顺序

    静态块常用于初始化静态变量或执行一次性的初始化操作。 ### 继承中构造函数与静态块的执行顺序 在Java中,当一个类继承自另一个类时,实例化子类对象时构造函数与静态块的执行顺序遵循以下规则: 1. **静态块的...

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

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

    java技术:java中static作用详解

    - 静态代码块按照它们在类中的出现顺序执行,每个块只执行一次。 - 示例中的静态代码块展示了如何在类加载时打印和修改静态变量的值。 4. **主方法(Main Method)**: - Java应用程序的入口点通常是一个带有`...

    静态变量的导入以及集合的运用

    在Java编程语言中,静态变量和集合是两个非常重要的概念。本文将详细介绍如何导入静态变量,并深入探讨集合类的使用方法及其实例。 #### 一、静态变量的导入 静态变量(也称为类变量)是在类的生命周期内共享的...

    Java中的Static块与静态方法

    #### 执行顺序: 1. **类加载时执行**:静态块在类首次被加载到JVM时执行,这是在任何对象实例化之前发生的。 2. **只执行一次**:每个类的静态块在整个程序运行期间只执行一次。 3. **按出现顺序执行**:如果一个类...

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

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

    简单了解java中静态初始化块的执行顺序

    下面是一个简单的示例代码,用于演示Java中静态初始化块的执行顺序: ```java public class Test1 { static { System.out.println("执行静态初始化块test1..."); } { System.out.println("执行初始化块test1");...

    java类变量初始化顺序

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

    Java:静态代码块和构造函数执行顺序

     1 静态变量,静态代码块(类加载时执行,类不加载不执行)  2 实例变量,实例代码块(创建对象时才执行,不创建对象不执行)  3 构造函数,(创建对象时执行完2后再执行构造函数,不管构造函数是public还是private...

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

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

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

    在 Java 中,静态变量的初始化过程可以被分为三个阶段:静态初始化、非静态初始化和执行构造函数。静态初始化是指在类加载时对静态变量的初始化。非静态初始化是指在实例创建时对实例变量的初始化。执行构造函数是指...

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

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

    Java static静态初始快

    这通常用于初始化静态变量或者执行一些类级别的设置工作,例如设置默认值、计算值或者建立静态数据结构等。 下面是一些关于Java静态初始化块的关键知识点: 1. **执行顺序**:静态初始化块在非静态初始化块之前...

    Java静态代码块作用及执行顺序解析

    Java静态代码块作用及执行顺序解析 Java静态代码块是Java语言中的一种特殊代码块,它们在类加载的时候执行,且只执行一次。它们通常用来初始化静态变量、设置静态变量的初始值等。静态代码块的作用域是整个类,而...

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

    按照 Java 的规定,以下列出了类初始化的基本顺序: 1. **静态域初始化**:所有静态域按它们在源代码中出现的顺序进行初始化。 2. **静态块执行**:所有静态块按它们在源代码中出现的顺序依次执行。 3. **非静态域...

    java二开面试笔试题

    2. 静态变量初始化:Java 中的静态变量初始化是在类加载时执行的,而不是在实例化对象时执行的。 六、其他知识点 1. isEmptyString 方法:Java 中的 isEmptyString 方法用于判断字符串是否为空,可以使用 str == ...

    什么是静态(static)什么是静态方法,静态变量,静态块

    在Java编程语言中,"静态"(static)关键字是一个非常重要的概念,它具有多种用途,包括定义静态变量、静态方法、静态初始化块以及静态类。理解这些概念对于编写高效的Java代码至关重要。 首先,我们来解释静态变量...

Global site tag (gtag.js) - Google Analytics