Java 简单介绍一下多态性

Java 简单介绍一下多态性,java,polymorphism,Java,Polymorphism,假设类ClassOne从ClassTwo扩展而来,ClassOne是子类,ClassTwo是超类。如果我转到另一个类并键入:ClassTwo hello=newclassone()这是否意味着我只能使用继承自class2的ClassOne中的方法,而不能使用最初在ClassOne中的方法?(例如,名为void eat();的方法在ClassTwo和ClassOne中继承了它,但是void walk();方法只在ClassOne中,而不在ClassTwo中,因此通过使用hello关键字,我可以访问

假设类
ClassOne
ClassTwo
扩展而来,
ClassOne
是子类,
ClassTwo
是超类。如果我转到另一个类并键入:
ClassTwo hello=newclassone()
这是否意味着我只能使用继承自
class2
ClassOne
中的方法,而不能使用最初在
ClassOne
中的方法?(例如,名为
void eat();
的方法在
ClassTwo
ClassOne
中继承了它,但是
void walk();
方法只在
ClassOne
中,而不在
ClassTwo
中,因此通过使用
hello
关键字,我可以访问eat函数而不是walk函数吗?),我不太理解多态性的概念。有人能举个例子简单地解释一下吗?非常感谢。

是的,就可用方法而言,系统将把
classOne
视为
classTwo
。 我喜欢将这些概念视为bucket,在本例中,
classOne
适合于
classTwo
bucket。如果我把
classOne
放在
classTwo
桶中,我只能看到
classTwo
桶。然而,我可以从
class2
桶中选择
classOne
,也就是说,我可以铸造它

这也有助于向上和向下转换,即将对象转换为超类型或子类型。你要么把物品放在篮子里(上抛),要么把它从篮子里拿出来(下抛)

这个类比可能是废话,但它对我有帮助:)

要回答您的问题“是”,您不能对
classOne
中的方法进行方法调用,如果该方法被强制转换为
classTwo

这是方便的,而且是最好的。想想
接口
,基本上是一个接口告诉您的对象提供一组方法。通过这种方式,我们可以确保每个调用该对象的人都可以使用这些方法,即该对象与其周围环境的契约


还有一个可能的重复:

这个问题描述得非常清楚,你也可以很容易地编写和测试自己

类的对象与该类中的方法或字段的关系是“has a”

子类型与超类型的关系为“是”

ClassTwo hello=newclassone()中
,声明的
hello
类型是
ClassTwo
。右侧表达式使用类型
ClassOne
计算,但随后被转换为类型
ClassTwo
。ClassTwo没有
walk()


classtwo确实有一个
eat()
,classone也是。当您还在ClassOne中声明
void eat()
时(使用与其超类相同的方法签名),神奇的事情就发生了。像这样重写方法允许在类吃东西时发生不同或额外的行为。。。到目前为止,我已经放弃了一些条款,你可以继续为自己寻找。现在我要说的是,“吃”这个词在这里的用法是多态的。但这只是一个小例子。我无法封装任何如此抽象但功能强大的概念。

在描述模拟类时,可能会重复,请从最一般的概念中编号/命名,例如
B扩展A
;它是跨多种语言的相当标准的。往另一个方向(
ClassOne扩展ClassTwo
)没有多大意义,因为
ClassTwo
必须在概念上存在,才能扩展它。这个问题与-你可能会在那里找到一些有用的信息密切相关。