求教大神下面的java代码,为什么没有调用wolf类的getDesc方法,却能输出Wolf[name=灰太狼,weight=32.3]?
classAnimal{publicStringgetDesc(){return"animal";}publicStringtoString(){returngetDes...
class Animal{
public String getDesc(){
return "animal";
}
public String toString(){
return getDesc();
}
}
public class wolf extends Animal{
private String name;
private double weight;
public wolf(String name,double weight){
this.name=name;
this.weight = weight;
}
public String getDesc(){
return "Wolf[name="+name+"weight = "+weight+"]";
}
}
public class test {
public static void main(String args[]){
System.out.println(new wolf("灰太狼",32.3));
}
} 展开
public String getDesc(){
return "animal";
}
public String toString(){
return getDesc();
}
}
public class wolf extends Animal{
private String name;
private double weight;
public wolf(String name,double weight){
this.name=name;
this.weight = weight;
}
public String getDesc(){
return "Wolf[name="+name+"weight = "+weight+"]";
}
}
public class test {
public static void main(String args[]){
System.out.println(new wolf("灰太狼",32.3));
}
} 展开
3个回答
展开全部
继承啊。animal里有toString(),调用了getDesc();
不明白的看这源代码。
System.out.println(new wolf("灰太狼",32.3));
看println(Object x)方法
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
再看 String.valueOf(x);方法
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
看obj.toString();调用了类的toString(),方法。
所有类的祖宗是Object。继承规定,不能缩小父类的方法。所以保证了任何类都有toString()方法。因为Object声明是public的。你即使覆盖,就像animal了覆盖了父类的toString()。但也只能用public声明,private方法不能继承下去。wolf的toString()就是从animal继承下来的。还有一个运行期动态绑定。这也是接口实现的关键。保证了调用的是本类的方法。而不是父类的。
所以你类不重写toString(),将继承Object的toString()方法,
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
就是打印出一串这种玩意的原因。
还有一个注意。如果把父类的getDesc()方法是private的。而wolf的getDesc()是public的,这不是方法覆盖。再输出将会是animal。子类没有覆盖父类的getDesc()。也无法覆盖。也无法调用自己的getDesc()方法。因为这方法可能没有。
不明白的看这源代码。
System.out.println(new wolf("灰太狼",32.3));
看println(Object x)方法
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
再看 String.valueOf(x);方法
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
看obj.toString();调用了类的toString(),方法。
所有类的祖宗是Object。继承规定,不能缩小父类的方法。所以保证了任何类都有toString()方法。因为Object声明是public的。你即使覆盖,就像animal了覆盖了父类的toString()。但也只能用public声明,private方法不能继承下去。wolf的toString()就是从animal继承下来的。还有一个运行期动态绑定。这也是接口实现的关键。保证了调用的是本类的方法。而不是父类的。
所以你类不重写toString(),将继承Object的toString()方法,
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
就是打印出一串这种玩意的原因。
还有一个注意。如果把父类的getDesc()方法是private的。而wolf的getDesc()是public的,这不是方法覆盖。再输出将会是animal。子类没有覆盖父类的getDesc()。也无法覆盖。也无法调用自己的getDesc()方法。因为这方法可能没有。
展开全部
我尽量说简单些吧,
System.out.println这个方法或调用对象的toString方法()
但是wolf本身并没有toString方法,所以会调用父类(也就是Animal)的toString方法
在Animal的toString方法里面又调用了getDesc方法
由于wolf重写过父类Animal的getDesc方法,所以会调用wolf自己的getDesc方法(多态)
最终指向的是return "Wolf[name="+name+"weight = "+weight+"]";这行代码,所以打印出来你说的情况
追问
谢谢。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你打印的是这个对象
不知道
不知道
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询