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类声明对象不是更直接吗? [解决办法] 一样的作用 第一种只是使代码更灵活,父类的引用指向子类的对象,多态的表现。 [解决办法] 抽象类是不能被实例化的,所以 OutputStream out = null; out = new FileOutputStream(f);这样得到的结果是引用是OutputStream,而实体是FileOutputStream,所以现在你只能用OutputStream抽象类的方法,如果用了FileOutputStream里面的方法而OutputStream里面没有的方法编译都通不过 [解决办法] 当然是可以的 规范嘛 一般都会用多态的 当引用别的子类的时候,比如ObjectOutputStream 直接 out=ObjectOutputStream; 就行了 [解决办法]
抽象类是不能被实例化的,所以 OutputStream out = null; out = new FileOutputStream(f);这样得到的结果是引用是OutputStream,而实体是FileOutputStream,所以现在你只能用OutputStream抽象类的方法,如果用了FileOutputStream里面的方法而OutputStream里面没有的方法编译都通不过
那不是我后面直接用FileOutputStream out = new FileOutputStream(f);更好吗?FileOutputStream不是抽象类,用它直接声明、实例化没有问题,而且它也覆写了OutputStream类的方法,这样不是更好吗?
就你这里而言,的确是下面的比较好 [解决办法] 这种方式在java中很常见,例如List list = new ArrayList(); 简单来说是约定代码使用接口中定义的方法,而不是依赖于具体的实现,因此后期修改实现类的代码,你不用在对你的程序大动干戈。 [解决办法] 第一种灵活性高,抽象出来,行为共享,代码共享,利于后期维护 [解决办法]
可以加,在这不能用
? A a = new B(); a只能调用B继承A的方法,不能调用B特有的方法 这样的好处是,以后有个C也继承了A,如果要实现C只需要把B改成C就行了,而不必担心程序中会出现C没有的方法导致出错,大家都按父类的那方法来,就不会出乱子。。 [解决办法]
直接生命实现类在任何时候都可以,但不推荐这样做,举个简单的例子 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自己的方法(非接口方法),你修改起来就麻烦了