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

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

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

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

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

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

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

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

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

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

public abstract class Animal{

}

public class Dog extend Animal{
void run(){

    }

}

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

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

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

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