大家知道,InputStream是抽象类,而一般抽象类是不能创建对象的。但查一下,又会发现InputStream是有构造方法的。并且据一些书籍的介绍,System.in就属于InputStream的一个对象。这到底怎么回事呢?是抽象类也能创建对象,还是InputStream就不是抽象类呢?请教各位高手和专家。

解决方案 »

  1.   

    个人理解:抽象类,不可以使用: new 类名(),进行创建对象的动作
      

  2.   

    in是InputStream子类的一个对象,说它是InputStream的对象也可以的
    抽象类不可以创建对象InputStream是抽象类,
    本人新手也不知道InputStream为什么会有构造方法
      

  3.   

    ①抽象类不能实例化对象。但是其具体子类可以。
    ②InputStream是抽象类。所以虽然InputStream有构建器,但是不能用于实例化对象,只能在子类实例化子类对象的时候为子类服务。
    ③System.in是BufferedInputStream子类的对象,当然也符合InputStream类型。
      

  4.   

    2楼正解。1楼扯淡。接着你的问题,我想到了一个更深层次的问题。抽象类为什么不能 创建对象呢。因为抽象类有abstract的方法。所以不能创建对象。但是,抽象类必须有构造方法。为什么这么说呢?抽象类,有一个用途,就是当做模板。让别的类来继承他(继承的时候实现他所有的abstract方法)大家应该知道子类的构造方法里第一句会调用super()也就是父类的构造方法用来初始化从父类继承来的字段。这个时候相当于在子类内部创建了一个隐藏的父类对象。但是,这看似与我们刚才说的,抽象类不能创建对象矛盾了。但,如果你自习思考就会知道。其实不矛盾。抽象类不能创建对象是因为有方法是abstract类型的。而我用子类继承他的时候必然实现了他的abstract方法。这样就没有方法是abstract的了。所以也就相当于刚才的创建合法。
    这就是抽象类中有构造方法,而且必须有构造方法的原因。