最近面试中,有一个问题,java中使用new创建一个对象的时候,详细的过程是怎么样的。
当时还真被问住了,一直做开发没深究其中的原理。 这几天看了下java编程思想中的第五章和第七章,大致了解了下。
首先看一个类Dog:
package cn.tutorinfo.classloader;
public class Dog {
private String name;
// 静态成员变量
private static DogProfile profile = new DogProfile("公", 3);
// 静态代码块
static {
System.out.println("Dog的静态代码区域");
}
// 静态方法
public static void doSomething() {
System.out.println("执行Dog类中的静态方法 doSomething()方法");
}
// 构造方法
Dog(String name) {
this.name = name;
System.out.println("Dog的名字是:" + name);
}
public static void main(String[] args) {
new Dog("京巴");
// Dog.doSomething();
// System.out.println(Dog.profile);
}
}
class DogProfile {
private String male;
private Integer age;
DogProfile(String male, Integer age) {
this.male = male;
this.age = age;
System.out.println("DogProfile构造方法");
}
@Override
public String toString() {
return new StringBuilder("Dog的雌雄是:").append(this.male).append(",年龄是:").append(this.age).toString();
}
}
当 main方法中代码是new Dog()时,程序的输出结果,:
DogProfile构造方法
Dog的静态代码区域
Dog的名字是:京巴
当main方法中代码是Dog.doSomething()时,程序输出结果是:
DogProfile构造方法
Dog的静态代码区域
执行Dog类中的静态方法 doSomething()方法
当main方法中代码是System.out.println(Dog.profile) 时,程序输出结果是:
DogProfile构造方法
Dog的静态代码区域
Dog的雌雄是:公,年龄是:3
Dog类中我分别设置了一个普通的属性和一个静态属性,同时类中还存在一个static 代码区域,通过分析程序的结果,我们可以大致了解了对象的创建过程:
1. 所有的类都是在对其第一次使用时,动态加载到JVM中。当首次创建类型为Dog的对象时,或者Dog类的静态方法,静态属性域首次被访问时,java解释器查找classPath,定位到Dog.class文件
2. 载入Dog.class文件,生成一个Class类型对象,所有有关的静态初始化动作都会执行,静态代码块,静态成员属性。 并且这种初始化动作只在Class对象首次加载时候进行一次。
3. 当用new Dog()创建对象时,首先JVM在堆heap上为Dog对象分配足够的存储空间
4. 存储空间清空,自动将Dog对象中的所有基本类型数据都设置成了默认值,对象引用被设置为null
5. 执行所有在字段定义处的一些初始化操作
6. 调用构造器方法。(没有继承)
如此一来,便创建了这个对象.
以上是不存在继承的情况下的执行过程,如果是存在多重继承的情况下呢?
首先看代码:
package cn.tutorinfo.classloader;
class DogProfile {
private String male;
private Integer age;
DogProfile(String male, Integer age) {
this.male = male;
this.age = age;
System.out.println("DogProfile构造方法");
}
@Override
public String toString() {
return new StringBuilder("Dog的雌雄是:").append(this.male).append(",年龄是:").append(this.age).toString();
}
}
class Dog {
private String name;
// 静态成员变量
private static DogProfile profile = new DogProfile("公", 3);
// 静态代码块
static {
System.out.println("Dog的静态代码区域");
}
// 静态方法
public static void doSomething() {
System.out.println("执行Dog类中的静态方法 doSomething()方法");
}
// 构造方法
Dog(String name) {
this.name = name;
System.out.println("Dog的名字是:" + name);
}
}
class JingbaDog extends Dog {
private static DogProfile profile = new DogProfile("母", 2);
JingbaDog(String name) {
super(name);
System.out.println("JingbaDog的名字是:" + name);
}
}
public class DogExamp extends JingbaDog {
private static DogProfile profile = new DogProfile("母", 1);
DogExamp(String name) {
super(name);
System.out.println("DogExamp的名字是:" + name);
}
//生成一个DogExamp对象
public static void main(String[] args) {
new DogExamp("不知名");
}
}
main方法中就只生成一个DogExamp对象,程序输出是:
1. DogProfile构造方法
2. Dog的静态代码区域
3. DogProfile构造方法
4. DogProfile构造方法
5. Dog的名字是:不知名
6. JingbaDog的名字是:不知名
7. DogExamp的名字是:不知名
我们结合没有继承的情况下的流程,以及上述的结果分析下:
java解释器在类路径中查找DogExamp.class文件后,会根据继承规则,定位JiingbaDog.class 和Dog.class. 分别载入后生成相应的Class对象,此时按照上述的流程,依次执行静态初始化的动作.
首先在Dog类中执行静态初始化,在初始化静态属性profile时,导致实例化Dogprofile对象,输出第一行。然后执行静态代码块,导致输出第二行。
接下来,子类JingbaDog中执行静态初始化动作,同样初始化了profile静态属性,导致实例化DogProfile对象,输出第三行,同理,DogExamp中的静态成员初始化,输出第4行。
静态初始化结束后,按照类的继承关系的构造方法的调用,首先执行基类Dog的构造方法,输出第5行
然后执行JingbaDog的构造方法,输出第6行。
最后执行自身的构造方法 输出第7行.
根据以上分析,我们得出的结论是:
1. 当首次创建一个类的对象时(此时即是调用构造方法,构造方法也是隐式的静态),或者类的静态方法被调用,静态成员属性被引用时,java解释器都将查找类对象的class文件
2. 载入class文件后生成Class对象时,会执行静态初始化所有动作。(包括父类的静态成员和静态代码块)
3. 执行类定义在字段处的初始化动作
4. 递归调用构造器执行构造方法
....
分享到:
相关推荐
### Java对象创建过程详解 在Java编程语言中,对象是程序的基本单元,一切皆对象这一概念使得Java在面向对象编程领域具有重要的地位。本文将详细阐述Java对象的创建过程,帮助读者深入理解Java基础。 #### 一、类...
#### 一、Java对象、引用及创建过程 在Java中,对象是程序的基本单位,它包含了属性(成员变量)和行为(方法)。对象是由类创建出来的实例,而类则是一组具有相同属性和行为的对象的模板。 ##### 1. 对象创建与...
在对象创建的过程中,JVM是如何决定为对象分配多少内存的呢?这个问题涉及到JVM的具体实现以及对象本身的结构。一般而言,对象在内存中的布局可以分为三个部分: 1. **对象头(Object Header)**:存储对象自身的运行...
Java中创建对象主要有四种显式的方式,分别是使用new关键字、反射机制、克隆克隆方法...在实际开发中,选择合适的对象创建方式能够提高程序的效率和性能,同时也要注意对象创建过程中可能出现的内存泄漏和性能问题。
在Java编程语言中,实例化对象是创建类的实例,使其具有特定状态和行为的过程。这个过程涉及到几个关键步骤,让我们深入探讨一下。 首先,我们需要一个类,它是创建对象的蓝图。在Java中,我们使用`class`关键字来...
整个Java对象创建过程涉及到内存的动态分配、类的加载、字段的初始化、构造函数的调用等多个步骤,这些都是Java运行时系统的核心部分。了解这些机制对于编写高效且稳定的Java应用程序至关重要。通过本文,读者可以更...
#### 二、对象与引用的创建过程 考虑下面的示例代码: ```java class Student { String name; int age; } // 创建对象 Student stu = new Student(); ``` 这段代码实际上执行了四个步骤: 1. **创建对象**: `...
此外,对于性能敏感的应用,了解对象创建过程有助于优化内存使用和减少垃圾回收的压力。例如,通过避免不必要的对象创建,或者使用池化技术来重用对象,可以提高程序的效率。 总的来说,Java中对象的创建是程序运行...
本文将详细探讨Java对象在JVM中的创建过程以及其内存布局,帮助读者更深入地理解Java对象是如何在内存中产生的。 #### 二、对象的创建 Java对象是由类实例化的结果,当我们使用`new`关键字创建一个对象时,实际上...
首先,让我们了解基本的对象创建过程。在Java中,我们通常通过`new`关键字来创建对象。例如: ```java MyClass myObject = new MyClass(); ``` 然而,如果我们要控制对象的个数,直接使用这种方式可能会导致无限制...
在实际开发中,了解对象创建和垃圾回收的原理可以帮助我们编写出更高效、资源利用率更高的代码。例如,避免创建大量短生命周期的对象(称为"对象抖动"),合理使用数据结构和集合类,以及适时调用`System.gc()`...
首先,对象属性值的校验通常在对象创建(构造函数)或属性赋值时进行。这是为了确保对象的状态始终符合预设的业务规则。例如,一个用户类可能要求用户名不为空,年龄必须是正整数等。这些规则可以通过在setter方法内...
### Java中对象的生命周期 ...通过对对象创建、初始化和销毁过程的了解,我们可以更好地管理内存资源,并避免常见的编程错误。此外,掌握构造函数的使用和调用方式有助于我们更灵活地控制对象的状态和行为。
在Java中,通过`new`关键字和类的构造方法来创建对象。实验中,我们创建了两个`Monkey`对象`monkey1`和`monkey2`,并调用了它们的方法,展示了对象的使用。 成员变量和局部变量是Java中的两种变量类型。成员变量是...
java中把对象转化为byte数组的方法 Java 中将对象转化为 byte 数组的方法是指将 Java 对象序列化为二进制数据流,以便在网络上传输或存储。这种方法可以应用于各种领域,如分布式计算、网络通信、数据存储等。 在 ...
* 执行启动类的main函数 -> 创建对象的继承树从高到底的类层次中的静态块(如果已经被执行过,则不会重复执行) -> * 继承树中的从最高层开始的实例语句块{}、然后对应的构造函数、以及构造函数中调用的方法 * ...
对象的创建过程 创建一个对象包括三个主要步骤:对象的说明、对象的实例化和对象的初始化。 - **对象的说明**:声明对象,即告诉编译器我们想要创建的对象是什么类型。 - **对象的实例化**:使用`new`关键字为...
在开发过程中,我们会用到Java的开发工具,如JDK(Java Development Kit),它包含了编译器javac、解释器java以及各种开发工具。 在实际开发中,我们还需要了解MVC(Model-View-Controller)设计模式,它常用于构建...
Java 对象创建过程是 Java 语言中一个非常重要的知识点,对于 Java 程序员来说,了解对象的创建过程是非常必要的。本文将从汇编码角度分析 Java 对象的创建过程,并对 Java 对象创建过程的每一步进行详细的解释。 ...