谈谈JAVA中的循环初始化问题

原创 2008年10月03日 19:23:00

1.       初始化的顺序问题即一个对象的创建过程

1)        定位相关类的class文件

2)        载入class文件,静态(static)初始化只在class对象首次加载时进行一次,静态变量定义的先后决定了初始化的顺序

3)        当使用new创建对象时,首先在堆上为对象分配足够的内存空间

4)        这块存储空间被清零,这就将对象中的全部的基本的数据类型的数据设置为默认值(数字:0,引用设置成空)注意这里有一个例外

5)        执行所有出现在字段定义处的初始化动作(变量定义的先后决定了初始化的顺序)

6)        执行构造方法(注意:构造方法的方法体是最后执行的)

2staticfinal对于初始化的影响

静态的final变量在设置值的时候有两种可能:一种是设置为默认值,一种是设置为你给定的值,这取决于你设定的值是否是常量表达式。

例:[Java解惑]

public class Elvis {<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

    public static final Elvis INSTANCE = new Elvis();

    private final int beltSize;

    private static final int CURRENT_YEAR =2008;…………………………………..1

    private Elvis() {

        beltSize = CURRENT_YEAR - 1930;

    }   

    public int beltSize() {

        return beltSize;

    }

    public static void main(String[] args) {

        System.out.println("Elvis wears a size " +

                           INSTANCE.beltSize() + " belt.");

    }

}

执行的结果是Elvis wears a size 78 belt

public class Elvis {

    public static final Elvis INSTANCE = new Elvis();

    private final int beltSize;

    private static final int CURRENT_YEAR =                               Calendar.getInstance().get(Calendar.YEAR);……………………………………2        

    private Elvis() {

        beltSize = CURRENT_YEAR - 1930;

    }   

    public int beltSize() {

        return beltSize;

    }

    public static void main(String[] args) {

        System.out.println("Elvis wears a size " +

                           INSTANCE.beltSize() + " belt.");

    }

}

执行的结果是Elvis wears a size -1930 belt

程序的不同点是:12两句,一个设定为常量表达式,一个没有设定为常量表达式,设定为常量表达式的,在初始化的时候,即将其设定为相关的常量,否则就将其设定为默认值

该程序表明,final类型的静态域被初始化之前,存在着读取它的值的可能,而此时该静态域包含的还只是其所属类型的缺省值。这是与直觉相违背的,因为我们通常会将final类型的域看作是常量。final类型的域只有在其初始化表达式是常量表达式时才是常量

由类初始化中的循环所引发的问题是难以诊断的,但是一旦被诊断到,通常是很容易订正的。要想订正一个类初始化循环,需要重新对静态域的初始器进行排序,使得每一个初始器都出现在任何依赖于它的初始器之前。

【java解惑】类和实例的初始化循环问题

如下所示代码:public class Example049 { private int overtime; public static Example049 INSTANCE = new Ex...
  • imu2008
  • imu2008
  • 2015年11月04日 08:42
  • 258

Java中两种字符串初始化方法的区别

Java中两种字符串初始化方法的区别 String str1 = new String("abc"); String str2 = "abc"; 虽然两个语句都是返回...
  • Wei_Smile
  • Wei_Smile
  • 2015年04月12日 10:41
  • 762

谈谈最近工作情况

最近项目就要结束了,现在总结一下这几个月的经历,分享一下心得。         刚刚加入一个新的项目,面对不熟悉的框架和业务,不用着急。我建议的流程是这样的:在开始几天,首先,你需要知道并去了解当前...
  • liusong0605
  • liusong0605
  • 2013年08月06日 21:38
  • 1021

java 惰性初始化

下面这个可怜的小类实在是太懒了,甚至于都不愿意用通常的方法进行初始化,所以它求助于后台线程。这个程序会打印什么呢?每次你运行它的时候都会打印出相同的东西吗? public class Lazy ...
  • qingxili
  • qingxili
  • 2015年05月09日 22:52
  • 773

谈谈Java基础数据类型

Java的基本数据类型 类型 意义 取值 boolean 布尔值 true或false byte 8位有符号整型 -128~127 short 16位有符号整...
  • wangyangzhizhou
  • wangyangzhizhou
  • 2017年06月08日 18:27
  • 1926

java数组逆序用for循环,for循环的初始化语句定义了两个变量

package com.Test; import java.util.*; public class Test { public static void main(String[] args)...
  • huaground
  • huaground
  • 2017年02月19日 16:50
  • 1176

Java for Web学习笔记(六):Servlet(4)HttpServletResponse

设置HTTP响应的所有内容。包括headers,body,重定向响应,设置响应码、cookies等等。继承ServletRequest。写响应Body使用getOutStream()返回一个javax...
  • flowingflying
  • flowingflying
  • 2015年11月12日 12:31
  • 1614

Java中初始化块和静态初始化块的区别

http://www.cnblogs.com/woshijpf/articles/3632489.html 在Java中,有两种初始化块:静态初始化块和非静态初始化块. 静态初始化块:...
  • hotdust
  • hotdust
  • 2016年06月29日 09:39
  • 606

浅谈对java集合的理解

首先是集合的框架图, 图片来源 Java集合是java提供的一个工具包,全部继承自java.util.*。主要包括两大接口Collection接口和Map接口以及相关的工具类(Iterator...
  • kiwi4814
  • kiwi4814
  • 2016年09月20日 21:13
  • 1211

面试题-谈谈对java的认识

Java的基本认识 1、基本介绍 Java是一种跨平台的面向对象的开发语言。具有 简单性,面向对象,分布式,解释型,可靠,安全,平台无关,可移植,高性能,多线程,动态性等特点。 2、具体...
  • u011545779
  • u011545779
  • 2014年04月13日 18:39
  • 2216
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:谈谈JAVA中的循环初始化问题
举报原因:
原因补充:

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