package com.test;
public class Main {
public static void main(String[] args) {
System.out.println(new B().toString());
}
}
package com.test;
class A {
@Override
public String toString() {
// TODO Auto-generated method stub
return this.getClass().getName();
}
}
package com.test;
public class B extends A {
}
This program gives output com.test.B but if I change toString method of class A to
@Override
public String toString() {
return "hello";
}
Then it print hello. why?
In your first function call when the method is:
@Override
public String toString() {
// TODO Auto-generated method stub
return this.getClass().getName();
}
Since this method is invoked from the B class instance then this.getClass()
refers to B
class object. Thus getName()
function prints
com.test.B
If the same function would have been invoke by creating A
class object then output would have been,
com.test.A
And when you change the toString
function to this:
@Override
public String toString() {
return "hello";
}
it will return hello
, as you have returned the hello
as the return value.
Now if you really want to understand the @Override
then add this code to class B and in A class let the function returning hello
be there
@Override
public String toString() {
// TODO Auto-generated method stub
return this.getClass().getName();
}
Try the above code, and invoke the toString
function from class A and class B instance object. Then it will be more clear what @Override
does and how it works
Well, you're calling toString()
on an instance of B
and printing that. B
has no toString()
of its own, but inherits it from A
. The toString()
defined in A
returns the name of the class. So when B
is using it, the name of the class is com.test.B
, which is what's returned.
If you change the implementation in A
to return "hello" instead, that's what it will return.
You may have been expecting the first version to print com.test.A
, so I'll explain why that doesn't happen.
It's not that B
asks A
"what's the result of toString()
, B
asks A
"what do I have to do to get the result of toString()
. In the first case, A
tells B
"just return your (class) name", while in the second case, A
tells B
"just say 'hello'".
In this toString
method:
@Override
public String toString() {
// TODO Auto-generated method stub
return this.getClass().getName();
}
you are returning this.getClass().getName() , which returns the name of the entity (class, interface, array class, primitive type, or void) represented by this Class object, as a String.
And when you change the toString
to this:
@Override
public String toString() {
return "hello";
}
its returning hello
, because you have "hello"
as the return value.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.