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

时间:2015-06-20 14:00:29

标签: java inheritance polymorphism this

让我们说我有A课,B课延长A, 这是课程:

A:

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:

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(),在按照该方法后,它会转到返回A的{​​{1}} get1()方法。

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

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

我调试时True是" B"。

有人可以向我解释一下a3.getClass()行在父类中的实际行为吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

让我们一步一步地跟踪陈述:

  1. a1是对A类型实例的引用。
  2. a1.get2()调用get2()中的A方法,该方法返回对B类型实例的引用,因此a2引用类型为{B的实例1}}。
  3. a2.get2()调用get2()中的B方法。请注意,a2B类型的实例,因此this引用B
  4. get2()中的
  5. B方法调用get1()中的B方法。 this仍然引用B
  6. get1()调用B中的
  7. super.get1()方法。这是它可能会有点混乱的地方。即使您从父类调用get1方法,this仍然在运行时引用B
  8. 因此,super.get1()会返回Bget1()中的B会返回Bget2()中的B会返回B。因此,a3指的是B类型的实例。
  9. 来自Object#getClass

    的java文档
      

    public final Class getClass()

         

    返回此Object

    的运行时类

    getClass方法返回对象的运行时类,以便在对getClass类型的实例的引用上调用B时获得的内容。如果getClass没有被设计为返回实际的实例类型,那么它将始终返回Object,这会使该方法毫无意义。

答案 1 :(得分:1)

关键字this指的是当前对象实例。没有" B对象的一部分",即,没有对子类内的超类的引用。继承的对象不分为不同的部分;实例化一个对象,this从实例方法中引用它,无论这些实例方法的声明位置如何。

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