看问题 : 在 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 为本类当前的对象