博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
透析Java本质-谁创建了对象,this是什么
阅读量:4326 次
发布时间:2019-06-06

本文共 2482 字,大约阅读时间需要 8 分钟。

是构造方法创建的对象吗

package com.java.essence_36;import java.util.ArrayList;import java.util.List;/** * Created by lw on 14-5-23. * 

* 构造器做了什么? * 对象是谁创建的?构造器? * 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
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,由于静态对象和实例无关。而是与类关联。

转载于:https://www.cnblogs.com/lytwajue/p/6737848.html

你可能感兴趣的文章
Python爬虫面试题170道:2019版【1】
查看>>
JavaBean规范
查看>>
第四阶段 15_Linux tomcat安装与配置
查看>>
NAS 创建大文件
查看>>
学习笔记-模块之xml文件处理
查看>>
接口测试用例
查看>>
面试:用 Java 实现一个 Singleton 模式
查看>>
Sybase IQ导出文件的几种方式
查看>>
案例:手动输入一个字符串,打散放进一个列表,小写字母反序 大写字母保持不变...
查看>>
linux 系统下 tar 的压缩与解压缩命令
查看>>
阿里负载均衡,配置中间证书问题(在starcom申请免费DV ssl)
查看>>
转:How to force a wordbreaker to be used in Sharepoint Search
查看>>
MySQL存储过程定时任务
查看>>
Python中and(逻辑与)计算法则
查看>>
POJ 3267 The Cow Lexicon(动态规划)
查看>>
设计原理+设计模式
查看>>
音视频处理
查看>>
tomcat 7服务器跨域问题解决
查看>>
前台实现ajax 需注意的地方
查看>>
Jenkins安装配置
查看>>