看问题 : 在Java里 , 成员方法中的 this 指的是其所在方法的调用者对象 , 那构造方法中的 this 该如何解释呢?
-
首先我们知道 , 为了在初始化对象时保证形式参数的见名知义 , 那么这个时候就需要在构造方法中使用 this.属性名 = 对应的形参 来处理 .
public Car(String name,String color,int wheel){ this.name = name; this.color = color; this.wheel = wheel; }
其次 , 如果说构造方法是由某些人所说的 JVM 调用的话 , 那么根据上述结论就可以的出 this 指的是 JVM .
-
但是 , 如果分别把对象、成员方法中的this和构造方法中的this分别打印一下的话 :
public class DemoThis { public static void main(String[] args) { Car car = new Car("BMW","白色",4); System.out.println("直接打印时:"+car); car.run(); } } /** 汽车类 */ class Car{ String name; String color; int wheel; public Car(){ System.out.println("构造方法中:"+this); } public Car(String name,String color,int wheel) { System.out.println("构造方法中:"+this); this.name = name; this.color = color; this.wheel = wheel; } public void run() { System.out.println("被调方法中:"+this); } }
看打印结果 :
构造方法中:Car@7852e922
直接打印时:Car@7852e922
被调方法中:Car@7852e922 -
这就很麻烦了 , 因为 this 指的并不是 JVM .
再联想下"创建对象时"会调用对应的构造方法 , 我需要使用构造方法来初始化这个对象; 然后结合上边的实际结论是构造方法中的 this 也是 "本类当前的对象"; 所以我怀疑在构造方法调用前对象已经被创建了;
-
现在我根据《Java编程思想》给出理论证明
结合上述Car类来总结下car的创建过程:
1. 类型为 Car 的一个对象首次创建时 , Java解释器必须找到 Car.class ( 这个在事先设置好的类路径中搜索 )
2. 找到 Car.class 后 ( jvm会创建一个 Class 对象 , 这个目前不需要关心 )
3. new Car()时 , Car对象的构建进程首先会在堆内存( Heap ) 中为一个 Car对象分配足够多的存储空间
4. 首先这种存储空间会先清空 , 然后根据 Car类中的成员以及其类型分别设置它们各自的默认值
5. 执行构建器.
很明显 - 在构造方法调用前对象就已经被创建了( 至此 , 我们的猜测得到了证明 )
所以 , 对 this 的解释我认为应该有一个扩大化的说法 , this为本类当前的对象
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。