实例化 Java 抽象类?

相对较新的Java程序员和我一样被教导你不能创建抽象类的实例。我还做了一些研究,我了解到在大多数情况下,当它出现一个抽象类正在创建时,它实际上是一个匿名子类。但这是我遇到的问题:

Java 的类有一个返回 . 是一个抽象类,Java文档还将其所有子类列为抽象类.....所以我真的很迷茫。返回的内容是什么?URLopenConnectionURLConnectionURLConnection


答案 1

返回的是一个非抽象子类,您在 API 文档中找不到该子类,例如 。如果从浏览器中的小程序运行相同的代码,则可能会得到一个不同的代码,通常是包装浏览器的本机连接的内容。sun.net.www.protocol.http.HttpUrlConnection

因此,没有技巧,也没有魔术,只是有些类不会出现在API文档中,因为它们被认为是实现的内部并且可能会发生变化。

有很多类似的例子,DocumentBuilderFactoryTransformerFactory都是抽象的,但它们的方法将返回一个子类,通常是单独打包的(例如Saxon)。newInstance()

但是同一个问题也有不同的解决方案:JDBC定义了接口(而不是抽象类),以及一个具有静态方法的实用程序类来加载不同的驱动程序实现。数据库驱动程序供应商不需要扩展抽象类,而是需要实现该接口。DriverDriverManagerDriver

顺便说一句,要找到对象的实际运行时类,只需在它们上调用getClass()即可。


答案 2

openConnection返回一些扩展的具体类。该方法的签名被定义为返回,因为使用它的代码不应依赖于任何特定的实现。URLConnectionURLConnection


推荐