zoukankan      html  css  js  c++  java
  • 透析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,由于静态对象和实例无关。而是与类关联。


  • 相关阅读:
    一个非常棒的jQuery 评分插件好东西要分享
    Visual Studio 2012 更新包2发布,附离线安装方法及下载
    ECC Copy Client 之后的SAP*登陆问题 沧海
    使用现有ECC数据库进行安装或者恢复系统 沧海
    SAP 登陆平衡(SAP Logon Balancing) 沧海
    Target host or target server ***** is not in operation mode 沧海
    如何获得系统设置参数列表 沧海
    IDES安装之后的配置 沧海
    关于Basware的使用随想 沧海
    Information About the SAP Load Generator (SGEN) 沧海
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6737848.html
Copyright © 2011-2022 走看看