2

我正在通过使用一本教科书来学习 Java,其中包含以下代码,描​​述了如何使用HttpURLConnection...

class HttpURLDemo {
    public static void main(String args[]) throws Exception {
        URL hp = new URL("http://www.google.com");
        HttpURLConnection hpCon = (HttpURLConnection) hp.openConnection();

        // Display request method.
        System.out.println("Request method is " + hpCon.getRequestMethod());
        }
    }

有人可以解释为什么该hpCon对象以下列方式声明...

HttpURLConnection hpCon = (HttpURLConnection) hp.openConnection();

而不是像这样声明它......

HttpURLConnection hpCon = new HttpURLConnection(); 

教科书作者提供了以下解释,我不是很明白...

Java 提供了一个 URLConnection 的子类,它提供对 HTTP 连接的支持。此类称为 HttpURLConnection。您可以通过在 URL 对象上调用 openConnection( ) 以刚才显示的相同方式获得 HttpURLConnection,但您必须将结果转换为 HttpURLConnection。(当然,您必须确保您实际打开的是 HTTP 连接。)一旦您获得了对 HttpURLConnection 对象的引用,您就可以使用从 URLConnection 继承的任何方法

4

2 回答 2

4

你不明白为什么不使用的声明:

 HttpURLConnection hpCon = new HttpURLConnection();

不提供有关要打开连接的 URL 的信息。这就是您应该使用的原因:

HttpURLConnection hpCon = new HttpURLConnection(hp);

因为这样构造函数就知道您要打开到 url 的连接"http://www.google.com"

于 2012-04-11T19:16:27.133 回答
1

java.net.URLConnectionftp http是一个抽象类,有助于通过各种协议(等) 与各种类型的服务器进行通信。

协议特定的子类隐藏在 SUN 的包中,这些隐藏的类负责协议的具体实现。

在您的示例中,由于您的 URL 是http://www.google.com通过解析 URL,因此 URL 类的内部知道必须使用 HTTP 处理程序/子类。
因此,当您打开与服务器的连接时,hp.openConnection();您将获得一个实现 HTTP 协议的类的具体实例。

该类是一个实例HttpURLConnection(实际上是一个子类,因为HTTPURLConnection也是abstract,这就是为什么你可以这样做:

HttpURLConnection hpCon = (HttpURLConnection) hp.openConnection();并且没有得到类转换异常。

因此,对于 Java 的设计,你不能HttpURLConnection hpCon = new HttpURLConnection(hp);按照你的要求去做,因为设计者不希望你这样使用这些 API。

您应该在 arround 工作URLURLConnections并且只担心输入/输出。
你不应该担心其余的

于 2012-04-12T07:55:24.340 回答