`
L.G.Alexander
  • 浏览: 155736 次
  • 性别: 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,想想是为什么?  

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

相关推荐

    static 静态变量加载

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

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

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

    java类变量初始化顺序

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

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

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

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

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

    由浅入深详解Java 类的实例化顺序

    父类的静态变量和静态代码块,按代码先后顺序执行 2. 子类的静态变量和静态代码块,按代码先后顺序执行 3. 父类的成员变量和普通代码块,按代码先后顺序执行 4. 父类的构造方法 5. 子类的成员变量和普通代码块...

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

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

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 if语句的嵌套 71 4.2.3 if-else语句 73 4.2.4 if-else语句嵌套 75 4.3 ...

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

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

    Java中类的加载顺序

    不过我们可以换个直接的问法,如果类A和类B中有静态变量,静态语句块,非静态变量,非静态语句块,构造函数,静态方法,非静态方法,同时类A继承类B,请问当实例化A时,类内部的加载顺序是什么?  当时我也是一头...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 if语句的嵌套 71 4.2.3 if-else语句 73 4.2.4 if-else语句嵌套 75 4.3 ...

    java顺序表的基本操作.docx

    在Java中,顺序表(Sequential List)是一种常见的线性数据结构,它以连续的内存空间存储数据元素,并按照一定的顺序进行操作。顺序表提供了一系列基本操作来插入、删除、访问和修改元素。下面是对Java顺序表的基本...

    Java开发者文档,分享日常学习的一些小知识点 .rar

     程序中主类的静态变量会在main方法执行前初始化。  不仅第一次创建对象时,类中的所有静态变量都初始化,并且第一次访问某类(注意此时  未创建此类对象)的静态对象时,所有的静态变量也要按它们在类中的顺序...

    Java开发技术大全(500个源代码).

    showStaicVar.java 演示静态变量的使用 staticBlock.java 演示静态块的使用 staticVar.java 定义静态变量 supplyTest.java 对象作为静态成员使用示例 trySwap.java 试图交换两个形参的值 useOnlyTest.java ...

    java面试真题整理

    java开发岗企业常考面试题目 1.GC垃圾回收处理器,回收内存 托管资源: 非托管资源:手动释放资源 2.堆内存:new出来的 栈内存:基本数据类型的变量,方法的返回值,对象的引用(对象的引用地址) 3.static:存放...

    Jmeter 各组件执行顺序与作用域

    相对于JAVA 语言中间定义一些常量和静态变量。配置元件作用域是最初始阶段处理,配置元件仅对其所在的测试树分支有效,在同一个作用域的任何采样器前,同时,线程组A中间定义了配置元件中间的用户定义变量,线程组...

    JAVA面试题解惑系列

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

    JAVA基础知识精华总结 收藏

    程序中主类的静态变量会在main方法执行前初始化。 不仅第一次创建对象时,类中的所有静态变量都初始化,并且第一次访问某类(注意此时 未创建此类对象)的静态对象时,所有的静态变量也要按它们在类中的顺序初始化...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    在 java 语言中,Java 程序的基本单位是类,也就是说:一个 Java 程序是由多个类组成 的。定义一个类与定义一个数据类型是有区别的。在程序设计语言中,把定义数据类型的能 力作为一种很重要的能力来对待。在面向...

Global site tag (gtag.js) - Google Analytics