`

Java 类的初始化时机

 
阅读更多

1.单个类的初始化顺序

 

/**
 * 
 * @author long 单个类的初始化顺序 1.父>子 2.静态的初始化顺序大于非静态 3.属性大于构造器
 * 
 *         注意虽然非静态变量不能向后引用非静态变量<br>
 *         因为先初始化静态变量,所以非静态变量可以向后引用静态变量
 * 
 */

class Person {
	public int name, age;
	public static int legs;

	public Person(final int name, final int age) {
		this.name = name;
		this.age = age;
	}

	public void info() {
		System.out.println(name + "," + age);
	}
}

public class InitClass01 {

	int num1 = num2 + 20;
	// static int num1=num2+20;
	// int num2=10;
	static int num2 = 20;

	/**
	 * 分清类对象 实例对象 一个jvm中只有一个类对象存储静态变量等 实例对象可以有多个
	 */
	public void test1() {
		Person.legs = 2; // 类对象初始化完成
		final Person p1 = new Person(1, 2);
		System.out.println(Person.legs);
		p1.info();

		new Person(3, 4);
		Person.legs = 4;

		System.out.println(Person.legs);
		System.out.println(Person.legs);
		System.out.println(Person.legs);
	}

	public static void main(final String[] args) {
		new InitClass01().test1();
	}

}

 2.单个类非静态变量的初始化顺序

/**
 * 对象实例变量的初始化时机 1,2种方式比第三种更早执行,但是1,2种对比则看他们的顺序<br>
 * 1.定义变量时候指定值 2.非静态块 3.构造函数
 * 
 */

// 判断weight的值
class Cat {
	String name;
	int age;
	double weight = 2.3;

	public Cat(final String name, final int age) {
		this.name = name;
		this.age = age;
	}

	{
		weight = 2.0;
	}

	// double weight=2.3;

	public void info() {
		System.out.println(name + "," + age + "," + weight);
	}
}

public class InitClass02 {
	public static void main(final String[] args) {
		final Cat cat1 = new Cat("cat1", 10);
		cat1.info();
	}

}

 

3.单个类的静态变量的初始化顺序

/**
 * 
 * @author long 类的静态变量初始化时机 1,2是根据其出现的先后顺序进行初始化的。类似于非静态变量和非静态块<br>
 *         1.定义变量的时候赋值 2.静态块中初始化
 * 
 */

/**
 * 1.为类变量分配内存空间 2.初始化属性
 */
class Price {
	final static Price INSTANCE = new Price(2.8);
	static double initPrice = 20;
	double currentPrice;

	public Price(final double discount) {
		currentPrice = initPrice - discount;
	}
}

public class InitClass03 {

	static {
		count = 3;
	}
	static int count = 2;

	public void test1() {
		System.out.println(InitClass03.count);
	}

	// 解释结果
	public void test2() {
		System.out.println(Price.INSTANCE.currentPrice);
		final Price p = new Price(2.8);
		System.out.println(p.currentPrice);
	}

	public static void main(final String[] args) {
		new InitClass03().test1();
	}

}

 4.父子类的各个属性的初始化顺序

/**
 * 
 * @author long 父子类的初始化顺序 1.初始化父类的静态属性和静态块 2.初始化子类的静态属性和静态块 3.初始化父类的非静态块
 *         4.初始化父类的构造器 5.初始化子类的非静态块 6.初始化子类的构造器
 * 
 *         初始化父类的静态属性和静态块是肯定的 比较父类的构造器和子类的静态块哪个先执行 如果先执行父类的构造器说明已经执行了子类的构造器
 *         但是静态属性和静态块在构造器之前执行 所以应该先执行子类的静态属性和静态块
 * 
 *         为甚么要先执行静态块而不是构造器 因为对象就算为空也引用静态变量 所以在构造器之前先初始化静态块和静态属性
 * 
 *         构造器可以看成三块 1.super(Obj);可以省略参数 2.非静态块 3.构造器代码
 */
// 总是先执行父类的非静态初始化块 父类的构造器
class Creature {
	static {
		System.out.println("creature静态块");
	}

	{
		System.out.println("creature 的非静态初始化块");
	}

	public Creature() {
		System.out.println("creature 的无参构造器");
	}

	public Creature(final String name) {
		System.out.println("creature 的一个有参构造器");
	}
}

class Animal extends Creature {
	static {
		System.out.println("animal 的静态初始化块");
	}
	{
		System.out.println("animal的非静态初始化块");
	}

	public Animal() {
		System.out.println("animal的无参构造器");
	}

	public Animal(final String name) {
		super(name);
		System.out.println("animal的一个有参构造器");
	}

	public Animal(final String name, final int age) {
		this(name);
		System.out.println("animal的两个有参数构造器");
	}
}

public class InitClass04 {
	public static void main(final String[] args) {
		new Animal();
	}
}

 

0
0
分享到:
评论

相关推荐

    Java类初始化时机测试方法解析

    Java类初始化时机测试方法解析 Java类初始化时机测试方法解析是Java编程语言中一个重要的概念,涉及到类的加载、链接、初始化等过程。下面我们将对Java类初始化时机测试方法进行详细的解析。 首先,我们需要了解...

    java中类的初始化顺序

    ### Java中类的初始化顺序详解 #### 一、概述 在Java编程语言中,类的初始化是一个非常重要的概念。类的初始化涉及到多个方面,包括静态成员变量、实例成员变量、静态初始化块、实例初始化块以及构造函数等。本文...

    Java变量初始化

    Java 变量初始化的时机可以分为两类:实例变量初始化和类变量初始化。 实例变量初始化 实例变量初始化可以在三个地方进行: 1. 定义实例变量的时候指定初始值; 2. 非静态初始化代码块中对实例变量指定初值; 3. ...

    深入java虚拟机(三)——类的生命周期(下)类的初始化1

    【深入Java虚拟机(三)——类的生命周期(下)类的初始化1】 类的生命周期在Java中是一个关键的概念,它涵盖了从加载到卸载的整个过程。在类的生命周期中,初始化阶段是非常重要的,因为它涉及到类的静态变量的赋值...

    Java变量初始化的时机

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

    java初始化和清理

    首先,Java初始化的主要特性表现在类的加载过程上。与其他一些传统编程语言(如C++)不同,Java的类并不是在程序启动时立即加载的。Java类是在需要使用时,比如创建对象、访问静态域或静态方法时,才会被加载。这种...

    java数组初始化详解修正版.doc

    - **初始化时机**:在使用数组之前,必须先进行初始化。未初始化的数组试图访问或修改其元素会导致编译错误或运行时异常。 #### 三、静态初始化 静态初始化是指在创建数组的同时,由程序员显式地为数组中的元素赋...

    学习java静态数据初始化.doc

    在Java中,静态初始化主要用于在类被加载时初始化类的静态成员。这种初始化只会在类首次被加载时发生一次,之后创建该类的新实例时不会再次触发。静态初始化通过`static`关键字标记,可以用于声明静态变量、静态方法...

    Java类的基本运行顺序

    例如,通过Excel表格,我们可以列出各个类的加载时机、依赖的其他类以及对应的初始化操作,便于团队协作和代码管理。 总之,理解Java类的运行顺序对于编写高质量的Java代码至关重要。熟练掌握这些概念和工具,可以...

    java类加载知识点整理

    #### 三、类初始化时机 根据虚拟机规范,类的初始化仅在某些特定情况下发生。例如,创建一个新对象或调用静态方法时,虚拟机才会执行类的初始化过程。此外,初始化还可能因为反射调用、子类初始化或虚拟机启动时的...

    java类加载过程详解.doc

    Java 类加载过程是Java虚拟机...理解Java类加载过程有助于优化程序性能,如通过自定义类加载器实现热部署,或者通过控制初始化时机来避免不必要的资源消耗。同时,这也对理解JVM内存模型和异常处理机制有着重要的作用。

    JAVA类加载机制与动态代理

    类加载机制负责将描述类的数据从`.class`文件加载到内存,并进行必要的校验、转换解析和初始化,使之成为可以被Java虚拟机直接使用的Java类型。根据Java虚拟机规范的规定,在以下几种情况下必须对类进行初始化: 1....

    java类加载机制

    其中,类的初始化时机尤为重要。根据Java规范,以下几种情况必须对类进行初始化: 1. **遇到特定字节码指令**: - 当遇到 `new` 指令时,即使用 `new` 关键字实例化对象。 - 使用 `getstatic` 或 `putstatic` ...

    深入理解Java类加载.docx

    类加载的时机并不固定,但有五种情况会触发初始化: 1. 创建类实例(new关键字)。 2. 访问或修改类的静态字段(非final修饰的)。 3. 调用类的静态方法(invokestatic指令)。 4. 反射调用类的方法或字段。 5. 初始...

    多条数据的初始化-消息资源文件

    总而言之,通过`StartupServlet.java`初始化消息资源并在`LabelMgr.java`中进行管理和使用,开发者能够为用户提供一个具备多语言支持的Web应用。理解如何有效地处理这些资源对于构建可扩展且易于维护的应用至关重要...

    ButterKnife事件初始化

    ### ButterKnife的初始化 在Activity或Fragment中,我们需要在合适的时机调用`ButterKnife.bind()`方法来完成绑定。通常,这个方法在`onCreate()`或`onViewCreated()`方法中调用: ```java @Override protected void...

    Java虚拟机----类的加载过程.docx

    初始化阶段是最后一步,它按照特定的时机触发类的初始化。Java虚拟机规范规定了5种触发初始化的主动引用情况: 1. 使用new关键字实例化对象。 2. 访问或修改类的静态字段(不包括final修饰的静态常量)。 3. 调用类...

    解析Java虚拟机中类的初始化及加载器的父委托机制

    类的初始化时机则分为主动使用和被动使用。主动使用包括: 1. 创建类的实例。 2. 访问类的静态变量或对其进行赋值。 3. 调用类的静态方法。 4. 使用反射`Class.forName`。 5. 初始化子类。 6. JVM启动时作为启动类的...

Global site tag (gtag.js) - Google Analytics