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

透析Java本质-谁创建了对象,this是什么

2014-05-23 14:55 561 查看

是构造方法创建的对象吗

package com.java.essence_36;

import java.util.ArrayList;
import java.util.List;

/**
* Created by lw on 14-5-23.
* <p/>
* 构造器做了什么?
* 对象是谁创建的?构造器?
* this到底是什么?
*/

class SupperConstructorInvocation {

SupperConstructorInvocation() {
this(1);//只能是第一句调用其他构造器,默认super();最后递归到Object
//this(1,2); //error
//super();   //error
}

SupperConstructorInvocation(double d) {
//this();
System.out.println(d);
}

SupperConstructorInvocation(int i, int y) {
//this();
}
}

public class ConstructorInvocation extends SupperConstructorInvocation {

public void demo() {
//this(); //error ,只能在构造器中调用构造器
}

public static void main(String[] args) {
/*ConstructorInvocation constructorInvocation
=new ConstructorInvocation(1);*/
//构造器不能继承

//测试,new对象时候构造器的参数列表执行了吗?
new SupperConstructorInvocation(100 / Math.PI);
//输出31.830988618379067,说明100 / Math.PI执行了才执行构造函数里的内容

/**
*  运行内存
*   -Xms1m -Xmx1m
*  执行结果如图1,说明对象创建成功后才去执行构造方法
*  不是构造方法创建的对象
*/
CreateObject.getMaxObjects();

}
}

class CreateObject {

CreateObject() {
CreateObject object = new CreateObject();
}

CreateObject(int temp) {
System.out.println("CreateObject(int temp)->run...");
}

private static final List<CreateObject> CREATE_OBJECT_LIST = new ArrayList<>();

public static void getMaxObjects() {
int temp = 0;
while (true) {
try {
CREATE_OBJECT_LIST.add(new CreateObject(temp = 1));
temp = 0;
} catch (Exception e) {

} finally {
System.out.println("对象创建时成功时候:构造方法执行了吗?" + (temp == 0));
}
}
}
}


(图1)
CreateObject.getMaxObjects();运行结果



谁创建了对象

执行
javac -p CreateObject.class
反编译查看



红色部分即为
CreateObject() {
CreateObject object = new CreateObject();
}
反编译内容

指令1 执行父类Object的构造初始化
指令4 执行new 创建对象指令。根据#2所指向的常量池地址创建一个新对象,
          如果创建成功则将新对象的引用压入栈。
指令8 调用自己的实例方法或者初始化方法。

由此可见:对象是先创建,然后才调用构造方法进行初始化,构造器只是实例化成员。

<init>方法是什么?见:深入讨论类的初始化

this是哪儿来的

实际上是在构造器或者实例方法中都隐式的含有一个参数,这个参数就是类的对象。
class This {

This() {

}

This(int i) {

}

/**
* 相当于

This(This this){
}

This(This this,int i){
}

*/

}
对于如下代码
This t = new This();


相当于传入一个 new 指令执行后创建对象的引用 r
This t = new This(r);
而不是 t ,因为此时对象还没有初始化,只有对象完全创建后,才会将引用返回并赋值给 t

对于静态方法,当然没有this,因为静态对象和实例无关,而是与类关联。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息