乐趣区

Java构造方法中this关键字的解析

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