Java 使用另一个对象实例化抽象类';什么方法?

Java 使用另一个对象实例化抽象类';什么方法?,java,abstract-class,instantiation,Java,Abstract Class,Instantiation,我一直在研究创建一个条形码扫描仪程序,在我的研究中,我发现了一些我以前从未见过的东西,我不确定它到底在做什么 以下是我的程序片段,包括我不明白的一行: import javax.comm.*; public class InvScan implements SerialPortEventListener { static CommPortIdentifier portId1; SerialPort serialPort1; public InvScan(){ seria

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

以下是我的程序片段,包括我不明白的一行:

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

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


这对我的程序甚至都不是很重要,因为我可以重新设计它(不是脚本小子,哈哈),但我不知道这一行到底发生了什么,这真的让我很烦。

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

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
的子类,无论从
portId1返回什么。open
SerialPort
的子类型。抽象类可能仍然有具体的子类型;此代码所做的是将返回的对象强制转换为已知的超类型。

portId1.open(“InvScan”,2000)
调用一个方法,该方法返回
SerialPort
的某个子类。然后将其转换为
SerialPort
。(抽象类可以有非抽象子类。)

变量容器类型可以是抽象的,实例化类型(从打开的方法调用中检索)仍然是从抽象基类型派生的具体类型。您到底不明白什么?它只是一个返回SerialPort类型对象的方法。它的实际具体类型是串口的一个子类,它可以是匿名类,也可以不是匿名类。