Java类对象化原理版权声明
原创Java创建对象的过程包括 类初始化( JVM类加载机制 )和类实例化两个阶段。
一、Java对象创建计时
(1)使用new关键字创建对象
(2)反射创建对象
使用Class类的newInstance方法
Student student2 = (Student)Class.forName("Student类的完全限定名").newInstance();
使用Constructor类的newInstance方法
Constructor
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 }
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除