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多态如何调用子类对象的超类方法的主要内容,如果未能解决你的问题,请参考以下文章