繁体   English   中英

多态对象字符串

[英]Polymorphism Object String

我没有理解多态性。

以这个例子为例:

Object o = new String ("foo");

我做不到

o.substring (1,2)

谁能向我解释这个问题?

您将动态和静态类型多态混淆了。

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

首先,这不是多态性。

以简单的方式,在您的情况下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。

StringObject子类型,因此如果您的赋值操作需要Object ,那么它会很乐意接受Object或其任何子类型。

(注意: Object不是String 。所有String都是Object ,但并非所有Object都是String 。)

这并不意味着您可以访问任何子类型的方法。 鉴于继承层次结构, Object不知道其任何子项的特定方法,也不能 - 没有办法通知祖先类其后代的能力。 因为Object没有与之关联的substring方法,所以您的代码正确地导致编译失败。

(而且它应该,因为Object所有类的祖先。不能保证任何给定的ObjectString 。)

长期建议是不要使用过于不具体的对象类型(随着您在层次结构链上的上升,功能变得不那么具体——当您上升到Object ,您会失去功能)来完成特定于更具体类型的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM