2

我有 3 节课,其中一节是 the super class,另外两节是sub classes. 他们有print()共同的方法。从我调用print()方法时,main()我已经将对象向上转换为super classthen 是不是它必须调用方法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

我在这里错过了什么吗???

4

2 回答 2

1

这称为多态性。该方法采用相同的类型(none)、相同的返回类型(void)和相同的名称(print)。因此,当您调用 print 方法时,它会调用最专用的(继承树中最低的方法)。有一种东西叫做他们认为物体是什么以及它到底是什么。他们认为这是一棵树,但实际上是一棵榕树。如果你向上施放它,它不会做任何事情,因为 Trees 的数组使它认为它们是树,如果你把它施放到一棵树上,他们仍然认为它是一棵树。从技术上讲,您正在将其转换为完全相同的东西。很抱歉没有在我的回答中包含这个。当你创建一个新树时,继承结构看起来像这样。

Object (Cosmic Super-class)

 |

\ /

Tree

最专业的方法是树。但是,当您创建另一种类型的树时,比如 BanyanTree,结构看起来像这样。

Object

 |

\ /

Tree

 |

\ /

BanyanTree

最专业的打印方法来自于悦榕庄,所以它会执行它。对不起,如果你不明白,这是一个相当复杂的话题。

于 2019-08-14T17:22:23.937 回答
0

如果DerivedClassextendsBaseClass并且有一个具有相同名称和相同签名的方法,BaseClass则覆盖将发生在运行时多态性中。也不需要向上转换,因为您已经将数组初始化为BaseClass[ ]

于 2019-08-14T18:01:29.890 回答