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

MoeRookie
3 声望1 粉丝

为全国人民的居家智能化而竭尽吾力!