您的位置:首页 > 编程语言 > Java开发

Java对象实例化的过程。

2015-10-26 13:11 337 查看
对于Java程序员来说对象的实例化过程必须明白,因为有些错误就是由创建对象的时候产生的。在写程序的时候产生了不是预想中的结果,到后来通过查阅书籍才有点明白,在这里写一下自己对对象实例化过程的理解。

这里我用父类(Person)和子类(Student)来说明问题。代码如下

public
class
Person {
public String
name="Person";
public Person(){
this.name="Person Constructor";
System.out.println(name);
}
}

public
class
Student extends Person {
{
name="constructcode ";
System.out.println(name);
}
static {
System.out.println("static code");
}
public Student(){
name="studentconstructor";
System.out.println(name);
}
}

首先我们会在其他类中通过new创建一个Student对象。在Student类中有一个静态代码块,其会随着类的加载而加载,也就是说一个对象的生成必然会经过两个步骤①加载到内存生成Class的实例对象②通过new关键字生成实例对象。如果使用import关键字产生的依赖包JVM在启动的时候会自动加载所有依赖包下的类文件,为了static代码会随着类的加载而加载可以使用Class.forName(“”)来测试。对于这种动态加载可能见到的比较经典的就是数据库驱动程序的加载Class.forName(“com.mysql.jdbc.Driver”);

对于构造代码块我们完全可以将其代码看作是可以放在每个构造函数的第一行的代码(super和this语句除外),所以如果有好多个构造函数并且有相同的代码就可以把这些相同的代码放到构造代码块中。还有就是关于匿名内部类使用时,可以使用构造代码块初始化一些数据等 new Person(name,age){{....}....};这个匿名内部类会调用Person类中有name和age的构造函数并且也会使用构造代码块。

new Person() {
{
System.out.println("hehe");
}
};

如果使用这样的代码会打印Person Constructor和hehe。
这里我们首先了解了静态代码块和构造代码块的知识。然后我们就要将具体的实例化过程了
static code
Person Constructor
construct code
student constructor
这是通过new Student();打印出来的结果。第一行大家肯定已经清楚了,static代码随类的加载而加载所以首先打印。对于Student类的构造函数中第一行肯定是隐式super(),第二行就是构造代码块的部分,后面的就是构造函数中的代码。成员变量的初始化过程如下:①默认初始化②父类初始化③显示初始化④构造代码块和构造函数初始化。所以打印出这样的结果大家也就明白了吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: