关于extend的用法我有一个问题我不太明白。对于这个例子,我将使用两个类:
public class Father {
protected String message="Father";
public void printme(){
System.out.println(this.message);
}
}
和
public final class Son extends Father {
protected String message="Son";
}
我的问题是,为什么如果我调用:
new Son().printme();
打印"父亲"?如何解决只更改"Son"类的问题?
Thanks in advance
选项:
- 覆盖
printme
方法 - 而不是在
Son
声明一个新的字段,改变Father
字段的值(从Son
,你可以这样做,因为它是受保护的-呃)
字段不是多态的。Father
中引用message
字段的代码将始终引用Father
中声明的变量。
我强烈建议:
- 你总是把字段设为私有,所以在这种情况下,你也想在
Father
中提供一个公共getter和一个protected setter。 - 你不像这样阴影字段,部分原因是没有经验的开发人员会错误地认为有某种重写正在进行
也覆盖printme()并将其定义为。
@Override public void printme(){
System.out.println(message);
}
。
只需更改son
的类别即可解决:(注:Father
不能为final
,因此更改)
public class Father {
protected String message="Father";
public void printme(){
System.out.println(this.message);
}
}
final class Son extends Father {
protected String message="Son";
public void printme(){
System.out.println(this.message);
}}
如果可以更改父类,另一个选项是将父类中的字段更改为方法:
public class Father {
protected String message() { return "Father"; }
public void printme(){
System.out.println(this.message());
}
}
public final class Son extends Father {
@Override
protected String message() { return "Son"; }
}
方法(不像字段)是多态的,所以这是你想要的。