下面这段代码是java2宝典301页的代码myString ="Obviously the question is false,because ice-cream has no bones";
StringBufferInputStream in_str=StringBufferInputStream(myString);OutputStream theStream=new Bufferedoutputstream(in_str);OutputStream 是所有数据流输出的抽象类,这里是不是把它实例化了还有一个问题,集合中:list类是接口嘛,我看到实例化的语句了:List stringList=new List();想了好几天了,高人指点!

解决方案 »

  1.   

    第一个不是实例化抽象类, 而是实例化一个非抽象类, 然后再将这个实例的引用赋给一个抽象类的变量, 其实就是向上转型.第二个List stringList=new List();这句应该不能编译的. 请贴上下文代码.
      

  2.   

    如果是List stringList=new List();那么,这个list肯定不是接口了,因为接口不能被实例化,但是它可以当作类型来实现。
      

  3.   

    这设计多态问题,在指向一对象时,包含“动态绑定”,也即向上转型了。
    所以是可以的 。 如:Parent p = new Child() ; JAVA函数有个机制会自动将Child向上转型为Parent,但此时p同时具有了很多Child的新操作。
    这些机制使得在设计时提供了很多方便之处,即提供了参数化类型
      

  4.   

    List stringList=new List(); 这不会编译通过,可能楼主没注意到文章细节
      

  5.   

    请问: Dan1980您说:这个实例的引用赋给一个抽象类的变量, 其实就是向上转型.如您所说:是不是实例化的是Bufferedoutputstream类,theStream是他的一个实例,实例的引用转型后,就不是原来类的实例了吗?向上转型有什么用呀,希望详细说明,菜鸟感激不尽!
      

  6.   

    看来楼主对向上转型(Up-Casting)不是太清楚, 建议去看<Thinking in JAVA>中的第七章.简单地说, 向上转型以后就可以应用JAVA的多态(Polymorphism)特性了.比如://Test.java
    abstract class Person {
      abstract void walk();
      abstract void run();
    }class Athlete extends Person {
      public void walk() { System.out.println("An Athlete walks...."); }
      public void run() { System.out.println("An Athlete runs...."); }
    }class ComputerGuy extends Person {
      public void walk() { System.out.println("A computer guy walks...."); }
      public void run() { System.out.println("A computer guy runs...."); }
    }public class Test {
      public static void main(String[] args) {
        Person[] persons = new Person[2];
        persons[0] = new Athlete();
        persons[1] = new ComputerGuy();    for(int i = 0; i < persons.length; i++) {
          persons[i].walk();
          persons[i].run();
        }
      }
    } ///:~