上投在Java中实际如何工作

时间:2019-08-14 17:15:50

标签: java polymorphism upcasting run-time-polymorphism

我有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

我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:1)

这称为多态。该方法采用相同的类型(无),相同的返回类型(无效)和相同的名称(打印)。因此,当您调用print方法时,它会调用最专门的方法(在继承树中最低的方法)。有一种东西叫做他们认为的物体是什么,实际上是什么。他们认为这是一棵树,但实际上是一棵榕树。如果将其转换为树,则它不会执行任何操作,因为树木的排列使它们认为它们是树;如果将其转换为树,则它们仍认为它是一棵树。从技术上讲,您要将其投射到完全相同的事物上。很抱歉没有在我的回答中包含此内容。当您创建新树时,继承结构如下所示。

Object (Cosmic Super-class)

 |

\ /

Tree

最专业的方法是树。但是,当您创建另一种类型的树时,例如BanyanTree,其结构如下所示。

Object

 |

\ /

Tree

 |

\ /

BanyanTree

最专业的打印方法来自BanyanTree,因此可以执行该方法。抱歉,如果您听不懂,这是一个非常复杂的话题。

答案 1 :(得分:0)

如果DerivedClass扩展了BaseClass,并且具有一个名称和签名相同的方法BaseClass,则覆盖将在运行时多态时发生。 另外,由于您已经将数组初始化为BaseClass[ ]

,因此也无需进行转换