在继承的超级方法中返回 `this` class

Returning `this` in a super method of inherited class

假设我有 class A 和 class B 扩展 A, 这是 classes:

答:

public class A {
    public int x;
    public static int y;
    public A(int x, int y) {
        this.x = x;
        this.y = y;
    }
    public int getX() { return x; }
    public static int getY() { return y; }
    public A get1() { return this; }
    public A get2() { return new B(x, y); }
}

乙:

public class B extends A {
    public int x;
    public B(int x, int y) {
        super(x, y);
        this.x = x*2;
        this.y = y*2;
    }
    public int getX() { return x; }
        public static int getY() { return y*3; }
    public A get1() {
        x++;
        return super.get1();
    }
    public A get2() { return get1(); }
}

这是主要功能:

public static void main(String[] args) {
    A a1 = new A(5, 10);
    A a2 = a1.get2();
    A a3 = a2.get2();

    System.out.println("a1.x=" + a1.x);
    System.out.println("a1.y=" + a1.y);
    System.out.println("a2.x=" + a2.x);
    System.out.println("a2.getX()=" + a2.getX());
    System.out.println("a2.getY()=" + a2.getY());
    System.out.println("((B)a2).getY()=" + ((B)a2).getY());
    System.out.println("((B)a2).x=" + ((B)a2).x);
    System.out.println("a3 is A: " + (a3.getClass() == A.class));
    System.out.println("a3 is B: " + (a3 instanceof B));
    System.out.println("a3==a2: " + (a3 == a2));
}

我的问题是 a2a3 对象, a3基本上就是a2.get2(),按照这个方法会达到Aget1()的方法returns this.

由于在 class A 中找到了该方法,我确信它只会 return 对对象 a2A 部分的引用,而不是对整个对象的引用,

所以当我尝试这条线时: a3.getClass() == A.class 我会得到 True.

当我调试时 a3.getClass() 是 "class B"。

有人可以向我解释 return this 线在父亲 class 体内时的实际作用吗?

谢谢!

让我们一步一步地追踪语句:

  1. a1 是对类型 A.
  2. 的实例的引用
  3. a1.get2() 调用 A 中的 get2() 方法,其中 return 是对类型 B 的实例的引用,因此 a2 指的是B 类型的实例。
  4. a2.get2()调用了B中的get2()方法。请记住,a2 是类型 B 的实例,因此 this 指的是 B
  5. get2() B 中的方法调用 B 中的 get1() 方法。 this 仍然指的是 B.
  6. get1() B 中的方法调用 super.get1()。这是它可能会有点混乱的地方。即使您从父 class 调用 get1 方法,this 仍然在运行时引用 B
  7. 因此,super.get1() returns Bget1()B return 中 Bget2()B return 中 B。因此,a3 指的是类型 B.
  8. 的实例

来自 java 文档 Object#getClass

public final Class getClass()

Returns the runtime class of this Object

getClass 方法 return 是一个对象的运行时 class 所以当你调用 getClass 对类型实例的引用时你会得到B。如果 getClass 未设计为 return 实际实例类型,它将始终 returned Object 这将使该方法毫无意义。

关键字this引用了当前对象实例。没有 "A part of the B object",即子类中没有对超类的引用。被继承的对象并没有被分成不同的部分;您实例化了一个对象,它被 this 从实例方法中引用,而不管这些实例方法在哪里声明。

所以你有一个 B 对象,并且 this 在 A 中声明的方法中。如果直接或间接地从 B 调用该方法,那么它将引用该 B 对象。