2013-02-16 98 views
7

这里是什么,我想问问的Java多态性如何调用父类方法的子类对象

超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; 
    } 

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

我的问题是有没有办法来调用的缩写方法是在名称类,使我的输出就是B.S.

+0

非常感谢您的答案! – 2013-02-16 06:00:34

+0

[使用子类对象访问超类函数](http://stackoverflow.com/questions/2432249/accessing-super-class-function-using-subclass-object) – 2015-01-20 23:16:27

回答

11

no。一旦你重写了一个方法,那么从外部调用该方法将被路由到你重写的方法(当然,如果它继续沿着继承链进一步重写)。 你只能从自己的覆盖方法中调用超级方法,像这样:

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

但那不是什么youre这里寻找。 也许你可以把你的方法为:

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 
} 
+0

这很有道理,就像一个方法可能是在子类中使用,他们为什么要重写?只需将该块放在另一个方法中,并在将要被覆盖的父方法中调用该方法。 – 2017-01-20 09:34:23

5

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

另一种方法是向ThreeNames添加方法,该方法委托给Names#initials()

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

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

我反而独自离开缩写在超和介绍,将返回完整的新方法缩写。因此,在您的代码中,我只需将ThreeNames中的首字母缩写方法重命名为其他名称即可。这样,你的姓名首字母缩写的方法是相同的名称