2012-05-19 4 views
2

Так что я изучал абстрактный класс в Java, и когда я читал коды других людей, я увидел следующее:Java- Как использовать абстрактный класс

public abstract class Message implements Serializable, Comparable<Message> { 
    //stuff in this class 
} 

В другом классе в рамках того же проекта, программист заявил способ следующим образом:

public void notifyMessage(Message msg, HostType sourceType) { 
    //some stuff in this method 
} 

Уведомление в объявлении notifyMessage, переменная msg имеет тип «Сообщение». Я думал, что все абстрактные классы не могут быть созданы? Тогда что значит объявить «Message msg»? Может кто-нибудь объяснить, что это значит для меня? Заранее спасибо

+4

Слово, которое вы ищете, «полиморфизм». Правда, в этом случае нет конкретной реализации «Сообщения», поскольку она абстрактна. Но любой конкретный класс, который наследуется от «Message», может рассматриваться как «Сообщение». Поэтому метод 'notifyMessage' может принимать любые сообщения, которые реализуют этот абстрактный класс. Он не заботится о конкретных реализациях, он только хочет взаимодействовать с функциональностью, открытой в абстрактном классе, что было бы общим для всех реализаций. – David

ответ

6

Ну это означает, что вы можете получить какой-либо объект типа Message (дети), давайте его другим способом, если у вас есть

public class Letter extends Message ... 

вы можете отправить объект Письма в качестве аргумента notifyMessage

Нечто подобное могло быть возможно:

someObject.notifyMessage( new Letter() , ...) 

java.awt.Component является абстрактным JPanel наследует Container (акт ually JComponent первый) Контейнер имеет добавить (компонент с)

Это означает, что вы можете добавить любой компонент, как JButton, JLabel и т.д.

http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/Container.html#add(java.awt.Component) http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/Component.html

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

Message m = new Message() { 
     //if no abstract method, then this is empty 
    }; 
1

в основном, фактический класс msg «s является производным классом от типа сообщения, но его ссылочного типа является то, что сообщение т.е. это полиморфная. Это используется, если у вас есть несколько подклассов для сообщения, но неясно, какой из подклассов будет указан в методе. код для этого

Сообщение тзд = новый SubclassOfMessage()

Но это правда, что вы не можете иметь новый объект Message