Java变量的初始化问题探究

对于java的变量,我们知道有成员变量和局部变量。

关于他们的初始化,基本上所有书上都会写。成员变量,java会帮助你初始化,局部变量,则需要程序员自己初始化。

对于类的成员变量。不管程序有没有显示的初始化,Java  虚拟机都会先自动给它初始化为默认值。

规则为:

1、整数类型(byte、short、int、long)的基本类型变量的默认值为0。

2、单精度浮点型(float)的基本类型变量的默认值为0.0f。

3、双精度浮点型(double)的基本类型变量的默认值为0.0d。

4、字符型(char)的基本类型变量的默认为 “/u0000”。

5、布尔性的基本类型变量的默认值为 false。

6、引用类型的变量是默认值为 null。

7、数组引用类型的变量的默认值为 null。春关键数组变量的实例后,如果没有没有显示的为每个元素赋值,Java 就会把该数组的所有元素初始化为其相应类型的默认值。

局部变量初始化

局部变量声明以后,Java 虚拟机不会自动的为它初始化为默认值。因此对于局部变量,必须先经过显示的初始化,才能使用它。

如果编译器确认一个局部变量在使用之前可能没有被初始化,编译器将报错。

那么,加了修饰的java成员变量是如何初始化的呢?在何时?在程序中的什么位置?

下面看个小程序。

public class TestC {  
    /*  
     * 定义成员变量  
     * 尾数为1表示定义时进行初始化赋值  
     * 尾数为2表示在代码块中进行初始化赋值  
     * 尾数为3表示在构造函数中进行初始化赋值  
     * 尾数为4表示在静态代码块中进行初始化赋值  
     * 尾数为5表示不初始化赋值  
     */  
    /*  
     * 普通成员变量   
     */  
    int field_a1 = 5;  
    int field_a2;  
    int field_a3;  
    //报错:不能再静态代码块中使用非静态变量。 Cannot make a static reference to the non-static field field_a4  
    //int field_a4;  
    int field_a5;  
    /*  
     * final 成员变量  
     */  
    final int  field_b1 = 5;  
    final int  field_b2;  
    final int  field_b3;  
    //报错:不能再静态代码块中使用非静态变量。Cannot make a static reference to the non-static field field_b4  
    //final int  field_b4;  
    //报错:未初始化 。The blank final field field_b5 may not have been initialized  
    //final int  field_b5;  
    /*  
     * static成员变量  
     */  
    static int field_c1 = 5;  
    static int field_c2;  
    static int field_c3;  
    static int field_c4;  
    static int field_c5;  
    /*  
     * static final 成员变量  
     */  
    static final int field_d1 = 5;  
    //报错:未初始化 。The blank final field field_d2 may not have been initialized  
    //static final int field_d2;  
    //报错:未初始化 。The blank final field field_d3 may not have been initialized  
    //static final int field_d3;  
    static final int field_d4;  
    //报错:未初始化 。The blank final field field_d5 may not have been initialized  
    //static final int field_d5;  
      
    //代码块  
    {  
        field_a2 = 5;  
        field_b2 = 5;  
        field_c2 = 5;  
        //field_d2 = 5;  
    }  
      
    //静态代码块  
    static{  
        //field_a4 = 5;  
        //field_b4 = 5;  
        field_c4 = 5;  
        field_d4 = 5;  
    }  
      
    //构造函数  
    public TestC(){  
        field_a3 = 5;  
        field_b3 = 5;  
        field_c3 = 5;  
        //field_d3 = 5;  
    }  
}

然后我们对这个程序生成的.class文件进行反编译,看看他是如何运行的。
下面是TestC.jad文件。反编译文件

[html] view plaincopy

  1. <span style="font-family:Microsoft YaHei;font-size:18px;">public class TestC
  2. {
  3. public TestC()
  4. {
  5. field_a1 = 5;
  6. field_a2 = 5;
  7. field_c2 = 5;
  8. field_a3 = 5;
  9. field_c3 = 5;
  10. }
  11. int field_a1;
  12. int field_a2;
  13. int field_a3;
  14. int field_a5;
  15. final int field_b1 = 5;
  16. final int field_b2 = 5;
  17. final int field_b3 = 5;
  18. static int field_c1 = 5;
  19. static int field_c2;
  20. static int field_c3;
  21. static int field_c4 = 5;
  22. static int field_c5;
  23. static final int field_d1 = 5;
  24. static final int field_d4 = 5;
  25. }</span>

看到这里我们就很有清晰的思路了。

