`

看似简单,也许很多人都不知道-java类以及对象的初始化过程

阅读更多
最近翻看下java编程思想,对java类和对象的初始化有点困惑,查阅了一些资料:
一、java类初始化
对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量。
类的编译决定了类的初始化过程。编译器生成的class文件主要对定义在源文件中的类进行了如下的更改:
  1、先按照静态成员变量的定义顺序在类内部声明成员变量。
  2、再按照原java类中对成员变量的初始化顺序进行初始化。
源文件
public class Person {
	public static String name = "gyq";
	public static int age;
	static {
		age = 20;
		System.out.println("初始化了age");
	}
	public static String address;
	static {
		address = "shenyang";
		age = 21;
	}

	public static void main(String[] args) {
		System.out.println(name);
		System.out.println(age);
		System.out.println(address);
	}
}

当java源代码转换成一个class文件后,其转换成类似下面的代码:
public class Person{  
	public static String name;  
	public static int age;  
	public static String address;  
	static{  
	name="gyq";  
	age=20;  
	System.out.println("初始化了age");  
	address="shenyang";  
	age=21;  
	}  
	public static void main(String[] args) {  
	                   System.out.println(name);  
	                   System.out.println(age);  
	                   System.out.println(address);  
	         }  
	} 

初始化顺序依据转换后对应的class类成员变量的初始化顺序依次执行,所以所有的静态成员变量都是先声明,后执行赋值的,而且赋值的顺序也是依照源代码对静态成员变量初始化的顺序进行的,注意:定义一个成员变量并直接初始化与在静态代码块中进行初始化是等价的,都是依据它们在源代码中定义的顺序进行的。
二、java对象的生成
对于对象的生成其初始化过程与类的初始化过程类似,但会增加构造函数阶段,源代码如下:
package package1;

public class Person {
	{
		name = "gyq";
		age = 20;
		System.out.println("初始化了age");
		address = "shenyang";
	}
	public String name = "ddl";
	public int age = 21;
	public String address = "dalian";

	public Person() {
		name = "ddlgyq";
		age = 27;
		address = "shenyang";
	}
}

编译器转换成class文件后,会转换成类似下面的代码:
public class Person {
	public String name;
	public int age;
	public String address;

	public Person() {
		name = "gyq";
		age = 20;
		System.out.println("初始化了age");
		address = "shenyang";
		name = "ddl";
		age = 21;
		address = "dalian";
		name = "ddlgyq";
		age = 27;
		address = "shenyang";
	}
}

可以看到,对于类中对成员变量的初始化和代码块中的代码全部都挪到了构造函数中,并且是按照java源文件的初始化顺序依次对成员变量进行初始化的,而原构造函数中的代码则移到了构造函数的最后执行。

  类的初始化和对象的初始化都可以按照以上说的模型进行记忆。死记硬背只能起到事倍功半的效果,按照模型记忆,则可以事半功倍
10
5
分享到:
评论
8 楼 ddlgyq 2013-05-31  
在世界的中心呼喚愛 写道
ddlgyq 写道
在世界的中心呼喚愛 写道
很好奇,楼主是怎么从class中得出执行的顺序?
用什么工具查看??
那些踩的人是什么看法?

可以通过java的编译命令 javac -cp java文件名.java 通过生成的字节码查看执行顺序。踩的人估计都是大牛,对这个不屑一顾吧

think in java 在第几章节提过

很多书籍都有介绍
7 楼 在世界的中心呼喚愛 2013-05-31  
ddlgyq 写道
在世界的中心呼喚愛 写道
很好奇,楼主是怎么从class中得出执行的顺序?
用什么工具查看??
那些踩的人是什么看法?

可以通过java的编译命令 javac -cp java文件名.java 通过生成的字节码查看执行顺序。踩的人估计都是大牛,对这个不屑一顾吧

think in java 在第几章节提过
6 楼 ddlgyq 2013-05-31  
在世界的中心呼喚愛 写道
很好奇,楼主是怎么从class中得出执行的顺序?
用什么工具查看??
那些踩的人是什么看法?

可以通过java的编译命令 javac -cp java文件名.java 通过生成的字节码查看执行顺序。踩的人估计都是大牛,对这个不屑一顾吧
5 楼 在世界的中心呼喚愛 2013-05-31  
很好奇,楼主是怎么从class中得出执行的顺序?
用什么工具查看??
那些踩的人是什么看法?
4 楼 fxf-风翔飞 2013-05-30  
学习了 这个还真没想过
3 楼 BabyDuncan 2013-05-30  
学习了
2 楼 jyan1992 2013-05-30  
学习了,
1 楼 lvwenwen 2013-05-29  
类的初始化和对象的初始化

相关推荐

    Java起航 ---- 类的初始化历程

    在Java编程语言中,类的初始化是一个至关重要的过程,它涉及到类加载、连接以及初始化等多个阶段。本篇文章将深入探讨“Java起航——类的初始化历程”,并结合JVM(Java虚拟机)的工作原理,帮助你更好地理解这个...

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

    在Java编程语言中,初始化块是程序执行时用于初始化对象或类的重要机制。这里我们将深入探讨两种类型的初始化块:静态初始化块(Static Initializer Block)和对象初始化块(Instance Initializer Block)。这两种...

    JAVA类与对象及数组习题

    构造方法是类的特殊方法,用于初始化对象的状态。调用构造方法的方式有很多,其中正确的是通过new关键字自动调用。 2. 多重继承的方式: JAVA不支持多重继承,但是可以通过接口和内部类实现多重继承的效果。 3. ...

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

    这意味着静态成员和静态初始化块对于所有类的实例都是共享的,而实例成员和实例初始化块则是每个对象独有的。 在面试中,面试官可能会通过这种类型的题目来评估应聘者对Java内存模型的理解,以及他们在编写代码时...

    天轰穿系列教程之-16利用构造函数初始化对象

    天轰穿系列教程之-16利用构造函数初始化对象天轰穿系列教程之-16利用构造函数初始化对象天轰穿系列教程之-16利用构造函数初始化对象天轰穿系列教程之-16利用构造函数初始化对象天轰穿系列教程之-16利用构造函数初始...

    Java基础[03-面向对象].

    面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程 强调的是功能行为 面向对象 将功能封装进对象,强调具备了功能的对象。 面向对象是基于面向过程的。

    Java类继承初始化顺序

    当我们谈论“Java类继承初始化顺序”时,涉及到的关键知识点包括构造器、成员变量的初始化、super关键字以及方法的覆盖。 首先,了解类初始化的顺序至关重要。当创建一个子类实例时,初始化过程遵循以下步骤: 1. ...

    Java对象初始化的多维度分析 (2).pdf

    Java 对象初始化是一个基础概念,但是很多人不知道它的内涵,特别是在类继承时。下面,我们从三个维度来分析 Java 对象的初始化过程。 一、从程序运行维度分析 在 Java 中,对象初始化是一个复杂的过程。我们可以...

    java实例化对象的过程

    在Java编程语言中,实例化对象是创建类的实例,使其具有特定状态和行为的过程。这个过程涉及到几个关键步骤,让我们深入探讨一下。 首先,我们需要一个类,它是创建对象的蓝图。在Java中,我们使用`class`关键字来...

    java初级视频教程系列之-java初始化

    "Java初级视频教程系列之-java初始化"是一套专为初学者设计的教育内容,由经验丰富的IT专家精心录制,旨在帮助学习者掌握Java编程的基础,特别是关于对象初始化的重要概念。 在Java中,初始化是一个关键的步骤,它...

    类和对象的初始化过程.zip

    在Java编程语言中,类和对象的初始化是程序运行的基础,因为它们构成了面向对象编程的核心。这个压缩包文件包含三个源代码文件:StaticTest.java、Test.java和Father.java,它们可能用于演示类和对象初始化的不同...

    Java-面向对象设计-类和对象.docx

    构造方法是类的特殊方法,用于初始化对象的状态。 在设计类时,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会再被扩展,那么就设计为final类。final类的成员方法没有机会被覆盖,默认情况下...

    Java--类与对象

    - 调用类的构造方法初始化对象。 ##### 示例代码解析 ```java public class Manager { public static void main(String[] args) { // 创建对象 Student st1 = new Student(); st1.setName("比尔盖茨"); // ...

    java 初始化与方法

    本文将深入探讨Java中的初始化过程、方法的定义与调用,以及与之相关的源码和工具应用。 首先,让我们从类的初始化开始。在Java中,类的初始化通常发生在以下几个时刻:当类被首次加载、创建类的实例、访问静态变量...

    java类与对象教学(1)

    在Java编程语言中,"类与对象教学(1)"是一个重要的学习主题,它涵盖了面向对象编程的基本概念,对比了面向对象编程(OOP)与面向过程编程(POP),并深入探讨了类、对象以及如何在实际开发中创建和使用它们。...

    JAVA面试题解惑系列(一)——类的初始化顺序-JAVA程序员JAVA工程师面试必看.pdf

    在Java编程世界中,类的初始化顺序是理解面向对象编程概念的一个重要方面。尤其对于那些准备应对技术面试的Java程序员和工程师来说,掌握这一知识点是面试时的必备能力之一。本文将深入探讨Java中类的初始化顺序,...

    java类变量初始化顺序

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

    Java变量初始化

    Java 变量初始化的时机是指在 Java 语言中变量的初始化过程,包括变量的声明、初始化和赋值的步骤。 Java 变量声明 在 Java 语言中,每个变量必须先声明,然后才能使用。声明变量时必须指定该变量的数据类型。...

    基于java的开发源码-ejbCreate函数用于初始化一个EJB实例.zip

    基于java的开发源码-ejbCreate函数用于初始化一个EJB实例.zip 基于java的开发源码-ejbCreate函数用于初始化一个EJB实例.zip 基于java的开发源码-ejbCreate函数用于初始化一个EJB实例.zip 基于java的开发源码-...

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

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

Global site tag (gtag.js) - Google Analytics