请教各位这两种写法

看java开发实战经典里面OutputStream里面的例子:

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class Test{
public static void main(String args[]) throws Exception{//异常抛出,不处理
File f = new File("d:"+File.separator+"test.txt");
OutputStream out = null; //准备好一个输出流对象
out = new FileOutputStream(f); //通过对象多态性,进行实例化
String str="hello world";
byte b[]=str.getBytes();
out.write(b);
out.close();
}
}

我认为可以直接这样写:

import java.io.File;
import java.io.FileOutputStream;
public class Test{
public static void main(String args[]) throws Exception{
File f = new File("d:"+File.separator+"test.txt");
FileOutputStream out = new FileOutputStream(f);
String str="hello world";
byte b[]=str.getBytes();
out.write(b);
out.close();
}
}

这两个都可以实现目标,OutputStream是抽象类,FileOutputStream是OutputStream的子类,直接用FileOutputStream类声明对象不是更直接吗?
...全文
453 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
完全明白了,多谢各位了!
VICTOR_Hcz 2013-08-17
  • 打赏
  • 举报
回复
看了上面的大神说的,小弟受教了。
王大叔爱编程 2013-08-17
  • 打赏
  • 举报
回复
首先,需要说明的是,从你这个demo上看,用FileOutputStream是很简洁,但是有没有想过这个问题,代码追求重复利用,一般都会写成一个function,如果写成function的话,则扩展性要好,这就需要实现多态了。
马达马达达 2013-08-17
  • 打赏
  • 举报
回复
我觉得先把变量初始化为null可能是教学的需要,为了多演示一种写法吧,让学的人习惯有这种写法。
dwwhu 2013-08-17
  • 打赏
  • 举报
回复
主要是抽象跟封装问题,这是一种面向接口编程的思想。 如果把OutStream换成接口,你就懂了,老师这样做只是为了将来讲多态或者接口做铺垫吧。
zuijiazhuangtai 2013-08-17
  • 打赏
  • 举报
回复
各人习惯问题
赏金--猎人 2013-08-16
  • 打赏
  • 举报
回复
沙僧: lz,8楼说的对呀! lz,10楼说的对呀! lz,8楼、10楼说的对呀!
末日哥 2013-08-14
  • 打赏
  • 举报
回复
第一种灵活性高,抽象出来,行为共享,代码共享,利于后期维护
loveofmylife 2013-08-14
  • 打赏
  • 举报
回复
这种方式在java中很常见,例如List list = new ArrayList(); 简单来说是约定代码使用接口中定义的方法,而不是依赖于具体的实现,因此后期修改实现类的代码,你不用在对你的程序大动干戈。
simple_cb 2013-08-14
  • 打赏
  • 举报
回复
引用 4 楼 zhiqiu 的回复:
[quote=引用 3 楼 qq837611342 的回复:] 抽象类是不能被实例化的,所以 OutputStream out = null; out = new FileOutputStream(f);这样得到的结果是引用是OutputStream,而实体是FileOutputStream,所以现在你只能用OutputStream抽象类的方法,如果用了FileOutputStream里面的方法而OutputStream里面没有的方法编译都通不过
那不是我后面直接用FileOutputStream out = new FileOutputStream(f);更好吗?FileOutputStream不是抽象类,用它直接声明、实例化没有问题,而且它也覆写了OutputStream类的方法,这样不是更好吗?[/quote]就你这里而言,的确是下面的比较好
灰蛋一个 2013-08-14
  • 打赏
  • 举报
回复
引用 2 楼 zhiqiu 的回复:
[quote=引用 1 楼 huidanyige 的回复:] 一样的作用 第一种只是使代码更灵活,父类的引用指向子类的对象,多态的表现。
后面的写法不是更简单吗?少了几行代码啊,而且我用的就是FileOutputStream类,直接就用它来声明并实例化,不是更容易理解吗?[/quote] 当然是可以的 规范嘛 一般都会用多态的 当引用别的子类的时候,比如ObjectOutputStream 直接 out=ObjectOutputStream; 就行了
  • 打赏
  • 举报
