把一个对象不当他所属的特定类型,而是当成父类的一个对象来对待。编写出不依赖于特定类型的代码,这样的代码不会受添加新类型影响。
但问题是编译器在编译时不知道该执行谁的代码!OOP 设计采用了后期绑定方式实现动态的运行时获取类型。不同于 C++的 virtual 关键字,Java 中这是默认机制实现多态。
所有类最终继承自 Object 类。
这样所有对象有公共API,具备基本的相同的功能。使得 GC 也很容易,因为总保存了类型信息,不会因不知道确切类型而陷入僵局。
不到运行时,你不可能知道你到底该创建多少对象,所以有了容器。
由于单继承的设计,一旦将对象引用放进容器,就被向上转型为 Object,从而失去了自己真正的类型。
当取回引用时,又向下转型为具体类型,如果转型错误,还会产生运行时异常。
我们就想要这样的容器:知道自己保存的对象的类型,从而就不需要向下转型和运行时检查(都会产生额外的程序运行时间,所以我们想方设法避免之),这就是参数化类型机制。编译器可以自动定制作用于特定类型上的类。
这就是 JDK5 带来的泛型机制。与此,自 JDK5,大量库被重新适配以适应美妙的泛型。
使用对象时要注意的一个关键问题就是对象的创建和销毁方式。
为了资源的重复利用,当对象不再被使用时,我们应该及时释放资源,清理内存。但问题是怎么知道何时该清理这些对象呢?
所以为了解决这个问题,我们得知道
Java 的GC帮助我们解脱于释放对象内存。
Java 自诞生就内置了异常处理,而且必须使用。唯一可接受的错误报告方式。这并不是 OOP 的特征。
也是内置于语言之中的。
同一时刻处理多任务。
最多用于用户界面,比如大家一起淘宝刷下单按钮。
线程只是一种为单一处理器分配执行时间的手段。如果 os 是多处理器的,每个人物都可以被分派给不同的处理器,达到真正的并行。只在 Java 语言层级说,并发编程使得程序员不必操心到底是否为多处理器。
隐患就是共享资源访问安全的问题。这就是JDK5 库开始发力的地方。
于此,Java 服务端编程正值壮年。一起来操作 Java 吧!