问题
Could you help me understand what gets printed in the code below System.out.println(super.getClass().getName());
?
I see "PrintSubClass3"
printed, even when I have mentioned super
.
class PrintClass {
int x = 0;
int y = 1;
void printMe() {
System.out.println("X is " + x + ", Y is " + y);
System.out.println("I am an instance of the class " +super.getClass().getName());
}
}
class PrintSubClass3 extends PrintClass {
int z = 3;
void printMe() {
System.out.println("x is " + x + ", y is " + y + ", z is " + z);
System.out.println(super.getClass().getName());
super.printMe();
}
public static void main (String args[]) {
PrintSubClass3 obj = new PrintSubClass3();
obj.printMe();
}
}
回答1:
super.getClass()
calls the method getClass()
as defined by the parent class (ignoring any getClass
method you may have defined in the class itself -- not sure if that is even possible with getClass
, probably final
).
This ends up calling Object#getClass
, which returns the runtime class of the instance (which is what it is, an instance of PrintSubClass3
).
All super
does is let you call into the implementation of methods that you could otherwise not reach because you have overridden them. Here, it is redundant, as this.getClass()
and super.getClass()
end up at the same method.
回答2:
getClass()
method returns the runtime class of this Object. In another words, your obj object, which is the object of class name PrintSubClass3
. So because of that, it will return PrintSubClass3
.
so calling inside your class, it will give you its own class, even though there is super
keyword. there is super keyword, it will go to its superClass for finding the method getClass(), but since its not implemented explicitly in superClass, getClass() method will work as documentation says ~ it will return runtime class of the object.
If you really want to print your superClass's name you should do this
System.out.println(super.getClass().getSuperclass());
I hope this will clear your confusion.
what is the ideal way to print name of the class?
simply type this (you can print without super keyword )
System.out.println(getClass().getName()); //Prints your local class
System.out.println(getClass().getSuperclass()); //Prints your superClass
来源:https://stackoverflow.com/questions/34893848/in-java-super-getclass-prints-an-unexpected-name-in-the-derived-class-why-is