Java: вызов метода подкласса из переменной суперкласса - PullRequest
0 голосов
/ 10 мая 2018

(ранее заданный вопрос здесь . Я не совсем получил нужный ответ.)

Цитата из книги:

Что если вы хотите вызвать метод, определенный подклассом объекта на что ссылается переменная суперкласса? Предположим, что класс SoftBall имеет метод по имени riseBall, который не определен классом Ball. Как ты можешь вызывать его из переменной Ball? Один из способов сделать это - создать переменную класс, а затем использовать оператор присваивания для приведения объекта:

Ball b = new SoftBall();
SoftBall s = (SoftBall)b;
// cast the Ball to a
// SoftBall
s.riseBall();

В приведенном выше фрагменте кода показан новый объект Softball , созданный и назначенный в качестве ссылки на переменную b , что полностью допустимо, поскольку класс Softball является подклассом класса Ball . Тем не менее, в кавычке (косвенно) говорится, что вам нужно привести переменную к типу Softball , прежде чем вы сможете использовать переменную для вызова методов из класса Softball . Это почему? Почему я не могу напрямую использовать переменную b типа Ball (которая содержит ссылку на объект Softball) для вызова нужного метода? Переменная b уже имеет объект.

(Примечание: я уже прочитал этот пост.)

Ответы [ 4 ]

0 голосов
/ 10 мая 2018

Как мы знаем java это statically typed language.

Это особенность статически типизированных языков , где переменным назначается тип заранее и проверяется на compile-time, чтобы убедиться, что типы совпадают.

Если этот код был выполнен на динамически типизированном языке , где типы проверяются во время выполнения, то можно разрешить что-то вроде следующего:

Ball b = new SoftBall();
if (b instanceof SoftBall){
  b.riseBall();
}

b.riseBall() гарантированно выполняется только тогда, когда экземпляр является SoftBall, поэтому вызов riseBall всегда будет работать.

Однако Java является языком статической типизации, поэтому этот тип кода не допускается.

0 голосов
/ 10 мая 2018

Поскольку доступные методы зависят от объявленного типа переменной.

Ball b = new SoftBall();

b на самом деле SoftBall, но вы «скрываете» его, потому что вы объявили его как тип Ball. Поскольку у типа Ball нет метода riseBall, вы не можете получить к нему доступ, задав b.

0 голосов
/ 10 мая 2018
Ball b = new SoftBall();

Это просто означает, что переменная b имеет тип Ball, но если методы, присутствующие в классе Ball, переопределены в расширенном классе SoftBall, то, используя переменную 'b', мы будем вызывать определение метода класса 'SoftBall », а не« Ball ».Теперь, хотя переменная b относится к реализации класса «SoftBall», она по-прежнему относится к классу типов «Ball», а класс Ball не имеет какого-либо метода riseBall

Надеюсь, что имеет смысл.

0 голосов
/ 10 мая 2018

Java - статически типизированный язык.

Это означает, что компилятор проверяет, есть ли у типа переменной метод, который вы пытаетесь вызвать.

Тип вашей переменной b равен Ball. Ball не имеет riseBall метода.

Это означает, что ваш код потерпит крах, если только b во время выполнения не содержит Softball (что компилятор не может гарантировать). Возможно, вы знаете, что это так, но вам также нужно убедить компилятор (т.е. дать вашим переменным необходимые типы).

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