2 ciyiyan ciyiyan 于 2016.02.16 20:32 提问

java 抽象类有段代码没看懂!!!帮忙解释下

自己看视频自学到网络编程,发现下边的代码看不懂,自己也百度了很多,还是没理解好抽象类
OutputStream os=Socket.getOutputSteam();  
os.write("加油".getBytes());
这段代码没看懂,OutputStream抽象类不能直接创建对象,也没有子类去实现,为什么可以直接调用write(byte[] b) 方法?

9个回答

zrf1335348191
zrf1335348191   2016.02.16 22:08
已采纳

不能创建对象的意思是不能通过new outputstream()去创建对象,你不要曲解了。。

lwladzhj
lwladzhj   2016.02.16 21:11

Socket.getOutputStream()方法就可以得到OutputStream的子类实例对象。

u200817992
u200817992   2016.02.16 21:12

Socket.getOutputSteam()实际调用的是AbstractPlainSocketImpl的getOutputStream()方法,返回的是SocketOutputStream实例。
SocketOutputStream是OutputStream的子类。

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.02.16 21:37

虽然OutputStream抽象类不能直接创建对象,但是Socket.getOutputSteam();这个方法调用返回的就是一个OutputStream的实现类的实例。
所以这段代码没有问题的,这就是典型的面向抽象编程的风格,定义变量类型为抽象类型,但是最终赋值时却是这个抽象类的某个实现子类的对象。

fk002008
fk002008   2016.02.16 21:51

对于 A a = new B()
这种写法要明白,主要的是看new 后面的东西。
同样 A a = XXX
一样,XXX就是返回了一个 new 的对象或者是已经存在的某个对象
他和最上面的式子没有本质上的区别
现在给你换了个生产方式你就不认识了。

建议看看工厂模式可以加深理解

强调面向抽象,依赖于抽象的意思就是 变量类型和返回类型等和API相关的东西
都使用抽象类或者是接口去定义

simpleGW
simpleGW   2016.02.17 03:30

你要明白 一个普通类继承了抽象类之后,普通类的对象就可以自动向上转型了. 所以你这个问题其实是 用父类类型变量指向子类对象.
比如:

public abstract class Animal{

}

public class Dog extend Animal{
void run(){

    }

}

Animal tom = new Dog();
tom.run();

xushanshan_
xushanshan_   2016.02.17 08:11

OutputStream os=Socket.getOutputSteam();  
Socket.getOutputSteam()返回的OutputStream的子类
子类教程自父类 OutputStream
os同时拥有子类和父类的公开方法。

qq_18748427
qq_18748427   2016.02.17 10:35

类似于:
Fu fu = new Zi();
fu.write...

Royal_lr
Royal_lr   Ds   Rxr 2016.02.17 10:59

不能直接创建对象,,,和调用write方法有什么直接联系吗

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!