Java多态如何调用子类对象的超类方法

Posted

技术标签:

【中文标题】Java多态如何调用子类对象的超类方法【英文标题】:Java Polymorphism How to call to super class method for subclass object 【发布时间】:2013-02-16 05:51:10 【问题描述】:

这是我想问的一个例子

超类名称.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.

【问题讨论】:

非常感谢您的回答! Accessing super class function using subclass object 的可能重复项 【参考方案1】:

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

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 

【讨论】:

这是有道理的,好像一个方法可以在子类中使用,他们为什么要覆盖?只需将该块放在另一个方法中,然后在将被覆盖的父方法中调用该方法。【参考方案2】:

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

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

public class ThreeNames extends Name 
    // snip...

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于Java多态如何调用子类对象的超类方法的主要内容,如果未能解决你的问题,请参考以下文章

给定一个指向对象的超类指针,如何获取对象的大小?

是否可以在超类对象上调用子类的方法?

使用“this”调用超类方法的子类

java多态加深

如何从别处调用 Objective-C 对象的超类的方法?

马凯军201771010116《面向对象程序设计(java)》第七周学习总结