`

看似简单,也许很多人都不知道-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虚拟机)的工作原理,帮助你更好地理解这个...

    Objective-C 2.0 with Cocoa Foundation--- 7,对象的初始化以及实例变量的作用域

    其他初始化器,称为便利初始化器(convenience initializers),最终会调用指定初始化器,确保完整地初始化对象。 实例变量(instance variables)在Objective-C中存储对象的状态。它们的访问控制可以是`@public`、...

    JAVA类与对象及数组习题

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

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

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

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

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

    java JVM 类加载-初始化 过程

    java JVM 类加载-初始化 过程

    Java类继承初始化顺序

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

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

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

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

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

    java代码的初始化顺序demo

    总之,Java代码的初始化顺序是类加载的必然过程,涉及到静态和实例初始化块、构造函数、成员变量初始化以及继承关系的影响。这个demo是学习和理解这些概念的重要工具,通过实际操作可以加深对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编程思想-初始化与清理

    java编程思想-初始化与清理了解this之后,你就能更全面地理解“静态(static)方法”的含义。静态方法就是没有this的方法。在“静态方法”的内部不能调用“非静态方法”,反过来倒是可以的。而且你可以在没有创建...

    java类与对象教学(1)

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

    Java变量初始化

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

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

    这是因为静态成员属于类,不依赖于类的实例,所以在创建任何对象之前就已经完成初始化。 2. **实例变量和初始化块**:当创建子类对象时,先执行父类的实例变量初始化和初始化块,接着执行子类的实例变量初始化和...

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

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

Global site tag (gtag.js) - Google Analytics