让我们说我有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));
}
我的问题在于a2
和a3
个对象,
a3
基本上是a2.get2()
,在按照该方法后,它会转到返回A
的{{1}} get1()
方法。
由于该方法在类this
中找到,我确信它只会返回对A
部分对象A
的引用,而不是对整个对象的引用,
所以当我尝试这一行时:
a3.getClass()== A.class
我会得到a2
。
我调试时True
是" B"。
有人可以向我解释一下a3.getClass()
行在父类中的实际行为吗?
谢谢!
答案 0 :(得分:2)
让我们一步一步地跟踪陈述:
a1
是对A
类型实例的引用。a1.get2()
调用get2()
中的A
方法,该方法返回对B
类型实例的引用,因此a2
引用类型为{B
的实例1}}。 a2.get2()
调用get2()
中的B
方法。请注意,a2
是B
类型的实例,因此this
引用B
。 get2()
中的B
方法调用get1()
中的B
方法。 this
仍然引用B
。get1()
调用B
中的super.get1()
方法。这是它可能会有点混乱的地方。即使您从父类调用get1
方法,this
仍然在运行时引用B
。super.get1()
会返回B
。 get1()
中的B
会返回B
。 get2()
中的B
会返回B
。因此,a3
指的是B
类型的实例。来自Object#getClass
public final Class getClass()
返回此Object
的运行时类
getClass
方法返回对象的运行时类,以便在对getClass
类型的实例的引用上调用B
时获得的内容。如果getClass
没有被设计为返回实际的实例类型,那么它将始终返回Object
,这会使该方法毫无意义。
答案 1 :(得分:1)
关键字this
指的是当前对象实例。没有" B对象的一部分",即,没有对子类内的超类的引用。继承的对象不分为不同的部分;实例化一个对象,this
从实例方法中引用它,无论这些实例方法的声明位置如何。
所以你有一个B对象,并且在A中声明的方法中有this
。如果直接或间接地从B调用该方法,那么它将引用该B对象。