5

我在教程中看到了以下代码:

URLConnection connection = new URL("http://example.com").openConnection();

这怎么可能?API 说 URLConnection(以及子类 HttpURLConnection)是一个抽象类。但是抽象类不能被实例化。我还看到了其他教程(例如)这段代码:

URL url = new URL( "http://java-tutor.com/index.html" );
URLConnection con = url.openConnection();

为什么没有“新”?对我来说这很奇怪,所以有人可以向我解释一下。

4

4 回答 4

4
openConnection();

创建URLConnection类的实现实例(sun.net.www.protocol.http.HttpURLConnection @Credit 转到 Sotirios)。

基于javadoc

如果对于 URL 的协议(例如 HTTP 或 JAR),存在属于以下包之一或其子包之一的公共专用 URLConnection 子类:java.lang、java.io、java.util、java.net、返回的连接将属于该子类。例如,对于 HTTP,将返回一个 HttpURLConnection,对于 JAR,将返回一个 JarURLConnection。

于 2013-05-28T14:57:49.283 回答
1

URLConnection 确实是一个抽象类。它不能被实例化。

然而,为了不无用,对于类结构中的每个抽象类,都必须有一个具体的子类(可能删除几个层次),即可以实例化。

URL.openConnection() 将这些子类之一返回给您。如果您愿意,可以使用调试器验证这一点。URLConnection 是您称为“con”的引用的类型,而不是该引用所引用的对象的类型。

于 2013-05-28T15:03:44.123 回答
1

首先,您不实例化URLConnection,但URL在:

URLConnection connection = new URL("http://example.com").openConnection();

URLConnection是变量类型(可以是abstract甚至 interface),URL是您实例化的特定类。

关于无新词,openConnection()返回URLConnection对象,因此您不需要自己创建一个。

于 2013-05-28T14:58:41.647 回答
1

URL是一个通过计划创建URLConnection基础(如果我没记错的话)的工厂。您可以拥有HttpsURLConnectionHttpURLConnection

于 2013-05-28T14:59:11.073 回答