我有3个班级,其中一个是super class
,另外两个是sub classes
。它们具有常见的print()
方法。从print()
调用main()
方法时,我已将对象上载到super class
,这不是因为它必须调用super class
而不是subclasses
的方法。我在这里有点困惑。这怎么可能?在Java中是否有任何此类行为的原因。
这是我的代码
class Tree {
public void print() {
System.out.println("I am Tree");
}
public static void main(String []args) {
Tree t[] = new Tree[3];
t[0] = new Tree();
t[1] = new BanyanTree();
t[2] = new PeepalTree();
for(int i = 0; i < 3; i++) {
((Tree)t[i]).print();
}
}
}
public class BanyanTree extends Tree{
public void print() {
System.out.println("I am BanyanTree");
}
}
public class PeepalTree extends Tree{
public void print() {
System.out.println("I am PeepalTree");
}
}
程序的输出是
I am Tree
I am BanyanTree
I am PeepalTree
根据我的输出应该是
I am Tree
I am Tree
I am Tree
我在这里错过了什么吗?
答案 0 :(得分:1)
这称为多态。该方法采用相同的类型(无),相同的返回类型(无效)和相同的名称(打印)。因此,当您调用print方法时,它会调用最专门的方法(在继承树中最低的方法)。有一种东西叫做他们认为的物体是什么,实际上是什么。他们认为这是一棵树,但实际上是一棵榕树。如果将其转换为树,则它不会执行任何操作,因为树木的排列使它们认为它们是树;如果将其转换为树,则它们仍认为它是一棵树。从技术上讲,您要将其投射到完全相同的事物上。很抱歉没有在我的回答中包含此内容。当您创建新树时,继承结构如下所示。
Object (Cosmic Super-class)
|
\ /
Tree
最专业的方法是树。但是,当您创建另一种类型的树时,例如BanyanTree,其结构如下所示。
Object
|
\ /
Tree
|
\ /
BanyanTree
最专业的打印方法来自BanyanTree,因此可以执行该方法。抱歉,如果您听不懂,这是一个非常复杂的话题。
答案 1 :(得分:0)
如果DerivedClass
扩展了BaseClass
,并且具有一个名称和签名相同的方法BaseClass
,则覆盖将在运行时多态时发生。
另外,由于您已经将数组初始化为BaseClass[ ]