如何忽略/绕过重写方法?

时间:2013-11-28 09:49:56

标签: java polymorphism method-overriding

我是Java的新手,想知道如何完成以下任务,并且,即使有可能,它是否被视为不良风格。谢谢。

Fish f;  // Fish is a superclass,
Tuna t = new Tuna();  // to which Tuna is a subclass.

f=t;  // the Fish object "f" now refers to the Tuna object "t".

// Both Fish and Tuna have an identical method (signature wise) called swim() ,
f.swim();  // and so Tuna's overridden swim() method is invoked here.

但我现在可以使用相同的“f.swim()”语法调用Fish的swim()方法吗?

// I would now like Fish's swim() method to be invoked here,
// but is it bad style and/or am I missing some point about OOP?
f.swim();

修改

回复:回答,谢谢大家!关于SO用户Rinke的答案如下 - 他说“你可以将金枪鱼实例分配给金枪鱼和鱼类变量,但它总是金枪鱼。”

那句话的最后一部分让我的新手OOD大脑想知道 - 为什么允许“超级对象”引用“子对象”呢?这种灵活性有什么好处?允许Fish对象能够“切换”指鱼或金枪鱼有什么好处?谢谢。

编辑2:

以下是一些示例代码,用于说明SO用户Rinke的“编辑回答”响应的概念,如下所示。

Bear b = new Bear();
Fish f = getAnyFish();
b.eat(f);

Fish getAnyFish(){
    //To toggle the returned fish type, change true to false
    if (true) return new Tuna();
    else return new Salmon();
}

5 个答案:

答案 0 :(得分:2)

简短的回答是“不”。这里的混淆来自运行时类型和声明类型之间的区别。您可以将金枪鱼实例分配给金枪鱼和鱼类变量,但它始终是金枪鱼。因此,如果你在该物体上调用游泳方法,金枪鱼将像金枪鱼一样游泳(即被称为被覆盖的方法)。

请注意,可以通过调用super.swim()从子类中调用超类的swim方法。

当然,如果你不重写游泳方法,那么金枪鱼只是从鱼继承这个方法。在这种情况下,鱼码将在金枪鱼实例上运行。

回答编辑:

您并不总是控制您使用的代码。也许您需要将金枪鱼提供给其他接受鱼类的API。

从相反的角度来看:也许你正在实施一只熊。熊吃鱼。你不想在乎它是金枪鱼还是鲑鱼。所以你得到void eat(Fish f),其中大自然(由你控制之外的一段代码实现)为你的熊提供鱼。

留下有趣的鱼类示例:看Collections.sort()。您可以对任何列表进行排序如果它是ArrayList或LinkedList则无关紧要。

答案 1 :(得分:1)

如果被覆盖,则无法绕过Tuna.java的{​​{1}}方法。 但是你可以做的是,在swim()中,在swim()内,你可以调用超类'方法。

<强> Tuna.java

Tuna.java

另一个选项是,以这种方式更改@Override public void swim() { super.swim(); // This will call Fish.java's swim() method. // rest of the code } swim()方法的签名,使其成为Tuna.java的{​​{1}}的重载版本,但是不是被覆盖的。

答案 2 :(得分:1)

  

我现在可以使用相同的方法调用Fish的swim()方法   “f.swim()”语法?

不,你不能。

答案 3 :(得分:0)

如果您真的想要获取父类的swim方法,可以使用不同的方法。 我将接口定义为Swimmable

public interface Swimmable {
    public void swim();
}

然后我让Fish实现这个界面

public class Fish implements Swimmable {

@Override
public void swim() {
    System.out.println("Fish");
    }
}

我的金枪鱼课

public class Tuna extends Fish {
//Anything I want the Tuna to have extra 
}

现在使用相同的代码

Fish f;
Tuna t = new Tuna();
f=t;
f.swim(); //This will call the Fish's method

答案 4 :(得分:0)

虽然不可能。 我使用@Deprecated 表示特定方法未使用。