在Java中重新定义引用(扩展用法)



关于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"; }
}

方法(不像字段)是多态的,所以这是你想要的。

最新更新