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类型对象的方法。它的实际具体类型是串口的一个子类,它可以是匿名类,也可以不是匿名类。