请我不了解多态性。
以本示例为例:
Object o = new String ("foo");
我做不到
o.substring (1,2)
有人可以向我解释这个问题吗?
答案 0 :(得分:1)
您将dynamic and static typing与polymorphism混淆了。
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
。所有String
是Object
s,但不是全部Object
是String
。)
这并不意味着您可以访问该子类型的方法的 any 。给定继承层次结构,Object
不了解其子级的任何特定方法,也不知道-无法将其后代的能力告知祖先类。由于Object
没有与之关联的substring
方法,因此您的代码正确地导致编译失败。
(而且应该假设Object
是 all 类的祖先。不能保证任何给定的Object
是String
。)< / 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
。