静态变量初始化与不初始化的区别

原创 2015年11月18日 16:24:07

1.无意间的一段程序代码引起了我研究的兴趣,之前对于Java的执行机制不是很透彻,为自己充充电.

public class test {
	private static test test = new  test();
	public static int count1;
	public static int count2=0;
	
	private test()
	{
		System.out.println("执行构造方法前count1=" + count1+ "    count2==" + count2);
		count1++;
		count2=9999;
		System.out.println("执行构造方法后count1=" + count1+ "    count2==" + count2);
	}
	public static test getTest()
	{
		return test;
	}
	public static void main(String[] args) {
		System.out.println("执行主方法count1=" + count1+ "    count2==" + count2);
	}
}
结果:
执行构造方法前count1=0    count2==0
执行构造方法后count1=1    count2==9999
执行主方法count1=1    count2==0

这是一个单例模式,首先,由于第一句是private static test test = new test();所以在初始化静态变量test时中间插入了一个构造函数,造成了count1和count2最后的结果不一样。

执行顺序:

1.初始化静态变量,第一个赋值操作是(static)test = new test();JVM会调用构造函数,完成count1和count2的赋值。到此为止 count1=1,count2=9999;

2.执行private static test test = new test();进行类加载,初始化 count1 (已经是1),counter2(重新设置成0);

3.执行main方法。

2.当我改成下面后,结果又不一样了,因为在执行private static test test = new test();后,初始化 count1 (重新设置成0),count2(已经是9999)。

package com.isoftstone.epsp.web.portal.app;

public class test {
	private static test test = new  test();
	public static int count1=0;//改变
	public static int count2;//改变
	
	private test()
	{
		System.out.println("执行构造方法前count1=" + count1+ "    count2==" + count2);
		count1++;
		count2=9999;
		System.out.println("执行构造方法后count1=" + count1+ "    count2==" + count2);
	}
	public static test getTest()
	{
		return test;
	}
	public static void main(String[] args) {
		System.out.println("执行主方法count1=" + count1+ "    count2==" + count2);
	}
}

结果:
执行构造方法前count1=0    count2==0
执行构造方法后count1=1    count2==9999
执行主方法count1=0    count2==9999 

3.当我改变private static test test = new test();的位置后,因为执行private static test test = new test();后,这一句 public static int count1=0;没有执行,也就是count1没有被重新赋值,只会初始化count2(已经是9999)。

        public static int count1=0;
	private static test test = new  test();
	public static int count2;
结果:
执行构造方法前count1=0    count2==0
执行构造方法后count1=1    count2==9999
执行主方法count1=1    count2==9999

4。当我改变private static test test = new test();的位置后,因为执行private static test test = new test();后,前面count1和count2语句都没有执行,结果就是构造函数中运算的值。

    public static int count1=0;
    public static int count2;
    private static test test = new  test();
结果:
执行构造方法前count1=0    count2==0
执行构造方法后count1=1    count2==9999
执行主方法count1=1    count2==9999

总结:

对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。


版权声明:本文为博主原创文章,未经博主允许不得转载。

谈谈全局变量、静态变量的初始化问题

经常性的在面试和笔记题目中会看到全局变量、静态全局变量、静态变量的存储位置和初始化时间的问题, 一般都能答出来他们存储位置,但可能有很多人不清楚这些变量是什么时候初始化的,下面我们从代码角度来看看,这...
  • zhuobattle
  • zhuobattle
  • 2013年12月18日 11:12
  • 5709

静态局部变量初始化问题

在C中对静态变量初始化必须使用常量,在C++中却可以使用变量初始化静态变量。 C里面只允许静态初始化, C++允许动态初始化,可以参考C++标准3.6.2节 静态变量没有初始化时,与全局变...
  • ljfeng123
  • ljfeng123
  • 2014年03月13日 03:14
  • 855

C++中类的静态变量在哪初始化

静态数据成员的使用方法和注意事项如下:    1、静态数据成员在定义或说明时前面加关键字static。    2、静态成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式如下:  ...
  • zhangpinghao
  • zhangpinghao
  • 2012年11月29日 01:01
  • 3229

Java静态变量初始化及构造函数的执行顺序与执行时机分析

对于Java初学者来说,关于静态变量、非静态变量的初始化时机与顺序,以及构造函数的执行时机与顺序都会感觉有点理不清头绪,下面文章使用实例程序帮大家解决这方面的疑惑。虽然简单,但是对Java入门者来说还...
  • tabby
  • tabby
  • 2011年03月05日 16:58
  • 3777

静态局部变量初始化次数的控制

// test.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include ...
  • LostSpeed
  • LostSpeed
  • 2015年11月10日 00:35
  • 739

静态变量初始化

我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序以此是(静态变量、静态初始化块(顺序按声明顺序))>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这...
  • hqdoremi
  • hqdoremi
  • 2014年02月27日 11:17
  • 1527

Java中静态变量和非静态变量的初始化顺序

 先看下面的程序:package c05.net;class Bowl {Bowl(int marker) {System.out.println("Bowl(" + marker + ")");}v...
  • zhu_apollo
  • zhu_apollo
  • 2007年10月28日 15:56
  • 4769

java类中的静态变量是什么时候初始化的

我们知道一个类(class)要被使用必须经过装载,连接,初始化这样的过程。下面先对这三阶段做一个简单的描述,之后会结合一个简单的例子来说明java中类的初始化过程。 在装载阶段,类装载器(Boo...
  • u010585120
  • u010585120
  • 2016年11月09日 10:24
  • 3620

Java的一道面试题----静态变量初始化过程

来自:http://topic.csdn.net/u/20120222/22/dc082753-6298-4709-ba5a-a6df55c3a207.html 题目如下: public ...
  • liu_zhen_wei
  • liu_zhen_wei
  • 2012年02月24日 14:46
  • 4632

C语言静态变量的初始化

通过一个例子说明C语言如何初始化静态变量。 给出C语言代码 typedef int (* Fun)(void * obj, int argc, int *argv); struct Function...
  • HiHui
  • HiHui
  • 2017年04月30日 08:50
  • 775
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:静态变量初始化与不初始化的区别
举报原因:
原因补充:

(最多只允许输入30个字)