作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 3 个类,其中一个是 父类(super class)
,另外两个是 子类
。他们有共同的 print()
方法。在从 main()
调用 print()
方法时,我已经将对象向上转换为 super class
那么是不是它必须调用 的方法code>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
我是不是漏掉了什么???
最佳答案
这称为多态性。该方法采用相同的类型 (none)、相同的返回类型 (void) 和相同的名称 (print)。因此,当您调用 print 方法时,它会调用最专门的方法(继承树中最低的方法)。有一种东西叫他们认为对象是什么,它到底是什么。他们认为这是一棵树,但实际上是一棵榕树。如果你向上投它,它不会做任何事情,因为树的阵列使他们认为它们是树,如果你向上投它到一棵树,他们仍然认为它是一棵树。从技术上讲,您将其转换为完全相同的东西。抱歉没有在我的回答中包含这个。当你创建一个新的 Tree 时,继承结构看起来像这样。
Object (Cosmic Super-class)
|
\ /
Tree
最专业的方法是树。但是,当您创建另一种类型的树时,比如说 BanyanTree,其结构如下所示。
Object
|
\ /
Tree
|
\ /
BanyanTree
最专业的 print 方法来自 BanyanTree,因此它会执行该方法。对不起,如果你不明白,这是一个非常复杂的话题。
关于java - 向上转换实际上如何在 Java 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57499266/
我是一名优秀的程序员,十分优秀!