我在Bruce Eckel撰写的《 Java思维第四版》中进行以下练习:
练习16:(2)创建一个名为Amphibian的类。从此继承一个名为Frog的类。在基类中放置适当的方法。在main()中,创建Frog并将其向上转换为两栖动物,并演示所有方法仍然有效。Frog f = new Frog();
和Amphibian f = new Frog();
在以下方面有什么区别:
class Amphibian {
void go() { System.out.println("go"); }
void stop() { System.out.println("stop!"); }
}
class Frog extends Amphibian {
void go() { System.out.println("not go"); }
}
public class EFrog {
public static void main(String[] args) {
Frog f = new Frog();
f.go();
}
}
最佳答案
但是我不明白Frog f = new Frog();和Frog有什么区别?和两栖动物f = new Frog();
为了理解差异,让我们在Frog
中添加另一个不在Amphibian
中的方法
class Frog extends Amphibian {
void go() { System.out.println("not go"); }
void come() { System.out.println("come"); }
}
现在让我们看一下有什么区别:
public class EFrog {
public static void main(String[] args) {
Frog f = new Frog();
f.go();
f.come();
Amphibian a = f;
a.come();//this won't compile
}
}
底线。
Frog
是Amphibian
,因此Frog
可以执行Amphibian
可以执行的任何操作。 Amphibian
不是Frog
,所以Amphibian
不能做Frog
可以做的所有事情。当您说
Amphibian a = new Frog()
时,您是在编程一个接口(不是java接口,而是接口的一般含义)。当您说Frog f = new Frog()
时,您正在编程实现。现在来看书要求您尝试的实际问题:
在main()中,创建一个Frog,并将其上传到两栖动物并演示
所有方法仍然有效。
public class EFrog {
public static void main(String[] args) {
Frog f = new Frog();
Amphibian g = (Amphibian)f;//this is an upcast
g.go(); //okay since Amphibian can go
g.come();//not okay since Amphibian can't come
}
}
我不认为您要问的是upcasting的用途,但是既然标题已经由其他人编辑过,为什么不回答呢?上载在某些情况下很有用,例如明确调用重载方法的特殊形式。有关其他详细信息,请参见this答案。
关于java - 上载Java中的子类引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30914253/