这是我想要问的一个例子
超类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.
答案 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方法重命名为其他内容。这样,您的姓名缩写方法在名称
的实现中是相同的