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

是构造方法创建的对象吗

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,由于静态对象和实例无关。而是与类关联。


posted @ 2017-04-20 11:32  lytwajue  阅读(473)  评论(0编辑  收藏  举报