引入
如果接触过面向过程的C语言,那么再来接触面向对象的Java的会很好理解。毕竟OOP只是在过程型语言概念的基础上,又添加了许多概念而已。既然添加了许多概念,照理说Java程序比等价的过程型程序要复杂,但是实际上编写良好的Java程序通常要比过程型程序要简单的多,而且也更易于理解。那么,这么神奇的面向对象程序设计究竟是怎么样的呢?
知识点归纳(了解)
1.抽象过程
1.1所有编程语言都提供抽象机制。人们所能解决问题的复杂性直接取决于抽象的类型和质量。
1.2面向对象思想实质:程序可以通过添加新类型的对象使自身适用于某个特定问题。
1.3对象具有状态、行为和标识
每个对象都可以拥有内部数据(它们给出了该对象的状态)和方法(它们产生行为),并且每一个对象都可以唯一地与其他对象区分开来,亦即每一个可以存在于不同的机器和地址中的对象都有一个唯一的地址。
2.每个对象都有一个接口
2.1类是具有相同特性(数据元素)和行为(功能)的对象集合。类实际上是一个数据类型
2.2类是对象的抽象集合,对象是类的具体实例
2.3对象的接口定义了对象可以完成哪些任务。类决定接口。
3.每个对象都提供服务
3.1把对象当做服务提供者
程序通过调用其他对象所能提供的服务来向用户提供服务。
当要解决一个问题时,我们可以想:我们需要哪些服务来解决这个问题?我们需要什么样的对象?这就将问题分解为对象集合了。
3.2提高对象的内聚性
不将过多的功能集合到一个对象中。每个对象都可以很好的完成一项任务,但不试图做更多的事情。还可以在其他地方复用。
4.被隐藏的具体实现
4.1
4.2访问控制存在原因
- 让类消费者无法触及不应该触及的部分
- 允许类创建者可以改变类内部的工作方式而不用担心会影响到类消费者
4.3访问控制关键字
public、private、protected
5.复用具体实现
5.1组合——利用现成的类合成新的类,实现代码复用
- 新的类可以由任意数量、任意类型的其他对象以任意可以实现新的类的中想要的功能的方式所组成
- 在创建新类的时候,组合比继承更加简单灵活
6.继承
6.1继承——以现有的类为基础,通过添加或修改这个副本来创建新类
- 当源类(基类、超类、父类)发生变动时,被修改的副本(导出类、继承类、子类)也会随之变动
- 父类型包含所有子类型所共享的特性和行为。可以创建一个父类型来表示系统中某些对象的核心概念,从父类型中导出其他子类型来表示此核心可以被实现的各种不同方式。
- 子类拥有与父类相同的基础接口
6.2继承后父类与子类的差异性
- 直接在子类中添加新的方法
- 覆盖——改变父类方法的具体实现
6.3继承的is-a关系与is-like-a关系
- is-a关系:只覆盖父类的方法,父类与子类的接口完全相同(替代原则)
- is-like-a关系:添加新的接口元素,父类无法访问新添加的方法,父类与子类的接口并不完全相同
7.伴随多态的可互换对象
7.1将子类对象当做泛化的父类对象看待
存在的问题:如果某个父类的方法要让泛化的几何形状绘制自己,那么编译器在编译时是不可能知道应该执行哪一段代码的,那么,如何正确的调用子类对象的代码呢?
7.2通过向上转型(把子类看做父类的过程)机制实现多态
8.单根继承结构
所有的类最终都继承自单一的基类Object。
9.容器(集合)
在任何时候都可以扩充自己以容纳置于其中的东西。
Java中具有满足不同需要的各种类型的容器,例如List(用于存储序列),Map(用来建立对象之间的关联),Set(每种对象类型只持有一个),还有队列、树、堆栈等构件
- 不同容器提供了不同类型的接口和外部行为
- 不同容器对某些操作具有不同的效率
- 通过参数化类型(泛型)来限制容器存储的数据类型
10.对象的创建和生命期
使用对象时要特别关注它们的生成和销毁方式。
- Java完全采用了动态内存分配方式。每当想要创建新对象时,就要使用new关键字来构建此对象的动态实例
- Java提供“垃圾回收机制”来处理内存释放的问题
11.异常处理
- 异常处理不是面向对象的特征,但是如何进行错误处理一直是最困难的问题之一。
- 在面向对象语言中,异常是一种对象,它从出错地点“抛出”,并被专门设计用来处理特定类型错误的相应的异常处理器“捕获”。
- 异常提供了一种从错误状况进行可靠恢复的途径。现在不再是只能退出程序,可以经常进行校正,并恢复程序的执行,这些都有助于编写出更健壮的程序
12.并发编程
- 同一时刻处理多个任务
- 共享资源处理过程:某个任务锁定某项资源,完成其任务,然后释放资源锁,使其他任务可以使用这项资源。
13.Java与Internet
13.1Web是一个巨型客户/服务器系统
13.2客户端编程
13.2.1插件
13.2.2脚本语言
13.2.3Java
13.2.4C#和.NET
13.4.5Internet与Intranet
13.3服务器端编程
注意事项
- 这篇文章其实都是“对象”的大致轮廓而已,有很多知识还是挺模糊不清的。而且继承、多态、并发等问题都是只言片语无法了解透彻的。但是,正如画画都是从大到小,从轮廓到细致一步一步的过程。学习这门编程语言也应该有这样一个过程——先了解整体性的内容,再去逐步细化攻破每个重要点。
Q&A
1.
Q:如何区别面向过程和面向对象
A:以“行走”为研究对象,那么
面向过程——抬腿,往前放下,抬腿,放下
面向对象——将抬腿,放下封装成一个对象,这个对象具有“走”的功能
参考资料
《Java编程思想(第四版)》第一章