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 getTrue
”之类的语句。@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));
}