簡體   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