使用另一个对象的方法实例化一个抽象类?

时间:2014-06-02 20:02:07

标签: java abstract-class instantiation

我一直在研究创建条形码扫描程序,在我的研究中,我遇到了一些我以前从未见过的东西,而且我不确定它到底在做什么......

这是我的程序片段,包括我不理解的行:

import javax.comm.*;    

public class InvScan implements SerialPortEventListener {


static CommPortIdentifier portId1;
SerialPort serialPort1;


public InvScan(){
    serialPort1 = (SerialPort) portId1.open("InvScan", 2000); //what does this mean? 
}

请参阅我评论的行“这是什么意思?”。 SerialPort是一个抽象类......我知道抽象类可以使用匿名类进行实例化,但我以前从未见过它。这行代码来自一个程序的教程,该程序旨在做一些与我想做的事情相关的事情,但是作者没有很好地解释这里发生了什么(或者我可能只是不理解?)。他的笔记说:

  

我们通过执行portId1的open()方法来实例化SerialPort对象。 Recall portId1是一个ComPortIdentifier对象,open()方法来自ComPortIdentifier。

我已经做了一些研究,我甚至找不到另外一个例子来说明这里发生了什么(可能是因为我甚至不知道该怎么称呼它,真的)。

这对我的程序来说甚至都不是必不可少的,因为我可以重新设计它(而不是一个脚本小子,哈哈),但是我真的不知道我不知道该行是怎么回事。

3 个答案:

答案 0 :(得分:1)

实际对象是从SerialPort派生的非抽象子类的实例化。所有这一切都提供了保证抽象方法已在该实例化对象中完全定义。在内部,这看起来像:

public class CommPortIdentifier ... {

...

    public CommPort open(java.lang.String appname, int timeout)
            throws PortInUseException {

        CommPort val = new NonAbstractCommPort( ... );

        // Do something here

        return val;
    }

...

}

作为CommPort的抽象子类,转换为SerialPort的风险稍大,除非保证对象的实际返回类型是SerialPort的子类。

答案 1 :(得分:0)

portId1.open返回的是SerialPort的子类型。抽象类可能仍然具有具体的子类型;这段代码的作用是将返回的对象强制转换为已知的超类型。

答案 2 :(得分:0)

portId1.open("InvScan", 2000)调用一个返回SerialPort的子类的方法。然后它被转换为SerialPort。 (抽象类可以有非抽象的子类。)