朝花夕拾——再看java类变量的初始化内幕

前面理解过java实例变量的初始化规则 朝花夕拾——看清java实例变量的初始化内幕

今天继续理清类变量的初始化顺序和细节,需要的朋友可以一起温习下。

类变量的初始化和实例变量的初始化很相似,相比实例变量初始化,少了构造器初始化的情况。大致只有:定义类变量时初始化和静态块中初始化两种情况。

规则:上述两种情况下,先对所有类变量进行申明并申请内存,在把赋值操作全部移动到静态块中进行初始化,顺序和源代码顺序一致。

首先理解下面代码

static double number = 100;

实际上JVM处理上述语句等价于

static double number;
static{
	number = 100;
}

按照上述规则,给出完整例子

public class TestStatic {

	static double number = 100;

	static{
		System.out.println("number = "+ number);
		count = 200;
	}

	static double count = 300;

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("number = "+ number);
		System.out.println("count = "+ count);

	}

}

按照规则,首先把double类型的number和count进行申明并申请内存(内存申请不做说明),并执行等价代码块和原来代码块,上述代码等价于下面代码

public class TestStatic {

	//static double number = 100;
	static double number;
	static double count;
	static{
		number = 100;
	}

	static{
		System.out.println("number = "+ number);
		count = 200;
	}

	//static double count = 300;
	static{
		count = 300;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("number = "+ number);
		System.out.println("count = "+ count);

	}

}

利用javap工具查看编译器源码,图下图

两种情况下的静态块赋值情况(左边为上述第二种源代码,右边为上述第一种源代码)

到此,类变量的初始化大致如上述。

时间: 2024-10-31 05:38:57

朝花夕拾——再看java类变量的初始化内幕的相关文章

再看JAVA 设计模式-单例【转】

单例模式大家并不陌生,也都知道它分为什么懒汉式.饿汉式之类的.但是你对单例模式的理解足够透彻吗?今天我带大家一起来看看我眼中的单例,可能会跟你的认识有所不同. 下面是一个简单的小实例: [java] view plaincopyprint? //简单懒汉式 public class Singleton { //单例实例变量 private static Singleton instance = null; //私有化的构造方法,保证外部的类不能通过构造器来实例化 private Singleto

再看Java之温故知新(体系篇)

一 数据类型 1.1 8种基本数据类型 1.2 引用数据类型 1.3 java内存机制 1.3.1 寄存器 1.3.2 栈 1.3.3 堆 1.3.4. 静态区/方法区 1.3.5. 运行时常量池(Runtime Constant Pool) 1.3.6 直接内存(Direct Memory) 二:面向对象思想 2.1封装 2.2 继承 2.3 多态 2.3.1 方法重载(Overloading) 2.3.2 方法覆盖(Overriding) 2.4 抽象 2.4.1 抽象类 2.4.2 接口

201671010111 2016-2017-2《Java程序设计》再看java

本周已经是学习Java的第二周了,课程进度已到第三章.那么我们对Java有了一个大概的认识.其语法近似于C语言,却又异于C语言.类似于C语言,却又有很多优越于C语言的地方.终于明白了课本第一章说java是一个优秀程序员的首选语言,作为一个优秀的程序员,使用java无疑是一个好的选择. 老师开始实行反转课堂教学法,一节理论课分为前一小时和后一小时.前一小时的时间用来做检测题,后一小时的时间则讲解这些题目.题目是老师涵盖了前三章的知识出的,检测到了前三章所有的重要知识点.一看到这些题目,内心就有一种

再看Java基本类型

Java中的基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte.short.int.long.float.double. 数值类型又可以分为整数类型byte.short.int.long和浮点数类型float.double.JAVA中的数值类型是有符号的,它们的取值范围是固定的,不会随着机器硬件环境或者操作系统的改变而改变. 先看看各种类型所占的字节长度,long型和double型都占8个字节,float和int占4个字节,short和char占2个字节,byte

java类的初始化和构造函数

本人小白一枚,看java类的初始化的时候好晕的说,我觉着书上虽然说的对,但总觉得有些信息没说出来,没说清楚,看了好多文章博客的,现在有些感悟,来小写下总结,也算是为以后再次复习种个好果子. 先摘一下书上写的: 加载:将类的class文件读入内存,并为之创建一个java.lang.class对象. 连接:把类的二进制数据合并到JRE中,检查被加载的类是否有正确的内部结构,并和其他类协调一致.为类的静态FIELD分配内存,设置默认值,将类的二进制数据中的符号引用替换成直接引用. 初始化:主要对静态F

朝花夕拾——看清java实例变量的初始化内幕

过一段时间可能就得去找实习,今天在宿舍翻开以前常放在枕头边的大砖头<Java编程思想>打算重温下之前学的知识点,看到有关java初始化的一些知识,综合之前看过的网页和书籍,记下自己对java实例变量初始化的理解,仅供需要的朋友参考,也为自己积累一些java编程应该注意的知识点. java中对实例变量的初始化可以在三个地方出现:定义实例变量时指定初始值:初始化块中为实例变量指定的初始值:构造器中为实例变量指定的初始值.如果理解其内部初始化的规律,一般在编程和面试中出现的变量赋值问题基本都可以解决

Java类变量和成员变量初始化过程

一.类的初始化 对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量. 类的编译决定了类的初始化过程. 编译器生成的class文件主要对定义在源文件中的类进行了如下的更改: 1)       先按照静态成员变量的定义顺序在类内部声明成员变量. 2)       再按照原java类中对成员变量的初始化顺序进行初始化. 一个java类和编译后的class对应的转换如下: 源文件: public class Person{ public static String name=

java中类的初始化和对象的初始化

静态的属于全局静态区,这个部分独立存在,不管是成员还是块,都是静态的,大家地位相等,先到先得. 然后是成员初始化,这个部分在类的构造函数前初始化,因为编译器(或者设计者)可能认为构造函数调用了这个成员变量,所以在其前初始化了.或者说是成员自己有自己的能力来初始化自己,不用构造函数来管,这部分属于能力比较强的,虽然没有静态的地位高,但是,还是能自给自足的一部分团体. 最后才构造函数,这个时候就开始动工来建立这个类的实例了.这个步骤相当于建大楼,终于开始建立了,前面的准备工作已经准备完了,下面就开始

6.JAVA编程思想初始化和清除

欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/51040234 随着计算机的进步,'不安全'的程序设计已成为造成编程代价高昂的罪魁祸首之一. 许多 C程序的错误都是由于程序员忘记初始化一个变量造成的.对于现成的库,若用户不知道如何初始化库的一个组件,就往往会出现这一类的错误.清除是另一个特殊的问题,因为用完一个元素后,由于不再关心,所以很容易把它忘记.这样一来,那个元素占用的资 源会一直保留下去,极易产生资源(主要是内存)用