Но я не понимаю. В чем разница между Frog f = new Frog(); и амфибия f = новая лягушка();
Чтобы понять разницу, давайте добавим еще один метод в Frog
, что не в Amphibian
class Frog extends Amphibian {
void go() { System.out.println("not go"); }
void come() { System.out.println("come"); }
}
Теперь давайте посмотрим на то, что разница:
public class EFrog {
public static void main(String[] args) {
Frog f = new Frog();
f.go();
f.come();
Amphibian a = f;
a.come();//this won't compile
}
}
Нижняя линия. Frog
- Amphibian
, так что Frog
может делать все, что угодно Amphibian
может. Amphibian
не является Frog
, так что Amphibian
не может делать все Frog
может.
Когда вы говорите Amphibian a = new Frog()
, вы программируете интерфейс (а не интерфейс java, но общий смысл интерфейса). Когда вы говорите Frog f = new Frog()
, вы программируете реализацию.
Сейчас подходит к актуальному вопросу о том, что книга просит вас попробовать:
В основных(), создайте Frog и базовый тип его Амфибию и продемонстрировать , что все методы по-прежнему работать.
public class EFrog {
public static void main(String[] args) {
Frog f = new Frog();
Amphibian g = (Amphibian)f;//this is an upcast
g.go(); //okay since Amphibian can go
g.come();//not okay since Amphibian can't come
}
}
Я не думаю, что вы хотели спросить Что толку но приведение к базовому типу, так как название уже отредактирован кем-то еще, то почему бы не ответить на этот вопрос, а? Ускорение полезно в определенных ситуациях, таких как вызов специализированных форм перегруженных методов явно. См. this ответ за дополнительную информацию.