Java Polymorphism如何为子类对象调用超类方法

时间:2013-02-16 05:51:11

标签: java methods polymorphism subclass

这是我想要问的一个例子

超类Name.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;
  }

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

我的问题是有没有办法调用Name类中的initials方法,以便我的输出只是B.S.

3 个答案:

答案 0 :(得分:14)

没有。一旦你覆盖了一个方法,那么从外部对该方法的任何调用都将被路由到你被覆盖的方法(当然,如果它再次在继承链中再次被覆盖)。 你只能从你自己的重写方法中调用super方法,如下所示:

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 
}

答案 1 :(得分:5)

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

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

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

    public String basicInitials() {
        return super.initials();
    }
}

答案 2 :(得分:1)

我会在超类中单独保留首字母,并引入一个返回完整首字母的新方法。因此,在您的代码中,我只需将ThreeNames中的initials方法重命名为其他内容。这样,您的姓名缩写方法在名称

的实现中是相同的