java.net包中的HttpURLConnection类
有一个抽象方法disconnect(),它的直接已知子类: HttpsURLConnection 没有实现抽象方法。
为什么我们可以直接调用disconnect()方法,而且这个抽象方法是在哪个类中实现的?

解决方案 »

  1.   

    HttpsURLConnection extends HttpURLConnection with support for https-specific features.
    See http://www.w3.org/pub/WWW/Protocols/ and RFC 2818 for more details on the https specificationThis class uses HostnameVerifier and SSLSocketFactory. There are default implementations defined for both classes
    在API中可以看到这样一句解释:
    该类用了主机验证器和加密套接字工厂,这两个东东已经默认实现了两个类
      

  2.   

    因为HttpsURLConnection 也是abstract的.所以不用实现..如果不是abstract的就要实现
      

  3.   

    public abstract class HttpURLConnectionextends extends URLConnection因为HttpURLConnection/HttpsURLConnection 也是abstract的.所以不用实现..如果不是abstract的就要实现所以 HttpURLConnection   的使用采用的是HttpURLConnection con = (HttpURLConnection)URL.openConnection();
      

  4.   

    接着楼上的说.所以disconnect方法不是在HttpURLConnection和HttpsURLConnection中实现的.而是在openConnection()方法中实现的.你查URL.openConnection方法可以看到最终是返回了一个继承了java.net.HttpURLConnection的类对象.并实现了disconnect方法
      

  5.   

    我去找了源代码,URL.openConnection方法是:public URLConnection openConnection() throws java.io.IOException 
        {
    return handler.openConnection(this);
        }但是它并没有实现disconnect方法呀,怎么回事?。谢谢了.
      

  6.   

    在URL类中有:
    transient URLStreamHandler handler;
    public URLConnection openConnection(Proxy proxy)
    throws java.io.IOException {
    if (proxy == null) {
        throw new IllegalArgumentException("proxy can not be null");
    }

    SecurityManager sm = System.getSecurityManager();
    if (proxy.type() != Proxy.Type.DIRECT && sm != null) {
        InetSocketAddress epoint = (InetSocketAddress) proxy.address();
        if (epoint.isUnresolved())
    sm.checkConnect(epoint.getHostName(), epoint.getPort());
        else
    sm.checkConnect(epoint.getAddress().getHostAddress(),
    epoint.getPort());
    }
    return handler.openConnection(this, proxy);
        }
    而URLStreamHandler类中的openConnection()方法:
        protected URLConnection openConnection(URL u, Proxy p) throws IOException {
    throw new UnsupportedOperationException("Method not implemented.");
        }
    他们最后也没有说明怎么去实现disconnection()方法的啊?
    高手快出现。
      

  7.   

    想看它的实现,首先就找到它的实现类啦。最简单:
    HttpURLConnection conn = (HttpURLConnection)new URL("http://www.google.com").openConnection();
    System.out.println(conn.getClass());输出sun.net.www.protocol.http.HttpURLConnection
    你可以再用JAD之类的反编译工具看看它的实现方法。
      

  8.   

    我是问:HttpURLConnection抽象类中的抽象方法:disconnection()到底是在哪个类中实现了这个抽象方法,实现这个方法的方法体代码是什么?
    谢谢。具体点说明
      

  9.   

    我真是....,我上面的意思这么明确!实现类为sun.net.www.protocol.http.HttpURLConnection ,没有源代码,只能反编译出来看
      

  10.   

    谢谢ChDw 的认真回答。我给你加100分。但是我想问,java.net包下也有一个HttpURLConnection类,程序为什么不是用的它,而是用的sun.net.www.protocol.http.HttpURLConnection类了?
    程序的源代码也没有引入sun.net.www.protocol.http包。反而是引入的java.net包。谢谢回答。
    import java.net.*;public class he
    {
    public static void main(String args[]) throws Exception
    {
    URL u1 = new URL("http://www.hao123.com");
    HttpURLConnection conn = (HttpURLConnection)u1.openConnection();
    //conn.disconnect();
    System.out.println(conn.getClass());
    }
    }
      

  11.   

    其实这些抽象方法,到底是怎么实现的,只有在具体的代码中才能知道。也就是说获得HttpURLConnection的方法不同,实现的类可能也不同。
    按照chDw的说法,如果是new URL("http://www.google.com").openConnection()的方式来获得java.net.HttpURLConnection,则其实现类为sun.net.www.protocol.http.HttpURLConnection(或者其父类)。一般来说,我们不用关心谁在实现它,抽象/接口,本来就是为了屏蔽这种相关性的。
      

  12.   

    学习java如果有些东西是迷迷糊糊的,那怎么学啊?
    java.net包下也有一个HttpURLConnection类,程序为什么不是用的它,而是用的sun.net.www.protocol.http.HttpURLConnection类了? 
    程序的源代码也没有引入sun.net.www.protocol.http包。反而是引入的java.net包。谢谢回答。 
    import   java.net.*; public   class   he 

    public   static   void   main(String   args[])   throws   Exception 

    URL   u1   =   new   URL("http://www.hao123.com"); 
    HttpURLConnection   conn   =   (HttpURLConnection)u1.openConnection(); 
    //conn.disconnect(); 
    System.out.println(conn.getClass()); 


      

  13.   

    哎,迷糊的是你了。java.net只是定义了一个抽象类,或者说接口,不能直接实例化使用的。
    而实现有多种方法。如果你用URL.openConnection();则实际使用的就是sun.net.www.protocol.http.HttpURLConnection
    在其他情况下,不一定是这个类的。建议你去多学习一下有关接口/多态的知识。
      

  14.   

    接口、继承的其中一个用处就是 使得你不用关注最终的实现类是什么,就像JDBC等这些设计都是统一接口规范,你代码就不需要见到如sun.net.www.protocol.http.HttpURLConnection 实现类
      

  15.   

    package sun.net.www.protocol.http;
    ....public class HttpURLConnection extends java.net.HttpURLConnection....
        public void disconnect()
        {
            responseCode = -1;
            if(pi != null)
            {
                pi.finishTracking();
                pi = null;
            }
            if(http != null)
            {
                if(inputStream != null)
                {
                    HttpClient httpclient = http;
                    boolean flag = httpclient.isKeepingAlive();
                    try
                    {
                        inputStream.close();
                    }
                    catch(IOException ioexception) { }
                    if(flag)
                        httpclient.closeIdleConnection();
                } else
                {
                    http.setDoNotRetry(true);
                    http.closeServer();
                }
                http = null;
                connected = false;
            }
            cachedInputStream = null;
            if(cachedHeaders != null)
                cachedHeaders.reset();
        }
    ....
    我终于知道在那实现的了,和你们分享一下,呵呵。谢谢咯。