多态对象字符串

时间:2018-12-18 20:42:08

标签: java polymorphism

请我不了解多态性。

以本示例为例:

Object o = new String ("foo");

我做不到

o.substring (1,2)

有人可以向我解释这个问题吗?

4 个答案:

答案 0 :(得分:1)

您将dynamic and static typingpolymorphism混淆了。

Java是一种静态类型的语言,因此编译器会认识到Object没有substring()方法,并会引发错误。多态性是在编译后实际执行代码时发生的。

答案 1 :(得分:1)

第一件事不是多态性。

以简单的方式,在您的情况下,o对象将仅调用在Object类中定义的方法。如果String类已覆盖Object类的任何方法,则对象o将执行String类的该方法,否则对象o将调用其自己的方法。

例如:

substring()方法仅在String类中定义,因此在这种情况下,您的代码将引发异常,但是,如果您调用equals()hashcode()toString()方法(因为它们是在Object类中定义的),则String类中的定义将被执行,因为String类已覆盖了这些方法。如果对象类中的任何方法尚未在其子类中覆盖,则将执行对象类中的定义。

答案 2 :(得分:1)

这是Liskov Substitution Principle的结果,该状态指出(摘要):

  

如果S和T是对象,并且T是S的子类型,则可以在期望S的地方使用T。

String Object的子类型,因此,如果您的赋值操作期望Object,那么它将很乐意接受Object或任何其他的子类型。

(注意:Object 不是 String。所有StringObject s,但不是全部ObjectString。)

这并不意味着您可以访问该子类型的方法的 any 。给定继承层次结构,Object不了解其子级的任何特定方法,也不知道-无法将其后代的能力告知祖先类。由于Object没有与之关联的substring方法,因此您的代码正确地导致编译失败。

(而且应该假设Object all 类的祖先。不能保证任何给定的ObjectString。)< / p>

长期建议是不要使用过多的 inspecific 对象类型(当您沿层次结构链向上移动时,功能变得不那么具体-向上Object时您将失去功能)来完成针对特定类型的特定操作。

答案 3 :(得分:0)

substring来自String类,而不是Object类。因此,以下代码将起作用:

String o = new String ("foo");
o.substring(1,2);

此代码无效:

Object o = new String ("foo");
o.substring(1,2);

由于String继承自Object,因此String可以调用Object的方法,例如toString。但是,Object并不继承自String,因此Object无法调用String的方法,例如substring