Java编程思想 第一章

java编程思想:
1.1抽象过程:
类型:所抽象的是什么;
对象:我们将问题空间中的元素及其在解空间中的表示称为对象;
程序:是对象的集合,对象们通过发送消息来告知彼此所要做的;
每个对象都有自己的由其他对象所构成的存储;
每个对象都拥有其类型
某一特定类型的所有对象都可以接收同样的消息;
对象具有状态,行为,和标识;
1.2每个对象都有一个接口
类描述了具有相同特性和行为的对象的集合;
一个类就是一个数据类型;
接口确定了对某一特定对象所能发出的请求;
在程序中必须有满足这些请求的代码,这些代码和隐藏的数据一起构成了实现;
为了向对象发送消息,需要声明对象的名称,并以圆点符号连接一个消息请求;
1.3每个对象都提供服务
将对象想成服务提供者;
你的目标就是创建或者寻找能够提供理想的服务的一系列对象
高内聚是指一个软件构建组合的很好;
在良好的面向对象的设计中,每个对象都可以很好的完成一项任务,但是不试图做更多的事;
1.4 被隐藏的具体实现
类创建者 那些创建新数据类型的程序员
客户端程序员 那些在其应用中使用数据类型的类消费者
客户端程序员的目标是收集各种用来实现快速应用开发的类
类创建者的目标是构建类
让客户端程序员无法触及他们不应该触及的部分
允许库设计者可以改变类内部的工作方式而不用担心会影响到客户端程序员
访问指定词(access specifier)决定了紧跟其后被定义的东西可以被谁使用;
public表示紧随其后的元素对任何人都是可用的
private表示除类型创建者和类型的内部方法之外的任何人都不能访问的元素
protected表示紧随其后的元素只有继承的类可以访问
包访问权限:类可以访问再在一个包(库构件)中的其他类的成员,这在没有使用前面提到的任何访问指定词时候,它将发挥作用;
1.5复用具体实现
最简单的复用某个类的方式就是直接使用该类的一个对象
复用的第二种方式是将那个类的一个对象置于某个新的类中(创建一个成员对象)
新的类可以由任意数量,任意类型的其他对象以任意可以实现新的类中想要的功能的方式所组成,
也就是使用现有的类合成新的类,这种概念称为组合(composition)
如果组合是动态的发生的,就称为聚合(aggregation)
组合就是"has-a","has-a"就是组合
在建立新类时,应该首先考虑组合;
1.6继承
继承:
当发现要创建的新类和另外一个已经创建的类具有相似的功能时,
我们就以现有的类为基础,复制出一个副本,然后添加和修改这个副本来创建新的类;
基类,超类,父类:
就是上面那个已经创建的类;
导出类,继承类,子类:
就是就是那个副本经修改后的新建的类;
一个基类包含所有导出类都具有的特性和行为
创建一个基类来表示系统中某些对象的核心概念,再从基类型中导出其他类型
通过使用继承来构建一个类型层次结构,来分别表示待求解的类型
所有可以发送给基类对象的消息,同时也可以发送给导出类对象
类与基类具有相同的类型
直接在导出类中添加新方法可以使导出类和基类产生差异,但这忽视了基类或许也需要这些额外方法的可能;
基类和导出类产生差异的第二种方式是覆盖;
覆盖:
直接在导出类中创建基类中的该方法的新定义,这样,导出类使用相同的接口方法,但是导出类可以做些不同的事情;
纯粹替代/替代原则:
如果继承只覆盖基类的方法而不添加基类中没有的方法,
那么可以用一个导出类对象前去替代一个基类对象
is-a关系:
导出类和基类的替代关系就是Is-a关系;
判断是否继承,就是要确定是否可以用is-a来描述类之间的关系
扩展接口:
在导出类型中添加新的接口元素
Is-like-a关系:
扩展接口之后,新的导出类型可以替代基类,但是基类不能访问新添加的方法,
这种导出类和基类的关系:新类型具有旧类型的接口,但是还包含其他方法;
1.7伴随多态的可互换对象
一个对象调用一个方法在这里被理解成向该对象发送一个消息
当父类的一个方法被子类调用时,不管调用的子类是那种具体类型,调用后都能产生正确的行为;
比如
当Goose调用bird的move()方法,得到的结果是鹅走;
当Penguin调用bird的move()方法,得到的结果是企鹅走;
每一个对象都可以具有不同的行为表现
后期绑定
向上转型:把导出类看做是他的基类,例如,把circle看成是Shape
基类在顶部,导出来在下部散开
不知何故,被调用的的方法总是做了自己该做的
不同的导出类调用同一个方法所执行的代码是不同的
1.8单根继承结构
所有的类最终都继承自单一的基类,这个类就是Object
当要进行完全的面向对象的程序设计时,就必须构建自己的继承体系;
1.9容器
我们不知道创建这些对象需要多少空间
我们不知道解决某个特定问题需要多少个对象
容器也称为集合,比如数组就是一个容器,java中数组为集合而叫容器;
容器可以在任何需要的时候扩充自己,以容纳你置于其中的所有东西
OOP语言都有自己的容器
java语言中的容器有:List,Map(关联数组),set,队列,树,堆栈
不同容器提供了不同类型的接口和外部行为
不同容器对于某些操作具有不同的效率

第二次阅读:

1.9.1参数化类型
除非确切知道所要处理的对象的类型,否则向下转型几乎是不安全的
当从容器中取出对象引用时,必须要以某种方式记住这些对象究竟是什么类型,这样才能执行正确的向下转型
当从容器中置入对象时,会向上转型
创建一个这样的容器,让他知道自己所保存的对象的类型,从而不需要知道向下转型以消除犯错误的可能,
这种解决方案叫做参数化类型机制
通过使用参数化类型机制,编译器可以定制衣柜只接纳和取出某一种对象的容器;
参数化类型又称为泛型,用一对尖括号,中间包含类型信息;
1.10 对象的创建和生命期
在使用对象时,最关键的问题之一是他们的生成和销毁方式
每个对象为了生存都需要资源,尤其是内存
当我们不再需要一个对象时,它必须被清理掉使其占有的资源可以被释放和重用
 

猜你喜欢

转载自blog.csdn.net/weixin_42204641/article/details/83721337