关于java:在继承类的超级方法中返回`this`

Returning `this` in a super method of inherited class

假设我有类A和类B,扩展了A,课程如下:

答:

1
2
3
4
5
6
7
8
9
10
11
12
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); }
}

B:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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(); }
}

主要功能如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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()方法,按照此方法,将到达返回thisA方法。

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

所以当我尝试这一行时:a3.getClass()==A.Class我去叫True

当我调试a3.getClass()时,它是"B级"。

有人能给我解释一下,当return this行在父类中时,它实际上做了什么吗?

谢谢!


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

  • a1是对A类型实例的引用。
  • a1.get2()调用A中的get2()方法,该方法返回对B类型实例的引用,因此a2表示B类型实例。
  • a2.get2()调用B中的get2()方法。记住,a2B类型的一个实例,所以thisB
  • B中的get2()方法调用B中的get1()方法。this仍指B
  • B中的get1()方法调用super.get1()。这会让人有点困惑。即使从父类调用get1方法,this在运行时仍然引用B
  • 因此,super.get1()返回BB中的get1()返回BB中的get2()返回B。因此,a3是指B型的实例。
  • 从Java文档的EDOCX1到37

    public final Class getClass()

    Returns the runtime class of this Object

    getClass方法返回一个对象的运行时类,因此当您在引用B类型的实例时调用getClass时,就会得到这个类。如果getClass不是为返回实际的实例类型而设计的,它将始终返回Object,这将使该方法毫无意义。


    关键字this引用当前对象实例。没有"B对象的一部分",也就是说,在子类中没有对超类的引用。继承的对象不分为不同的部分;您实例化一个对象,并且由this从实例方法内引用该对象,而不管这些实例方法在何处声明。

    所以你有一个b对象,在a中声明的方法中有一个this。如果方法是直接或间接从b调用的,那么它将引用b对象。