Java编程思想读书笔记——第一章:对象导论

第一章 对象导论

面向对象程序设计(Object-oriented Programming,OOP),这章主要了解到对象的重要性

1.1 抽象过程

1、程序员必须建立起在“机器模型”(解空间内,如计算机)和“实际待解问题的模型”(问题控件内,如一项业务)之间的关联。

  • 这句话我可以粗俗的理解为我们用计算机去解决一些遇到的问题

2、对象:问题空间中的元素在解空间中的表示称为对象

  • 那么业务中的“游客”,在编程中可以称为“游客”这个对象

3、每个对象具有状态还有操作,对现实世界中的对象作类比,它们具有行为和特性

  • 那就是我们说的Java的类的属性和方法

4、Java的五个基本特性:

  1. 万物皆为对象:理论上可以任何玩意儿表示为对象,可以存储数据,在自身上执行操作
  2. 程序是对象的集合,他们通过发送消息来告诉彼此所要做的:消息可以理解为对某个对象的方法的调用,编程不就是来回各种调用各种对象,让他们都联系起来
  3. 每个对象都有自己的由其他对象所构成的存储:可以理解为一个对象中可以包含多个对象吧
  4. 每个对象都拥有其类型:每个对象都是某个类的实例,也就是都是通过class来new出来的
  5. 某一特定类型的对象都可以接受同样的消息:圆形、几何形、继承等,涉及到“可替代性”,OOP中的一个强有力的概念

5、对象具有状态、行为、标识,每一个对象在内存中都有一个唯一的地址

1.2 每个对象都有一个接口

1、class表示数据类型,具有相同特性和行为的对象的集合

2、面向对象程序设计的挑战之一,在问题空间的元素和解空间的对象之间创建一对一的映射

3、向对象发送请求,比如说调用某方法,此过程称为:发送消息。对象得到消息后执行相应的代码

4、定义一个对象的引用,new方法创建对象,用.某方法来发送请求

5、每个对象都有一个接口:每个对象都要实现一些行为,而接口给对象定义好了这些行为,接口确定了这些行为

1.3 每个对象都提供服务

1、去创建(最好是在现有的代码库中寻找)能够提供理想的服务来解决问题的一系列对象:通俗的理解,比如去寻找好用的API或者第三方库

2、将过多的功能放在一个对象中是不好的,每个对象都应该去很好的完成一项任务

1.4 被隐藏的具体实现

1、程序员分为两类:类创建者和客户端程序员,类创建者的目标是为了构建类,客户端程序员的目标是收集各种类用来快速开发,这个定义让我感觉豁然开朗,很好的形容了程序员的情况

2、简单的说,我写了一个第三方库,一些东西不希望用这个库的人来随便更改,改坏了咋整

3、访问控制存在的原因

  1. 让客户端程序员无法触及他们不应该触及的部分
  2. 库设计者改变类内部的工作方式而不用担心影响到客户端程序员

4、访问修饰:

  1. public紧随其后的元素对任何人都是可用的
  2. protected比包访问权限多了个继承的子类可以访问
  3. default什么都没有,包访问权限,仅限本包访问
  4. private表示除类型创建者和类型内部的方法之外的任何人都不能访问

1.5 复用具体实现

1、一个类中拥有多个不同的对象,使用现有的类合成新的类,这种概念称为组合,一般在构造方法中new一个实例

2、组合是动态发生的,称为聚合,一般在构造方法传参或者set方法注入到对象中

1.6 继承

1、创建了一个类,另一个新类与其有相似的功能,通过继承很好的就可以实现

2、举个例子,几何形是基类,都有尺寸、颜色、位置等属性,都有移动、着色等方法,在此基础上可以继承出正方形、三角形、圆形等,现有的类相当于拥有基类所拥有的一切,可以调用基类的属性、方法

3、两种方法可以使基类和子类产生差异:

  1. 在子类中添加新方法
  2. 在子类中重写(覆盖:overriding)基类的方法

1.6.1 “是一个”和“像是一个”的关系

1、是一个:只去覆盖基类的方法,不添加新方法

2、像是一个:不光去覆盖基类的方法,还添加了新方法

1.7 伴随多态的互换对象

1、这个说了半天就说了一个多态,在某个方法参数中传入基类对象,调用那些基类方法

2、当我们在方法中传入对应的子类对象,就会去执行子类所覆盖的方法

3、多态是很神奇的,不用书中的例子,我类比一个例子吧:

  1. 库里、科比、艾弗森都继承自运动员,但是他们的投篮和变向都是完全不同的,都会去重写基类的两个方法的
  2. 库里被doSomething看作是一个运动员,doSomething调用运动员的任何方法(本书常说发送消息),库里都会接受到
  3. 把库里看作是运动员的这个过程,称为向上转型
  4. 这里不是去判断,如果你是库里,请这样做,如果你是科比请那样做,那会非常杂乱不堪
  5. 而是告诉你,你是一个篮球运动员,我知道你可以投篮和变向,那么去做吧
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、对容器有所选择,原因有二:

  1. 不同的容器提供了不同的接口和行为,某种容器提供的解决方案可能比其他容器灵活的多
  2. 不同容器对某些操作有不同的效率,ArrryList和LinkedList的区别
  • ArrayList随机访问一个元素是固定的时间,而LinkedList则是越靠近表尾花费时间越长
  • ArrayList插入和删除操作花费时间较长,而插入删除操作LinkedList花费的时间是固定的

1.9.1 参数化类型

1、也就是我们所说的范型,指定类型,比如List<String> list = new ArrayList<>();

2、没啥说的了,就这样吧,哈哈

1.10 对象的创建和生命周期

1、说的还是一个Java垃圾回收的问题:

  1. C++通过编程的方式来确定何时销毁对象
  2. 而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还是其他编程语言,做好衡量

猜你喜欢

转载自blog.csdn.net/pengbo6665631/article/details/81784248