12

这是我要问的一个例子

超类名称.java

public class Name{
  protected String first;
  protected String last;

      public Name(String firstName, String lastName){
         this.first = firstName;
         this.last = lastName;
      }

       public String initials(){
         String theInitials = 
            first.substring(0, 1) + ". " +
            last.substring(0, 1) + ".";
         return theInitials;
      } 

然后子类是 ThreeNames.java

public class ThreeNames extends Name{
  private String middle;

   public ThreeNames(String aFirst, String aMiddle, String aLast){
     super(aFirst, aLast);
     this.middle = aMiddle;
  }

   public String initials(){
     String theInitials = 
        super.first.substring(0, 1) + ". " +
        middle.substring(0, 1) + ". " +
        super.last.substring(0, 1) + ".";
     return theInitials;
  }

所以如果我创建一个 Threename 对象ThreeNames example1 = new ThreeNames("Bobby", "Sue" "Smith") 然后调用System.out.println(example1.initials());我会得到B.S.S. 我得到的。

我的问题是有没有办法调用 Name 类中的 initials 方法,这样我的输出就是B.S.

4

3 回答 3

17

不。一旦您覆盖了一个方法,那么从外部对该方法的任何调用都将被路由到您覆盖的方法(当然,除非它在继承链的下游再次被覆盖)。您只能从您自己的重写方法内部调用超级方法,如下所示:

public String someMethod() {
   String superResult = super.someMethod(); 
   // go on from here
}

但这不是您要在这里寻找的。你也许可以把你的方法变成:

public List<String> getNameAbbreviations() {
   //return a list with a single element 
}

然后在子类中这样做:

public List<String> getNameAbbreviations() {
   List fromSuper = super.getNameAbbreviations();
   //add the 3 letter variant and return the list 
}
于 2013-02-16T05:54:41.137 回答
6

有很多方法可以做到这一点。一种方法:不要覆盖Names#initials().ThreeNames

另一种方法是添加一个ThreeNames委托给Names#initials().

public class ThreeNames extends Name {
    // snip...

    public String basicInitials() {
        return super.initials();
    }
}
于 2013-02-16T05:53:56.490 回答
2

相反,我会将首字母单独留在超类中,并引入一个新方法来返回完整的首字母。因此,在您的代码中,我只需将 ThreeNames 中的 initials 方法重命名为其他名称。这样,您的姓名首字母方法在 Name 的实现中是相同的

于 2013-02-16T06:01:41.543 回答