对于不加修饰的普通成员变量,无论我们在什么地方对其进行初始化赋值,系统都会默认在构造函数中进行赋值。

对于final变量,无论我们在什么地方进行赋值,系统会默认final变量是在类中进行初始化。

对于static,系统会根据我们的需求,而在不同位置进行初始化。

通过报错,我们可以发现。

final变量必须进行初始化。否则就会报编译错误。The blank final field field_d5 may not have been initialized

static成员变量的初始化发生在类被类加载器(classLoader)加载的时候系统会对没有初始化的静态成员变量在静态区进行默认赋值。

普通成员变量的初始化发生在JVM为类生成实例开辟空间的时候进行默认初始化赋值。

时间: 2024-11-09 03:18:27

Java变量的初始化问题探究的相关文章

Java变量方法初始化顺序

面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量, 构造器里可能还有一段代码对变量值进行了某种运算,另外还有一些将变量值输出到控制台的代码,然后让我们判断输出的结果.这实际上是在考查我们对于继承情况下类的初始化顺序的了解. 我们大家都知道,对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序以此是 (静态变量.静态初始化块)>(变量.初始化块)>构造器. 我们也可以通过下面的测试代码来验证这一点: 父类--静态变量 父类

java变量的初始化

public class Init { private int age;//非静态初始化语句<3> private static String name; //静态初始化语句,先初始化静态 <1.1> /**静态初始化语句和静态初始化模块都是静态(同等级),谁在前面先初始化谁*/ {/**动态初始化模块(非静态初始化模块)<4>*/ double width; float price; System.out.println("父类非静态"); } s

[Java]变量及其初始化 与 类对象的初始化

1 变量的初始化 1.1 变量的[定义] 1.2 变量的[作用域] 1.3 变量的[初始值] 1.4 补充:缓存变量 1.5 变量的[分类]与[未初始化情况] 2 类对象 2.1 类对象的初始化/构造过程 1 [对象]的初始化流程 2 实验 class Base{ static { System.out.println("[Base:static area]"); }//step1 { System.out.println("Base:instance area")

Java变量的初始化以及静态方法

1.变量初始化 1 package treat; 2 class InitializeBlockClass 3 { 4 public int field=100; 5 { 6 field=200; 7 } 8 public InitializeBlockClass(int value) 9 { 10 this.field=value; 11 } 12 public InitializeBlockClass() 13 { 14 15 } 16 } 17 18 public class treat

Java变量初始化的时机

对于JAVA中变量的初始化是一个很基础的问题,其中的一些问题也是易被学习者所忽略.当在编写代码的时候碰到时,常被这些问题引发的错误,感觉莫名其妙.而且现在许多大公司的面试题,对于这方面的考查也是屡试不爽.以下是对java变量初始化的时机的分析. [java变量执行初始化的步骤] java是一门强类型语言,因此java语言规定每个变量必须先声明,然后才能使用,声明变量时必须指定该变量的数据类型.首先看下面这条语句的执行过程: int a = 5; 实际上面这条语句会被拆分成两个过程执行: (1)i

java变量,初始化快,构造函数的执行顺序

转自 http://blog.csdn.net/macheng365/article/details/6403050 —————————————————————————————————————————————————— 对于JAVA中类的初始化是一个很基础的问题,其中的一些问题也是易被学习者所忽略.当在编写代码的时候碰到时,常被这些问题引发的错误,感觉莫名其妙.而且现在许多大公司的面试题,对于这方面的考查也是屡试不爽.不管基于什么原因,我认为,对于java类中的初始化问题,有必要深入的了解.Ja

JAVA变量初始化赋值null

 在Java中,null值表示引用不指向任何对象.运行过程中系统发现使用了这样一个引用时·可以立即停止进一步的访问,不会给系统带来任何危险. 1.如果是对象的field的话那么系统在初始化对象的时候会把那些对象的值赋值为null,基本数据类型也有它们的初始值 2.如果是在方法内,那么程序员需要自己给这些变量赋值. class T{   Object obj = null;   Object obj1;//系统在初始化的时候会自动的给他赋值为null } class T{   public voi

Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造器)(转)

大家在去参加面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量,构造器里可能还有一段代码对变量值进行了某种运算,另外还有一些将变量值输出到控制台的代码,然后让我们判断输出的结果.这实际上是在考查我们对于继承情况下类的初始化顺序的了解. 我们大家都知道,对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序以此是(静态变量.静态初始化块)>(变量.初始化块)>构造器.我们也可以通过下面的测试代码来验证这一点: Java代码 p

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

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