各位兄弟, 小弟是JAVA新手,有一个问题 请教大家
我用 socket连接上服务器以后,InputStream sin=socket.getInputStream();
sin.read()我查了一下,InputStream 是一个抽象类,而read是抽象方法,也就是说必须由InputStream 的子类来实现read()方法。
InputStream sin=socket.getInputStream() 返回的是一个InputStream 方法,为什么可以直接使用 它的read()方法呢? JAVA在运行的时候 怎么知道 用InputStream  的哪一个子类的read()方法呢?

解决方案 »

  1.   

    InputStream sin=socket.getInputStream() ;
                    ==============================
                        返回的是一个具体子类的实例
      

  2.   

    这是java的动态绑定的问题。具体实例的read方法覆盖了抽象类的read方法,所以当我们把一个具体实例它当作抽象类对待的时候,调用的并不是抽象类的read 而已经是具体事例的read了
    一言难尽阿赫赫 建议多了解一下面向对象的思想。
      

  3.   

      3 楼的你说了半天,都是一堆废话
         别个楼主最后一句你没看懂啊,我真怀疑你的阅读能力       InputStrema那么多子类,你怎么知道它到底接受的是哪个子类答案我也不知道
      

  4.   


    socket.getInputStream()返回的是SocketInputStream
    翻jdk源码找到的。
      

  5.   


     * This stream extends FileInputStream to implement a
     * SocketInputStream. Note that this class should <b>NOT</b> be
     * public.
     *
     * @version     1.35, 11/17/05
     * @author Jonathan Payne
     * @author Arthur van Hoff
     */
    class SocketInputStream extends FileInputStream