我是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();
}
答案 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 表示特定方法未使用。