2012-05-19 47 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”。我认为所有的抽象类都不能被实例化?那么声明“Message msg”是什么意思?有人能解释这对我意味着什么吗?在此先感谢

+4

你要找的字是“多态性”。没错,在这种情况下没有具体的'Message'实现,因为它是抽象的。但是任何从'Message'继承的具体类都可以看作是'Message'。所以'notifyMessage'方法可以接受任何类型的实现该抽象类的消息。它并不关心具体的实现,它只想与抽象类中公开的功能进行交互,这对于所有实现都是通用的。 – David

回答

6

那么这意味着你可以接收类型信息(孩子)的任何对象,让我们把它放在其他的方式,如果你有

public class Letter extends Message ... 

可以寄信对象作为参数在notifyMessage

像这样的东西可能是可能的:

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

java.awt.Component中是抽象的 的JPanel继承集装箱(行为ually的JComponent第一) 集装箱有加(C成分)

这意味着,你可以添加任何成分像一个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的实际类是一个派生类消息的类型,但它的引用类型是消息即它是多态的。如果您有多个子类用于消息,则使用此方法,但不确定将在该方法中引用哪个子类。这个代码是

信息MSG =新SubclassOfMessage()

但它是真实的,你不能有一个新的消息对象