2010-12-15 3 views
4
class Base { 

    public void add() { 
     System.out.println("Base ADD"); 
    } 

    void subtract() { 
     throw new UnsupportedOperationException("Not yet implemented"); 
    } 

} 

class Child extends Base { 

    public void add(){ 
     System.out.println("Child ADD"); 
    } 

    public void subtract() { 
     System.out.println("Child Subtract"); 
    } 

} 

class MainClass { 

    public static void main(String args[]) { 

     Base b1 = new Base(); 
     Base b2 = new Child(); 

     Child b3 = new Child(); 

     b1.add(); 

     b2.subtract(); 

     b2.add(); 
     b3.subtract(); 

    } 

} 

Я немного смущен вышеуказанным кодом. Линия наиболее запутанная меня этоЧто такое Base b2 = new Child(); означает?

Base b2 = new Child(); 

и

b2.subtract(); 

То, что я понимаю, во время компиляции компилятор проверяет погоду Base класса имеет subtract() метод или нет, то во время выполнения во время выполнения полиморфизма происходит как объект типа Child.

Вопрос заключается в том, как и где мы можем использовать эту линию т.е. Base b2 = new Child();

В каком сценарии мы должны использовать это? Пожалуйста, помогите, было бы здорово!

+0

В принципе вы можете использовать его, когда нужен объект типа `Base` с поведением` Child`. – khachik 2010-12-15 08:17:56

ответ

9

Посмотрите на две части заявления:

Base b2 

что объявляет переменную под названием b2 типа Base. Вы можете назначить ссылку на эту переменную, если ссылка является нулевой или относится к экземпляру Base или подклассу Base.

Тогда

new Child() 

создает новый экземпляр Child. Child является подклассом Base, поэтому вы можете назначить ссылку, возвращаемую конструктором, переменной b2.

Теперь вы можете только «видеть» членов Base через b2, хотя фактическое значение относится к экземпляру Child во время выполнения. Но любые методы из Base которые были переопределены в Child будут использовать изменённые версии, когда они называются ... так что, когда вы звоните

b2.subtract(); 

виртуальная машина выясняет фактического типа объекта, b2 ссылается и использует реализацию этого класса subtract - в этом случае метод, который печатает «Child Subtract».

EDIT: Вы специально спросили, где вы можете использовать такие вещи, и как это помогает ...

Вы можете использовать его в любое время вы хотите объявить переменную более общего типа (а суперкласс или интерфейс), но присваивать ему значение, которое является подклассом или реализацией интерфейса. В качестве другого примера:

List<String> strings = new ArrayList<String>(); 

Основное преимущество объявления переменной в общем виде является то, что вы сохраняя гибкость - в дальнейшем вы могли бы изменить с помощью ArrayList<T> в какой-либо другой реализации List<T>, а код должен еще Работа. Вы в основном говорите: «Мне нужны только члены и гарантии, предоставляемые List<T> - факт, что я использую ArrayList<T>, несколько случайный».

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

1
Base b2 = new Child(); 

Вы можете использовать ссылку Супер для объекта ребенка.

для b2.method();

во время компиляции у вас должен быть метод(); в BaseClass.

Во время выполнения метода объекта будет получить вызывается так здесь объект Ребенок от Base b2 = new Child();

Так method() версия ребенка будут выполнены.

Использование:

Полиморфизм является чрезвычайно полезным при проектировании систем корпоративного уровня, как вы можете создать и определить несколько уровней интерфейсов, которые позволяют внешние стороны или за пределами программное обеспечение для взаимодействия с системой определенным образом , Мы все знаем, насколько полезно в системной интеграции иметь опубликованный API, но если внутренние изменения в системе становятся необходимыми, API, возможно, придется переиздавать, и интегрированные системы, возможно, придется переработать. Чтобы этого избежать, при проектировании следует уделять особое внимание API-интерфейсам объектов, а также общим API-интерфейсам системы. Один из способов гарантировать, что надежная система может иметь дело с объектами, которые имеют более сложные методологии, чем изначально предполагалось, - иметь полиморфизм API объекта. Таким образом, система знает «лицо» передаваемого ему объекта, но не должна знать об изменениях.

Также см

+1

life.java Да, я согласен с приведенным выше объяснением. Но я хотел бы, чтобы использовать эту Линию. В каком сценарии это может быть использовано. Как это поможет? – 2010-12-15 08:18:33

+1

@Sam, он сделает абстрактную структуру вашего дизайна OO, в дальнейшем вы получите шанс во время выполнения, какая версия метода для exetcute – 2010-12-15 08:20:11

Смежные вопросы