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(),第二行就是构造代码块的部分,后面的就是构造函数中的代码。成员变量的初始化过程如下:①默认初始化②父类初始化③显示初始化④构造代码块和构造函数初始化。所以打印出这样的结果大家也就明白了吧。
这里我用父类(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(),第二行就是构造代码块的部分,后面的就是构造函数中的代码。成员变量的初始化过程如下:①默认初始化②父类初始化③显示初始化④构造代码块和构造函数初始化。所以打印出这样的结果大家也就明白了吧。
相关文章推荐
- java对象转化成String类型
- eclipse在线安装SVN
- struts2 之配置拦截器使网站页面在session失效后退回到登录页面
- Java核心技术第12章(4)
- JAVA抽象类与接口的比较
- Spring MVC: <context:annotation-config> 和 <context:component-scan>区别
- Eclipse没有marketplace选项
- Java 299之输出二维数组中的最大值
- 5.33Java 三星题 current date and time
- java -Xms -Xmx设置java应用程序运行的内存大小,Xms Xmx PermSize MaxPermSize 区别
- SpringMVC(1)框架原理
- java复习:集合框架
- OC的方法调用-和Java对比
- CAS的配置,登录界面的更改以及数据库的连接--Java(Eclipse,非Maven)
- Spring自定义标签的原理
- java实现WebSocket即时通信
- javaweb博客
- JavaWeb学习总结(五十)——文件上传和下载
- 从内存溢出看Java 环境中的内存结构
- 关于邮箱怎么验证是不是真实的企业邮箱(java汉字和英文呼唤)