【问题标题】:Java- How to use Abstract classJava-如何使用抽象类
【发布时间】:2012-05-19 23:37:13
【问题描述】:

所以我在学习java中的Abstract类,在阅读别人的代码时看到如下:

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”是什么意思呢?有人可以解释这对我意味着什么吗?提前致谢

【问题讨论】:

  • 您要查找的词是“多态性”。诚然,在这种情况下,Message 没有具体的实现,因为它是抽象的。但是任何继承自Message 的具体类都可以被视为Message。所以notifyMessage 方法可以接受任何类型的实现该抽象类的消息。它不关心具体的实现,它只想与抽象类中公开的功能进行交互,这对所有实现都是通用的。

标签: java class abstract


【解决方案1】:

这意味着你可以接收任何类型的 Message(子)对象,如果你有的话,换个方式吧

public class Letter extends Message ...

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

这样的事情是可能的:

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

java.awt.Component 是抽象的 JPanel继承Container(实际上是JComponent优先) 容器有 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
    };

【讨论】:

    【解决方案2】:

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

    消息消息 = 新的 SubclassOfMessage()

    但确实不能有新的 Message 对象

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-20
      • 2018-09-23
      • 2011-11-26
      • 1970-01-01
      相关资源
      最近更新 更多