2

所以我在学习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

2 回答 2

6

那么这意味着你可以接收任何类型的消息(子)对象,让我们换一种方式,如果你有

public class Letter extends Message ...

您可以发送一个 Letter 对象作为 notifyMessage 的参数

这样的事情是可能的:

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

java.awt.Component 是抽象 JPanel 继承 Container(实际上是 JComponent 先) Container 有 add(Component 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
    };
于 2012-05-19T23:40:29.973 回答
1

基本上,msg的实际类是 Message 类型的派生类,但它的引用类型是 message 的,即它是多态的。如果您有多个消息子类,但不确定方法中将引用哪个子类,则使用此选项。代码是

消息消息 = 新的 SubclassOfMessage()

但确实你不能有一个新的 Message 对象

于 2012-05-19T23:45:19.757 回答