在Java类和对象中,我们使用“this”关键字来引用类中的当前对象。 从某种意义上说,我相信“这个”实际上会回归自己的对象。
示例:
class Lion
{
public void Test()
{
System.out.println(this); //prints itself (A Lion object)
}
}
在超类和子类的场景中。我认为“超级”关键字会返回超类的对象。但是这次我似乎弄错了:
示例:
class Parent
{
public Parent(){
}
}
class Child extends Parent
{
public Child(){
System.out.println(super.getClass()); //returns Child. Why?
}
}
我的问题:在上面的示例中,我希望编译器打印出class Parent
,但是会打印出class Child
。为什么会这样?什么超级实际返回?
答案 0 :(得分:11)
使用super
的方法调用只会忽略当前类中的任何覆盖。例如:
class Parent {
@Override public String toString() {
return "Parent";
}
}
class Child extends Parent {
@Override public String toString() {
return "Child";
}
public void callToString() {
System.out.println(toString()); // "Child"
System.out.println(super.toString()); // "Parent"
}
}
在调用getClass()
的情况下,这是一个方法,它返回它被调用的类,并且不能被覆盖 - 所以虽然我可以看到为什么你可能期望它返回{{ 1}},它仍然正常使用相同的实现,返回Parent.class
。 (如果您确实需要父类,则应该查看Child
API。)
事实上,这经常被用作覆盖的一部分。例如:
Class
答案 1 :(得分:2)
getClass()方法返回对象的类。超级&这个引用相同的对象。所以这不是因为你用super引用你的对象,突然对象改变了类,它仍然是用于实例化它的类的实例,因此getClass()将始终返回相同的Class,无论你是从这个调用它还是来自超级。
Super用于引用超类中定义的方法的实现,它通常用于那些在子类中被重写以调用原始行为的方法。
答案 2 :(得分:0)
super关键字将在父级中调用重写方法。孩子没有覆盖那种方法。所以它将忠实地返回正确的类,即Child。您没有这样获得Parent类的实例。