右边是返回InputStream的 子类,这是典型的父类引用 指向 子类实例多态表现

解决方案 »

  1.   

    子类可以赋值给任意它的父类或接口。这只是一个符号变化了,对象实例本身的类型是在  new 的时刻决定的,它一生不变。你看到变量是 InputStream 并不是表示它是 new InputStream() 得到的,而是类似这样:
    InputStream input = new FileInputStream("F:/a.txt");
      

  2.   

    那这种情况该怎么判断呢?只要不是new出来的都可以这样操作吗?
      

  3.   

    对象实例可以赋值给它的真实类型的任意一个父类型或父接口。所以你只要知道它 具备 InputStream 的功能就可以了,这是面向对象的程序设计,关注功能,忽略不必要的细节。如果你确实想知道这个 InputStream 是不是 FileInputStream 可以:   if (input instanceof FileInputStream) {
             FileInputStream fis = (FileInputStream) input;
       }  或者 boolean isFile = FileInputStream.class.isAssignFrom(input);  或者
       String className = input.getClass().getName();
       boolean isFile = className.equals("java.io.FileInputStream");
      

  4.   

    Java 中 = 等号并不必然是一个定义对象分配内存的过程。只有碰到了  new 或字符串或基本类型的常量时才是。InputStream input = ... 并不表示我们在定义对象并分配内存,它可能仅仅是一个变量赋值。那这种情况该怎么判断呢?只要不是new出来的都可以这样操作吗?
      

  5.   

    抽象类不能实例化的意思是,你不能这么写:
    InputStream in = new InputStream();原来的写法(除了右边的括号里少写了参数以外)没有问题
      

  6.   

    关于抽象类实例化这个问题,以前在Java吧看到过,都是被误导了,你要记住一点,抽象类是绝对不能被实例化的! 你上面的那个例子实际是调用FileInputSteram实例化然后返回InputStream。
      

  7.   

    那这种情况该怎么判断呢?只要不是new出来的都可以这样操作吗?
    谢谢回答~
      

  8.   

    你得到了 InputStream 就可以用了,你不用管别人是怎么返回一个 InputStream 给你的。这不是你的职责。