《java编程思想》读书笔记——第一章1.1抽象的进步(抽象、面向对象、多态)

写在最前面

这是一本在不同的时间段去读同一页书也会产生不同的感想和理解,但是又讲的深入浅出的优秀读物,在此我想写下我的读书笔记,以供自己和他人复习,学习时方便理解

第一章:对象入门

引言

面向对象概念的引入,总的来说,是设计思想的进步,不论是对于设计者还是编程者来说,编码都更加简洁高效
你应该知道,一个完整的oop语言一般包括:
一套完整的语法(你该按什么规则编写)、一个编译器(把你的话翻译成机器能看的懂的玩意)、以及其丰富的类库(也就是那些高复用性的类,比如Map,String等)
这其中设计出一个高复用性,合理的类并不是简单的事情,因而,程序员大体可以分为两类:

  • 专门设计,完善共用的类库的专家们
  • 运用现有类库所提供的对象,解决应用问题
    本章,所要介绍的核心为:
    1.介绍java的设计思想,即,如何像专家们一样可以设计出优秀的类
    2.并从概念出发,讲解“何为对象”

1.1:抽象的进步

1.首先,何为抽象?
简而言之,将复杂的问题用简单的方式表达,即为抽象,更为学术的描述则是:将问题空间中的问题,转化为方案空间的建模,即是抽象

2.其次,何为抽象的进步?
可以说,抽象的种类与质量,直接决定了问题的解决效率,而其中的种类,指的则是抽象的对象,抽象的进步,即是抽象的对象的进步,对象从问题/方案,进化成了问题空间的元素自身

3.旧的抽象方式
在早期编程语言中,包含了两种解决问题的思路
一是,依照方案,对机器进行抽象,即设计出解决问题的方案后,根据方案命令机器执行固定的步骤的命令式语言,如C语言
这种编程思路在设计时,除了代码本身的编写,还需要针对现实中的问题设计出一套优秀的方案——这一步所需要花费的时间与心力是远超正常预计的,以至于出现了一门独立的《编程方法》的科目,这样的结果显然是不能接受的
在这里插入图片描述
第二种是,根据现实中的问题本身,对机器进行抽象,即对于现实中的问题一一对应的编写方法的表处理式语言,如APL
相对第一种语言,他并不需要我们单独设计出方案,而是直接对现实中的问题一一写出其对应的方法,自然其灵活性低至令人难以接受
在这里插入图片描述

4.新的抽象方式的出现
旧的设计模式,其抽象的本质都是
我们人为的提取出问题/设计出方案,再依照它们,设计出机器所需要做的行为,我们对这些行为进行抽象,编写代码,本质上,这些语言的抽象对象,是机器的行为
而面向对象类型的语言,其设计思路是:如果我们在代码中定义一个新类型的变量,令其拥有特征行为,是否就可以用来描述现实中的元素?
答案是肯定的,我们称呼这些变量现实中我们需要描述的元素为对象,继而,这种语言被称为面向对象语言

5.面向对象语言的详细定义
我们已经明白了面向对象语言为何,如何被设计出来,那么,一个规范的面向对象的语言的语法应当如何规定?
1.一切皆为对象,对象本身作为一个新型的变量,他拥有特征(数据),行为(方法),继而保存着数据,并且可以自行操作这些数据,理论上来说,任何问题的组件都可以描述为对象
2.每个对象都有自己的类型,而对象是类的实例,类的特征中最为重要的一点,可以向这个对象发送什么消息,也就是,方法的定义
3.程序本身应该是大量对象的组合,程序在运行时,本质上是各个对象之间的交互——他们通过互相发送消息,得知自己需要做什么,更加具体的,也就是调用其他对象中包含的方法
比如祖安人类希望在被创立出来时,调用键盘对象的喷人方法

class zuAnRen{
	zuAnRen(){
	jianPan jp=new jianPan();
	jp.penRen();
	}
}

可以看到啊,如果我们要吧zuAnRen给new出来,他就会去告诉键盘类,该喷人了,也就是jp.penRen();
4.对象可以封装别的对象,就像可以无限自由组合的mc一样,本质上对象的结构非常简单,但是因为可以通过封入其他对象的方式进行新对象的创建,可以达到任意高的复杂度
5.同样的类型的对象,可以接受同样的消息而这之中又隐藏了面向对象最重要的特性,比如,一个圆,它既是圆类,又是形状类,那么代码可以只考虑下达指挥形状类的命令,而圆接收到这个命令后又根据自己的具体定义来实行
比如:
代码:进入到这里的形状,告诉我你的大小!

public static getSize(Shape shape){
shape.size();
}

此时,同为形状的圆,三角(它们都继承了形状)被作为参数放了进来

public static viod main(String args[]){
Circle c =new Circle();
Trangle t =new Trangle();
getSize(c);
getSize(t);
}

那么之前getSize()方法的代码的本质就变成了:

c.size();
t.size();

也就是,不需要那些复杂的逻辑判定就可以实现,向同一个方法中放入两个不同的对象,执行各自自己应该做的方法的算法,这就是所谓的多态

发布了10 篇原创文章 · 获赞 0 · 访问量 184

猜你喜欢

转载自blog.csdn.net/qq_41445205/article/details/103801659