Java类对象化原理版权声明

原创
小哥 3年前 (2022-10-28) 阅读数 276 #JAVA
文章标签 javajava教程

Java创建对象的过程包括 类初始化( JVM类加载机制 )和类实例化两个阶段。

一、Java对象创建计时

(1)使用new关键字创建对象

(2)反射创建对象

使用Class类的newInstance方法

Student student2 = (Student)Class.forName("Student类的完全限定名").newInstance();

使用Constructor类的newInstance方法

Constructor constructor = Student.class.getConstructor(Integer.class);

Student stu3 = constructor.newInstance(123);

(3)使用Clone方法创建一个对象(实现)。Cloneable接口)

每当我们调用对象的clone方法,JVM将帮助我们创建一个新的、相同的物体,特别是。clone该方法在对象创建期间不调用任何构造函数。

(4)使用(反)序列化机制创建对象(实现)。Serializable接口)

当我们反序列化一个对象时,JVM将为我们创建一个单独的对象,在这个过程中,JVM未调用任何构造函数。

二. Java 创建对象的过程。

创建对象时,虚拟机为对象自己的实例变量及其从父类继承的实例变量分配内存(即使从超类继承的这些实例变量可能被隐藏,也会分配空间)。

在为这些实例变量分配内存时,还会为它们提供缺省值。(零值)。

它主要涉及三个执行对象初始化的结构,即 实例变量初始化、实例代码块初始化、构造函数初始化。

编译器构造类的构造函数。()(按顺序):

父类构造函数

实例变量初始化和实例块初始化相关代码。

它自己的构造函数

1,实例变量初始化和实例代码块初始化按编程顺序进行,第一个实例代码块不允许访问后面定义的实例变量,但可以赋值。

// 编译错误:代码块无法访问稍后定义的实例变量。 public class InstanceInitializer {
{
j = i;
}

private int i = 1;  
private int j;  

}

// 没有问题:一段代码可以为之后定义的实例变量赋值。 public class InstanceInitializer {
{
j = 1;
}

private int i = 1;  
private int j;  

}

2、每一个Java中的对象将至少有一个构造函数,如果我们不显式定义构造函数,它将有一个默认的非参数构造函数。

Java强制所有对象(Object是Java对于顶级对象,没有超类)构造函数的第一条语句必须是超类构造函数的调用语句或类(super()/this()必须在第一句中,并且不能同时出现)。如果我们既不调用另一个构造函数,也不显式调用超类构造函数,编译器将自动为我们生成对超类构造函数的调用。

3实例化类的对象的过程是一个典型的递归过程。

第一次实例化Object类,然后依次实例化以下类别,直到完成目标类的实例化。

3.全面的例子

// 父类 class Foo { int i = 1;

Foo() {
    System.out.println(i);// -----------(1)
    int x = getValue();
    System.out.println(x);// -----------(2)
}

{
    i = 2;
}

protected int getValue() {
    return i;
}

}

// 子类 class Bar extends Foo { int j = 1;

Bar() {
    j = 2;
}

{
    j = 3;
}

@Override
protected int getValue() {
    return j;
}

}

public class ConstructorExample { public static void main(String... args) { Bar bar = new Bar(); System.out.println(bar.getValue());// -----------(3) } }

/*

  • Output: 2 0 2 */

//Foo类构造函数的等价变换。: Foo() { i = 1; i = 2; System.out.println(i); int x = getValue();// 在执行Foo构造函数进程,原因是Bar重载了Foo中的getValue方法,因此它调用Bar的getValue方法 System.out.println(x); }

//Bar类构造函数的等价变换。 Bar() { Foo(); j = 1; j = 3; j = 2 }

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门