回复
引用 3 楼 qq837611342 的回复:
抽象类是不能被实例化的,所以 OutputStream out = null; out = new FileOutputStream(f);这样得到的结果是引用是OutputStream,而实体是FileOutputStream,所以现在你只能用OutputStream抽象类的方法,如果用了FileOutputStream里面的方法而OutputStream里面没有的方法编译都通不过
那不是我后面直接用FileOutputStream out = new FileOutputStream(f);更好吗?FileOutputStream不是抽象类,用它直接声明、实例化没有问题,而且它也覆写了OutputStream类的方法,这样不是更好吗?
simple_cb 2013-08-14
  • 打赏
  • 举报
回复
抽象类是不能被实例化的,所以 OutputStream out = null; out = new FileOutputStream(f);这样得到的结果是引用是OutputStream,而实体是FileOutputStream,所以现在你只能用OutputStream抽象类的方法,如果用了FileOutputStream里面的方法而OutputStream里面没有的方法编译都通不过
  • 打赏
  • 举报
回复
引用 1 楼 huidanyige 的回复:
一样的作用 第一种只是使代码更灵活,父类的引用指向子类的对象,多态的表现。
后面的写法不是更简单吗?少了几行代码啊,而且我用的就是FileOutputStream类,直接就用它来声明并实例化,不是更容易理解吗?
灰蛋一个 2013-08-14
  • 打赏
  • 举报
回复
一样的作用 第一种只是使代码更灵活,父类的引用指向子类的对象,多态的表现。
valenon 2013-08-14
  • 打赏
  • 举报
回复
1,第一种写法可以两句合为一句: OutputStream out = new FileOutputStream(f); 分成两句实在是多此一举。 2,第一中写法是是多态的体现,但是仅仅在一个方法的内部这样写是没有意义的,如果是方法的参数,效果就显现出来了,比如:
public void method(OutputStream out){}
在这个方法里,参数是OutputStream类型,如果你设计成FileOutputStream类型,是不是他所能接受的参数类型就比OutputStream小了,那么其他的非FileOutputStream的OutputStream就不能被传给这个方法了,万一以后要兼容其他类型,就得改了,但如果一开始就设计成比较宽泛的类型(OutputStream),就不用在改,而且即使你以后不需要扩展,那也没有任何影响啊。 这就是面向对象中“依赖抽象,不依赖具体”的原则。
keepdaydayup 2013-08-14
  • 打赏
  • 举报
回复
引用 11 楼 zhiqiu 的回复:
[quote=引用 10 楼 viszl 的回复:] [quote=引用 9 楼 zhiqiu 的回复:] 单纯从这个具体的的最简单的这个任务来说,我直接声明并实例化子类也是可以的,但最好还是声明父类,通过多态性,实例化子类,养成习惯。 这样理解对吧?
直接生命实现类在任何时候都可以,但不推荐这样做,举个简单的例子 class B implement class A 在你的程序中 A a = new B(); 如果以后你的程序中Class B deprecated了,换成了一个新的Class C implement Class A,修改你的程序,只需要A a = new B()=>>A a = new C(); 如果你一开始B a = new B(); 程序里允许你使用B自己的方法(非接口方法),你修改起来就麻烦了[/quote] 那B里面就不能加入自己的方法吗?都去覆写父类的方法?[/quote] B里面可以加入自己的方法,如果不能加入的话要继承或实现就没多大意义了。 如果加入自己的方法的话,调用B类专属方法的时候需要强制转换一下
末日哥 2013-08-14
  • 打赏
  • 举报
回复
引用 13 楼 zhiqiu 的回复:
[quote=引用 12 楼 fudongrifdr 的回复:] 可以加,在这不能用
?[/quote] A a = new B(); a只能调用B继承A的方法,不能调用B特有的方法 这样的好处是,以后有个C也继承了A,如果要实现C只需要把B改成C就行了,而不必担心程序中会出现C没有的方法导致出错,大家都按父类的那方法来,就不会出乱子。。
  • 打赏
  • 举报
回复
引用 12 楼 fudongrifdr 的回复:
可以加,在这不能用
末日哥 2013-08-14
  • 打赏
  • 举报
回复
可以加,在这不能用
加载更多回复(3)

62,612

社区成员

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

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