大家好,我在工作遇到这样的问题, 之前我有父类Home和子类SmallHome,子类SmallHome原本希望使用继承于父类的printHome方法,同时因为子类的field name不同于父类,所以希望printHome方法可以调用子类中重新定义的name,也就是让子类的对象调用printHome方法时,可以打印出"little sweet home"。
为了实现这一目标,第一版写成了如下代码,把父类中的printHome方法复制粘贴进了子类加以Override,以确保子类对象使用printHome方法时,使用的name来自于子类,而不是父类。我感觉这样写很不好,因为在我的实际工作中,printHome方法会很长,这样子做不太符合代码复用的风格。
package com.test;
public class Home {
protected String name = "sweet home";
public void printName() {
System.out.println(name());
}
}
package com.test;
public class SmallHome extends Home {
protected String name = "little sweet home";
@Override
public void printName() {
System.out.println(name);
}
}
在stackoverflow里请教后,代码可以做如下修改,也就是改用方法去定义printHome中所需要的那个值。
package com.test;
public class Home {
protected String name() { return "sweet home";}
public void printName() {
System.out.println(name());
}
}
package com.test;
public class SmallHome extends Home {
@Override
protected String name() { return "little sweet home";}
}
自此虽然问题有了这么个解决方法,但是我还是不大明白,在修改后的代码里,子类对象调用printHome方法时,调用的name()方法,为什么是子类中Override后的name()? 请了解的同学帮忙解释下,谢谢!
Polymorphism is for methods. It will find the method that should be called based on the type of the object at runtime. Fields will not be dead.
You have overridden the method of the parent class. I feel like there is nothing to explain.