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

原创 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

总结:

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


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

static 静态变量和静态函数的使用探究 类::functionname 与 初始化一个对象的区别

我的总结是。注意内存中的存储对象是什么 什么有什么没有。此为根本。static 变量要记得初始化(类外初始化) 静态数据成员: 下面看一个例子: #include cl...

PHP静态变量初始化一次

PHP中的变量作用范围的一个重要特性就是静态变量(static 变量),仅在局部函数域中存在且只被初始化一次,当程序执行离开此作用域时,其值不会消失,会使用上次执行的结果。我们先来看看下面的实例:  ...

类中静态变量与const常量成员的初始化

//类中,静态变量与const常量的赋值: //static 成员在类外初始化 //const 成员(及引用成员)在类的构造函数初始化列表中初始化 //static const /cons...

类中static静态变量与const常量成员的初始化

1、static 成员在类外初始化2、const 成员(及引用成员)在类的构造函数初始化列表中初始化3、static const /const static 成员可以在类中初始化(实际上是申明)也可以...
  • will130
  • will130
  • 2015年10月10日 22:16
  • 497

C++ 静态变量之为什么只初始化一次

以下内容由在论坛中讨论而成,在此总结一下: 首先问题来自这个函数: int fun() { static int i=0; i++; return i;...

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

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

c++中对类中私有成员中的静态变量初始化

1.static成员的所有者是类本身和对象,但是多有对象拥有一样的静态成员。从而在定义对象时不能通过构造函数对其进行初始化。 2.静态成员不能在类定义里边初始化,只能在class body外初始化。 ...
  • wingWC
  • wingWC
  • 2017年07月23日 11:20
  • 174

关于java中静态变量初始化

题目如下: [java] view plain copy public class Test{       private static Test...

Java静态变量初始化的一个实例的分析

class Singleton { public static Singleton ps = new Singleton(); public static int a = 2; public s...

类静态变量初始化过程 浅析

首先来看一段代码思考一个问题输出结果为什么是counter1=1、counter2=0;原因JVM结束的几种方式 System.exit() 程序执行完毕 遇到异常或错误而导致程序崩溃 操作系统错误 ...
  • luwfls
  • luwfls
  • 2017年04月20日 20:27
  • 100
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:静态变量初始化与不初始化的区别
举报原因:
原因补充:

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