`
paddy.w
  • 浏览: 505173 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java变量初始化

    博客分类:
  • Java
阅读更多
        先看一个例子:
public class Test {
	public static Test test=new Test("static test");
	public static int a=5;
	public int b=2;
	{
		System.out.println("非静态初始化块,此时a的值是:"+a+",b的值是:"+b);
	}
	public Test(String str){
		System.out.println("from "+str);
		System.out.println("a:"+a+" "+"b:"+b);
		a++;
		b++;
		System.out.println("in the constructor,此时a的值是:"+a+",b的值是:"+b);
	}
	
	public static void main(String[] args) {
		Test test=new Test("instance test");
	}
}

        执行结果是:
非静态初始化块,此时a的值是:0,b的值是:2
from static test
a:0 b:2
in the constructor,此时a的值是:1,b的值是:3
非静态初始化块,此时a的值是:5,b的值是:2
from instance test
a:5 b:2
in the constructor,此时a的值是:6,b的值是:3


        初次使用一个类创建对象时,JVM实际上做了三歩工作:加载、链接、初始化。在程序中能看到的是第二步“链接”中的“准备阶段”和第三步“初始化”。
        首先只对静态成员变量a进行分析。在准备阶段会将静态成员变量的值设为默认,也就是test=null,a=0。
        然后,在初始化阶段对静态成员变量赋初值。首先是test=new Test("static test")。从执行结果可以看出此时a==0,这正是准备阶段所赋的默认值。之后a++,即a==1。再初始化a:a有初始值5,此时a==5(如果a没有初始值,那么a不会被强制赋值,也就是保持a==1)。之后a++,此时a==2。
        最后,执行test=new Test("instance test")时,由结果可知,此时a==5,a++,a==6。最后输出a为6。

        关于非静态成员变量b,在这里只说一下b在整个执行过程中的变化,因为在某些地方我也没有弄的很透彻。初始化从test开始,这里new了一个对象,此时在构造器执行之前执行了非静态代码块,此时a==0而b已经直接初始化为2。在构造器内部b++,输出结果可知b==3。到此,Test的初始化过程结束。

        初始化顺序:
父类的静态代码——>子类的静态代码——>父类的非静态代码——>父类构造函数——>子类非静态代码——>子类构造函数
分享到:
评论

相关推荐

    Java变量初始化的时机

    以下是对java变量初始化的时机的分析。  【java变量执行初始化的步骤】  java是一门强类型语言,因此java语言规定每个变量必须先声明,然后才能使用,声明变量时必须指定该变量的数据类型。首先看下面这条语句的...

    java数组初始化详解

    需要注意的是,在 Java 中,数组变量必须在使用前进行初始化,否则将会抛出 NullPointerException。 二维数组的初始化 在 Java 中,二维数组可以通过多种方式进行初始化。 1. 声明数组变量:`int[][] a;`,这只...

    java类变量初始化顺序

    详细讲解java类中静态变量,普通标量,对象、基本类型的初始化顺序。

    探究java的ClassLoader及类变量初始化顺序

    理解ClassLoader的工作机制以及类变量初始化的顺序对于深入理解Java运行时环境至关重要。这篇博文将探讨这两个主题。 首先,让我们深入了解Java的ClassLoader。ClassLoader是一个抽象类,它是Java中的一个关键组件...

    java程序初始化顺序

    在Java编程语言中,程序初始化的顺序是一个关键概念,它涉及到类加载、对象创建以及执行流程的安排。了解这些顺序对于编写高效、无错误的代码至关重要。以下是对Java程序初始化顺序的详细说明: 1. **类加载阶段**...

    Java类加载器:静态变量初始化.docx

    Java 类加载器静态变量初始化机制详解 Java 类加载器是 Java 语言的核心组件之一,负责将 Java 字节码文件加载到内存中,以便 JVM 可以执行它们。在 Java 中,类加载器是通过委派机制来实现的,即一个类加载器可以...

    Java静态初始化块和对象初始化块

    静态初始化块常用于设置类级别的变量,或者执行只应执行一次的初始化操作。例如,如果一个类需要在程序运行前设置一个常量数组,静态初始化块就是合适的选择。 ```java public class InitFiledBlockStatic { ...

    java代码的初始化顺序demo

    总之,Java代码的初始化顺序是类加载的必然过程,涉及到静态和实例初始化块、构造函数、成员变量初始化以及继承关系的影响。这个demo是学习和理解这些概念的重要工具,通过实际操作可以加深对Java内存管理和对象生命...

    浅谈Java变量的初始化顺序详解

    总结一下Java变量初始化顺序的要点: 1. **静态变量与静态初始化块**:首先按照在类中定义的顺序初始化所有静态变量和执行静态初始化块。这是在类被加载到内存时发生的,与对象创建无关。 2. **非静态变量与初始化...

    Java中static静态变量的初始化完全解析

    ### 静态变量初始化的基本规则: 1. **默认初始化**:当类被加载时,静态变量首先会被赋予其数据类型的默认值。例如,`int`类型的静态变量会被初始化为`0`,`boolean`为`false`,引用类型为`null`。 2. **显式初始化...

    Java类继承初始化顺序

    4. **子类成员变量初始化**:最后,执行子类的非静态成员变量初始化。 在实际编程中,`super`关键字用于引用父类的成员。例如,`super.someMethod()`调用父类的`someMethod()`方法,`super.someVariable`访问父类的...

    java 初始化与方法

    在Java中,类的初始化通常发生在以下几个时刻:当类被首次加载、创建类的实例、访问静态变量或调用静态方法时。初始化过程包括了静态块和实例块的执行,以及构造函数的调用。静态初始化块用于在类加载时执行一次的...

    6种方法初始化JAVA中的list集合

    本文将详细介绍6种初始化Java List集合的方法,并通过代码示例帮助理解每种方法的使用和特点。 1. 常规方式 这是最常见的初始化List的方式,通过创建ArrayList实例并逐个添加元素。自JDK 7以后,可以省略泛型类型的...

    java中类的初始化顺序

    // 实例成员变量初始化 public static TestB b = new TestB(); public static void main(String[] args) { new TestOrder(); } } class TestA { public TestA() { System.out.println("Test--A"); } } ...

    java面试题-类的初始化顺序.doc

    这个顺序表明,无论类之间的继承关系如何,初始化顺序始终是:静态变量和静态初始化块先于非静态成员。在创建对象时,父类的初始化先于子类。这是Java语言规范所规定的,确保在子类访问父类的静态或非静态成员时,...

    关于Java静态成员变量和静态初始化块等的初始化顺序的详细介绍

    详细介绍了Java的静态成员变量、静态数据块、非静态成员变量和非静态成员变量等初始化顺序

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

    Java 变量的初始化及静态方法的实现 ...本文详细介绍了 Java 变量的初始化和静态方法的实现,通过示例代码和分析,阐述了变量初始化和静态方法的应用场景和重要性。希望本文能够对读者的学习和工作产生帮助和影响。

    java代码初始化流程研究

    Java代码的初始化流程是编程者在开发过程中需要深入了解的关键环节,它涉及到类加载、静态变量初始化、构造函数执行等多个步骤。下面将详细讲解这个过程。 首先,Java代码的执行始于类加载。当程序运行时,Java...

    Java静态和非静态成员变量初始化过程解析

    Java静态和非静态成员变量初始化过程解析 Java静态和非静态成员变量初始化过程解析是Java语言中一个非常重要的概念。了解Java静态和非静态成员变量的初始化过程对大家的学习或者工作具有一定的参考学习价值。 首先...

Global site tag (gtag.js) - Google Analytics