Java 在继承类的超级方法中返回'this'

Java 在继承类的超级方法中返回'this',java,inheritance,polymorphism,this,Java,Inheritance,Polymorphism,This,假设我有类A和类B,它们扩展了A, 以下是课程: A: B: 以下是主要功能: 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.prin

假设我有类
A
和类
B
,它们扩展了
A
, 以下是课程:

A:

B:

以下是主要功能:

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));
}
我的问题是
a2
a3
对象,
a3
基本上是
a2.get2()
,遵循该方法后,它将到达返回此
A
get1()
方法

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

所以当我尝试这一行时: a3.getClass()==A.class 我将得到
True

当我调试
a3时,getClass()
是“class B”

有人能给我解释一下
返回这个
行在父类中的实际作用吗


谢谢

让我们一步一步跟踪这些语句:

  • a1
    是对类型为
    a
    的实例的引用
  • a1.get2()
    调用
    A
    中的
    get2()
    方法,该方法返回对
    B
    类型的实例的引用,因此
    a2
    引用
    B
    类型的实例
  • a2.get2()
    调用
    B
    中的
    get2()
    方法。请记住,
    a2
    是类型
    B
    的一个实例,因此
    指的是
    B
  • B
    中的
    get2()
    方法调用
    B
    中的
    get1()
    方法
    仍指
    B
  • B
    中的
    get1()
    方法调用
    super.get1()
    。这就是它可能变得有点混乱的地方。即使从父类调用
    get1
    方法,
    this
    在运行时仍然引用
    B
  • 因此,
    super.get1()
    返回
    B
    <
    B
    中的code>get1()
  • 返回
    B
    <
    B
    中的code>get2()
    返回
    B
    。因此,
    a3
    引用类型为
    B
    的实例 来自
    对象的java文档#getClass

    公共最终类getClass()

    返回此对象的运行时类


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

    关键字
    this
    引用当前的对象实例。没有“B对象的一部分”,即子类中没有对超类的引用。继承的对象不会划分为不同的部分;实例化一个对象,它由实例方法中的
    this
    引用,而不管这些实例方法声明在哪里


    因此,您有一个B对象,
    这个
    在a中声明的方法中。如果直接或间接地从a B调用该方法,那么它将引用该B对象。

    什么是
    a2
    a3
    ?你所说的
    a3
    基本上是
    a2.get2()
    。你所说的遵循这个方法之后是什么意思。请提供所有相关信息。那么,请忘记“我确信它只会返回对
    A
    part的引用”。Java中没有对部分对象的引用。请不要在没有修改代码的情况下发布诸如“i will get
    True
    ”之类的语句。@ChetanKinger我用相关的主函数更新了帖子,由于某种原因,我在最初的帖子中忘记了该函数。@argamanza My bad。这可能是个意外。请参阅我的答案以获得逐步解释。
    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));
    }