第一章 对象导论
面向对象程序设计(Object-oriented Programming,OOP),这章主要了解到对象的重要性
1.1 抽象过程
1、程序员必须建立起在“机器模型”(解空间内,如计算机)和“实际待解问题的模型”(问题控件内,如一项业务)之间的关联。
- 这句话我可以粗俗的理解为我们用计算机去解决一些遇到的问题
2、对象:问题空间中的元素在解空间中的表示称为对象
- 那么业务中的“游客”,在编程中可以称为“游客”这个对象
3、每个对象具有状态还有操作,对现实世界中的对象作类比,它们具有行为和特性
- 那就是我们说的Java的类的属性和方法
4、Java的五个基本特性:
- 万物皆为对象:理论上可以任何玩意儿表示为对象,可以存储数据,在自身上执行操作
- 程序是对象的集合,他们通过发送消息来告诉彼此所要做的:消息可以理解为对某个对象的方法的调用,编程不就是来回各种调用各种对象,让他们都联系起来
- 每个对象都有自己的由其他对象所构成的存储:可以理解为一个对象中可以包含多个对象吧
- 每个对象都拥有其类型:每个对象都是某个类的实例,也就是都是通过class来new出来的
- 某一特定类型的对象都可以接受同样的消息:圆形、几何形、继承等,涉及到“可替代性”,OOP中的一个强有力的概念
5、对象具有状态、行为、标识,每一个对象在内存中都有一个唯一的地址
1.2 每个对象都有一个接口
1、class表示数据类型,具有相同特性和行为的对象的集合
2、面向对象程序设计的挑战之一,在问题空间的元素和解空间的对象之间创建一对一的映射
3、向对象发送请求,比如说调用某方法,此过程称为:发送消息。对象得到消息后执行相应的代码
4、定义一个对象的引用,new方法创建对象,用.某方法来发送请求
5、每个对象都有一个接口:每个对象都要实现一些行为,而接口给对象定义好了这些行为,接口确定了这些行为
1.3 每个对象都提供服务
1、去创建(最好是在现有的代码库中寻找)能够提供理想的服务来解决问题的一系列对象:通俗的理解,比如去寻找好用的API或者第三方库
2、将过多的功能放在一个对象中是不好的,每个对象都应该去很好的完成一项任务
1.4 被隐藏的具体实现
1、程序员分为两类:类创建者和客户端程序员,类创建者的目标是为了构建类,客户端程序员的目标是收集各种类用来快速开发,这个定义让我感觉豁然开朗,很好的形容了程序员的情况
2、简单的说,我写了一个第三方库,一些东西不希望用这个库的人来随便更改,改坏了咋整
3、访问控制存在的原因
- 让客户端程序员无法触及他们不应该触及的部分
- 库设计者改变类内部的工作方式而不用担心影响到客户端程序员
4、访问修饰:
- public紧随其后的元素对任何人都是可用的
- protected比包访问权限多了个继承的子类可以访问
- default什么都没有,包访问权限,仅限本包访问
- private表示除类型创建者和类型内部的方法之外的任何人都不能访问
1.5 复用具体实现
1、一个类中拥有多个不同的对象,使用现有的类合成新的类,这种概念称为组合,一般在构造方法中new一个实例
2、组合是动态发生的,称为聚合,一般在构造方法传参或者set方法注入到对象中
1.6 继承
1、创建了一个类,另一个新类与其有相似的功能,通过继承很好的就可以实现
2、举个例子,几何形是基类,都有尺寸、颜色、位置等属性,都有移动、着色等方法,在此基础上可以继承出正方形、三角形、圆形等,现有的类相当于拥有基类所拥有的一切,可以调用基类的属性、方法
3、两种方法可以使基类和子类产生差异:
- 在子类中添加新方法
- 在子类中重写(覆盖:overriding)基类的方法
1.6.1 “是一个”和“像是一个”的关系
1、是一个:只去覆盖基类的方法,不添加新方法
2、像是一个:不光去覆盖基类的方法,还添加了新方法
1.7 伴随多态的互换对象
1、这个说了半天就说了一个多态,在某个方法参数中传入基类对象,调用那些基类方法
2、当我们在方法中传入对应的子类对象,就会去执行子类所覆盖的方法
3、多态是很神奇的,不用书中的例子,我类比一个例子吧:
- 库里、科比、艾弗森都继承自运动员,但是他们的投篮和变向都是完全不同的,都会去重写基类的两个方法的
- 库里被doSomething看作是一个运动员,doSomething调用运动员的任何方法(本书常说发送消息),库里都会接受到
- 把库里看作是运动员的这个过程,称为向上转型
- 这里不是去判断,如果你是库里,请这样做,如果你是科比请那样做,那会非常杂乱不堪
- 而是告诉你,你是一个篮球运动员,我知道你可以投篮和变向,那么去做吧
void doSomething(Sportsman sportsman) { sportsman.shooting(); sportsman.crossover(); } Curry curry = new Curry(); Kobe kobe = new Kobe(); Iverson iverson = new Iverson(); doSomething(curry); doSomething(kobe); doSomething(iverson);
1.8 单根继承结构
1、在OOP中单根继承带来了很多好处,而多重继承则会带来很多的问题
2、单根继承使垃圾回收的实现变的容易得多了
1.9 容器
1、也就是我们常用的集合,包括:List、Map、Set、队列、树、堆栈
2、对容器有所选择,原因有二:
- 不同的容器提供了不同的接口和行为,某种容器提供的解决方案可能比其他容器灵活的多
- 不同容器对某些操作有不同的效率,ArrryList和LinkedList的区别
- ArrayList随机访问一个元素是固定的时间,而LinkedList则是越靠近表尾花费时间越长
- ArrayList插入和删除操作花费时间较长,而插入删除操作LinkedList花费的时间是固定的
1.9.1 参数化类型
1、也就是我们所说的范型,指定类型,比如List<String> list = new ArrayList<>();
2、没啥说的了,就这样吧,哈哈
1.10 对象的创建和生命周期
1、说的还是一个Java垃圾回收的问题:
- C++通过编程的方式来确定何时销毁对象
- 而Java不用去考虑这些,因为有垃圾回收机制
2、单根继承和垃圾回收使得Java编程比C++要简单的多
1.11 异常处理
这个没啥可说的,异常处理确实挺方便的
1.12 并发编程
1、多线程的知识,主要的一个问题就是共享资源,所以这样处理:
- 某个任务锁定某项资源,完成其任务后,释放资源锁,使其他任务可以使用这项资源
1.13 Java与Internet
1.13.1 Web是什么
这个也不想说太多了,客户/服务器技术
1.13.2 客户端编程
1、插件
2、脚本语言
脚本的缺点是将代码暴露给任何人,常用的脚本语言是JavaScript
3、Java
只要计算机上有浏览器,浏览器内置Java解释器,那么程序就可以在这台计算机上运行
4、备选方案
5、.NET和C#
6、Interact和Intranet
1.13.3 服务器端编程
其实也没啥说的,Java在编写服务器这方面确实是没得说,哈哈
1.14 总结
1、对于设计良好的程序,通过阅读它就可以很容易的理解其代码。通常,代码也会少很多,因为许多问题都可以通过重用现有的类库代码而解决
2、正确的评估自己的需求,是用Java还是其他编程语言,做好衡量