抽象类不是不能实例化吗?

LELOUCH_lcy 2014-10-18 12:02:59
InputStream in = this.getClass().getClassLoader().getResourceAsStream();
这个式子合法吗?右边看了下是返回类型是InputStream,但是InputStream是抽象类啊,这样赋值给in可以吗?求大神解答~
...全文
181 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
humanity 2014-10-19
  • 打赏
  • 举报
回复
你得到了 InputStream 就可以用了,你不用管别人是怎么返回一个 InputStream 给你的。这不是你的职责。
LELOUCH_lcy 2014-10-18
  • 打赏
  • 举报
回复
右边的括号里少了一个文件名
日知己所无 2014-10-18
  • 打赏
  • 举报
回复
抽象类不能实例化的意思是,你不能这么写: InputStream in = new InputStream(); 原来的写法(除了右边的括号里少写了参数以外)没有问题
humanity 2014-10-18
  • 打赏
  • 举报
回复
Java 中 = 等号并不必然是一个定义对象分配内存的过程。只有碰到了 new 或字符串或基本类型的常量时才是。InputStream input = ... 并不表示我们在定义对象并分配内存,它可能仅仅是一个变量赋值。
引用 4 楼 oLELOUCH12345 的回复:
[quote=引用 3 楼 humanity 的回复:] 子类可以赋值给任意它的父类或接口。这只是一个符号变化了,对象实例本身的类型是在 new 的时刻决定的,它一生不变。 你看到变量是 InputStream 并不是表示它是 new InputStream() 得到的,而是类似这样:

InputStream input = new FileInputStream("F:/a.txt");
那这种情况该怎么判断呢?只要不是new出来的都可以这样操作吗?[/quote]
humanity 2014-10-18
  • 打赏
  • 举报
回复
对象实例可以赋值给它的真实类型的任意一个父类型或父接口。 所以你只要知道它 具备 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");

LELOUCH_lcy 2014-10-18
  • 打赏
  • 举报
回复
引用 3 楼 humanity 的回复:
子类可以赋值给任意它的父类或接口。这只是一个符号变化了,对象实例本身的类型是在 new 的时刻决定的,它一生不变。 你看到变量是 InputStream 并不是表示它是 new InputStream() 得到的,而是类似这样:

InputStream input = new FileInputStream("F:/a.txt");
那这种情况该怎么判断呢?只要不是new出来的都可以这样操作吗?
humanity 2014-10-18
  • 打赏
  • 举报
回复
子类可以赋值给任意它的父类或接口。这只是一个符号变化了,对象实例本身的类型是在 new 的时刻决定的,它一生不变。 你看到变量是 InputStream 并不是表示它是 new InputStream() 得到的,而是类似这样:

InputStream input = new FileInputStream("F:/a.txt");
Magical茏 2014-10-18
  • 打赏
  • 举报
回复
右边是返回InputStream的 子类, 这是典型的父类引用 指向 子类实例 多态表现
LELOUCH_lcy 2014-10-18
  • 打赏
  • 举报
回复
引用 8 楼 yy_Memories 的回复:
关于抽象类实例化这个问题,以前在Java吧看到过,都是被误导了,你要记住一点,抽象类是绝对不能被实例化的! 你上面的那个例子实际是调用FileInputSteram实例化然后返回InputStream。
谢谢回答~
LELOUCH_lcy 2014-10-18
  • 打赏
  • 举报
回复
引用 7 楼 Android_iPhone 的回复:
抽象类不能实例化的意思是,你不能这么写: InputStream in = new InputStream(); 原来的写法(除了右边的括号里少写了参数以外)没有问题
谢谢回答~
LELOUCH_lcy 2014-10-18
  • 打赏
  • 举报
回复
引用 6 楼 humanity 的回复:
Java 中 = 等号并不必然是一个定义对象分配内存的过程。只有碰到了 new 或字符串或基本类型的常量时才是。InputStream input = ... 并不表示我们在定义对象并分配内存,它可能仅仅是一个变量赋值。 [quote=引用 4 楼 oLELOUCH12345 的回复:] [quote=引用 3 楼 humanity 的回复:] 子类可以赋值给任意它的父类或接口。这只是一个符号变化了,对象实例本身的类型是在 new 的时刻决定的,它一生不变。 你看到变量是 InputStream 并不是表示它是 new InputStream() 得到的,而是类似这样:

InputStream input = new FileInputStream("F:/a.txt");
那这种情况该怎么判断呢?只要不是new出来的都可以这样操作吗?[/quote][/quote] 谢谢回答~
fdssffdds 2014-10-18
  • 打赏
  • 举报
回复
关于抽象类实例化这个问题,以前在Java吧看到过,都是被误导了,你要记住一点,抽象类是绝对不能被实例化的! 你上面的那个例子实际是调用FileInputSteram实例化然后返回InputStream。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