在 Java super.getClass() 中打印 "Child" 而不是 "Parent" - 这是为什么?
In Java super.getClass() prints "Child" not "Parent" - why is that?
在Java classes和对象中,我们使用"this"关键字来引用class内的当前对象。
从某种意义上说,我相信 "this" 实际上 return 是对象本身。
示例:
class Lion
{
public void Test()
{
System.out.println(this); //prints itself (A Lion object)
}
}
在superclass和subclass的场景中。我认为 "super" 关键字会 return superclass 的对象。不过这次好像弄错了:
示例:
class Parent
{
public Parent(){
}
}
class Child extends Parent
{
public Child(){
System.out.println(super.getClass()); //returns Child. Why?
}
}
我的问题: 在上面的例子中,我希望编译器打印出 class Parent
,但它却打印出 class Child
。为什么会这样?什么超级居然returns?
使用 super
的方法调用只会忽略当前 class 中的任何覆盖。例如:
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()
的情况下,这是一个 return 调用 class 的方法,并且不能被覆盖 - 所以虽然我可以看到为什么您可能期望它 return Parent.class
,它仍然使用与正常 returning Child
相同的 实现 。 (如果你真的想要父 class,你应该看看 Class
API。)
事实上,这通常用作覆盖的一部分。例如:
@Override public void validate() {
// Allow the parent class to validate first...
super.validate();
// ... then perform child-specific validation
if (someChildField == 0) {
throw new SomeValidationException("...");
}
}
getClass() 方法 return 对象的 class。 Super & this 引用同一个对象。所以并不是因为你用 super 引用你的对象突然改变了对象 class,它仍然是用于实例化它的 class 的实例,因此 getClass()总是 return 相同 Class 无论你是从这个还是从 super.
Super 旨在用于引用在 super class 中定义的方法的实现,它通常用于那些在 sub class 中被覆盖的方法以调用原始行为。
super 关键字将调用 parent 中的重写方法。 Child 没有覆盖该方法。所以它将忠实地 return 正确的 class 即 Child。您不会通过这种方式获得 Parent class 的实例。
在Java classes和对象中,我们使用"this"关键字来引用class内的当前对象。 从某种意义上说,我相信 "this" 实际上 return 是对象本身。
示例:
class Lion
{
public void Test()
{
System.out.println(this); //prints itself (A Lion object)
}
}
在superclass和subclass的场景中。我认为 "super" 关键字会 return superclass 的对象。不过这次好像弄错了:
示例:
class Parent
{
public Parent(){
}
}
class Child extends Parent
{
public Child(){
System.out.println(super.getClass()); //returns Child. Why?
}
}
我的问题: 在上面的例子中,我希望编译器打印出 class Parent
,但它却打印出 class Child
。为什么会这样?什么超级居然returns?
使用 super
的方法调用只会忽略当前 class 中的任何覆盖。例如:
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()
的情况下,这是一个 return 调用 class 的方法,并且不能被覆盖 - 所以虽然我可以看到为什么您可能期望它 return Parent.class
,它仍然使用与正常 returning Child
相同的 实现 。 (如果你真的想要父 class,你应该看看 Class
API。)
事实上,这通常用作覆盖的一部分。例如:
@Override public void validate() {
// Allow the parent class to validate first...
super.validate();
// ... then perform child-specific validation
if (someChildField == 0) {
throw new SomeValidationException("...");
}
}
getClass() 方法 return 对象的 class。 Super & this 引用同一个对象。所以并不是因为你用 super 引用你的对象突然改变了对象 class,它仍然是用于实例化它的 class 的实例,因此 getClass()总是 return 相同 Class 无论你是从这个还是从 super.
Super 旨在用于引用在 super class 中定义的方法的实现,它通常用于那些在 sub class 中被覆盖的方法以调用原始行为。
super 关键字将调用 parent 中的重写方法。 Child 没有覆盖该方法。所以它将忠实地 return 正确的 class 即 Child。您不会通过这种方式获得 Parent class 的实例。