[英]Polymorphism Object String
我没有理解多态性。
以这个例子为例:
Object o = new String ("foo");
我做不到
o.substring (1,2)
谁能向我解释这个问题?
首先,这不是多态性。
以简单的方式,在您的情况下o
object 只会调用 Object 类中定义的方法。 如果String
类覆盖了Object
类的任何方法,则 object o
将执行String
类的该方法,否则 Object o
将调用其自己的方法。
例如 :
substring()
方法仅在String
类中定义所以在这种情况下,您的代码将抛出异常,但是如果您调用equals()
、 hashcode()
、 toString()
方法(因为这些在Object
类中定义)然后在String
类中定义将被执行,因为String
类已经覆盖了这些方法。 如果来自对象 Class 的任何方法没有在其子类中被覆盖,则将执行 Object 类中的定义。
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
。
这是Liskov 替换原则的结果,它指出(总结):
如果 S 和 T 是对象,并且 T 是 S 的子类型,则可以在需要 S 的地方使用 T。
String
是Object
的子类型,因此如果您的赋值操作需要Object
,那么它会很乐意接受Object
或其任何子类型。
(注意: Object
不是String
。所有String
都是Object
,但并非所有Object
都是String
。)
这并不意味着您可以访问任何子类型的方法。 鉴于继承层次结构, Object
不知道其任何子项的特定方法,也不能 - 没有办法通知祖先类其后代的能力。 因为Object
没有与之关联的substring
方法,所以您的代码正确地导致编译失败。
(而且它应该,因为Object
是所有类的祖先。不能保证任何给定的Object
是String
。)
长期建议是不要使用过于不具体的对象类型(随着您在层次结构链上的上升,功能变得不那么具体——当您上升到Object
,您会失去功能)来完成特定于更具体类型的事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.