ciyiyan
2016-02-16 12:32
采纳率: 100%
浏览 1.5k
已采纳

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

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

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

9条回答 默认 最新

  • 已采纳

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

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • lwladzhj 2016-02-16 13:11

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

    评论
    解决 无用
    打赏 举报
  • kaka枫 2016-02-16 13:12

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

    评论
    解决 无用
    打赏 举报
  • 毕小宝 2016-02-16 13:37

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

    评论
    解决 无用
    打赏 举报
  • lambda-fk 2016-02-16 13:51

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

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

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

    评论
    解决 无用
    打赏 举报
  • simpleGW 2016-02-16 19:30

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

    public abstract class Animal{
    
    }
    

    public class Dog extend Animal{
    void run(){

        }
    

    }

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

    评论
    解决 无用
    打赏 举报
  • xushanshan_ 2016-02-17 00:11

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

    评论
    解决 无用
    打赏 举报
  • 会飞的锅 2016-02-17 02:35

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

    评论
    解决 无用
    打赏 举报
  • Royal_lr 2016-02-17 02:59

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

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题