透析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,因为静态对象和实例无关,而是与类关联。
相关文章推荐
- 透析Java本质-谁创建了对象,this是什么
- 透析Java本质-谁创建了对象,this是什么
- Java创建对象的方式和C++有什么不同
- Java对象的创建 —— new之后JVM都做了什么?
- Java的对象实例是什么时候被创建
- java中 创建对象时this调用基本数据类型
- JAVA中创建一个对象有哪几种方法,有什么区别?
- Java对象的创建 —— new之后JVM都做了什么?
- 面向对象编程,C#,Java中都有this,this代表了当前的对象,那么JavaScript中this代表什么
- 什么是不可变对象(immutable object)?Java 中怎么创建一个不可变对象?
- (JAVA自学笔记)创建一个对象都在内存中做了什么事情
- 第2章 Java编程基础——FAQ2.22 创建String对象时, 使用String s=new String (“abc”)和String s=“abc”语句有什么区别?
- Java中什么是匿名对象,空参构造方法输出创建了几个匿名对象,属性声明成static
- Java:对象创建和初始化过程 推荐
- Java:对象创建和初始化过程
- [转]JAVA中对象创建和初始化过程
- Java小知识 对象创建和初始化过程,堆:栈区别
- Java对象创建和初始化过程,处理字符串的机制
- 一个有趣的java创建对象问题
- Java基础:减少对象的创建提高java性能