Полиморфизм Объект Строка - PullRequest
0 голосов
/ 18 декабря 2018

пожалуйста, я не понял полиморфизм.

, взяв этот пример:

Object o = new String ("foo");

Я не могу сделать

o.substring (1,2)

кто-нибудь может объяснитьэта проблема для меня?

Ответы [ 4 ]

0 голосов
/ 19 декабря 2018

Это является следствием принципа замены Лискова , который гласит (суммировано):

Если S и T являются объектами, а T является подтипом из S, тогда T может использоваться там, где ожидается S.

String - это подтип Object, поэтому, если ваша операция присваивания ожидает Object, тогда он с радостью примет Object или любой из его подтипов.

(Примечание: Object не является String. Все String s Objectс, но не все Object с String с.)

Это не означает, что вы получаете доступ к любому методов подтипа.Учитывая иерархию наследования, Object не имеет ни малейшего понятия о каком-либо из специфических методов своих детей, равно как и не может - нет никакого способа сообщить классу предка о возможностях его потомка.Поскольку Object не имеет никакого метода substring, связанного с ним, ваш код правильно приводит к ошибке компиляции.

(И это следует делать, учитывая, что Object является предком all классы. Нет никакой гарантии, что любой данный Object является String.)

Постоянный совет - не использовать чрезмерно неспецифический тип объекта (по мере продвижения по иерархической цепочке).возможности становятся менее специфичными - вы теряете функциональность при переходе на Object) для достижения чего-то определенного для более конкретного типа.

0 голосов
/ 19 декабря 2018

Во-первых, это не полиморфизм.

Проще говоря, в вашем случае o объект будет вызывать только те методы, которые определены в классе Object.Если класс String переопределил какой-либо метод класса Object, тогда объект o выполнит этот метод класса String, в противном случае Object o вызовет свой собственный метод.

Например:

substring() метод определен только в String классе. Итак, в этом случае ваш код будет выдавать исключение, однако если вы вызовете equals(), hashcode(), toString() методов (поскольку они определены в Object классе), тогда определение внутри String класса будет выполнено, потому что String Class переопределил эти методы.И если ни один из методов из объекта Class не был переопределен в его дочернем классе, то определение внутри класса Object будет выполнено.

0 голосов
/ 19 декабря 2018

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 's методы, такие как toString.Однако Object не наследуется от String, поэтому Object не может вызывать методы String, такие как substring.

0 голосов
/ 18 декабря 2018

Вы путаете динамическую и статическую типизацию с полиморфизмом .

Java является языком статической типизации, поэтому компилятор распознает, что Object не имеетsubstring() метод и выдает ошибку.Полиморфизм происходит после компиляции, когда код фактически выполняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...