按照书本顺序,持续的了解本书,记录下我的感受,希望能帮助自己,也希望能帮助大家,持续更新!
这篇博客中,都是我的个人理解,若理解有错误,请留言告诉我,万分感谢!
——署名:无名氏,2019/04/05
- 记录点滴,汇聚成流,不忙日更,忙就几日更.(不超三天)
第一章.对象导论
第一章,很抽象,不建议新手阅读,感觉自己jJAVA水平不高的请跳过本章,对后续使用没有影响,但是在最后请回来看本章.
不了解这些概念,你不会明白JAVA到底是怎么实现实际操作的
第一难点:什么是抽象?
百度百科:
抽象是通过分析与综合的途径,运用概念在人脑中再现对象的质和本质的方法,分为质的抽象和本质的抽象。分析形成质的抽象,综合形成本质的抽象(也叫具体的抽象)。作为科学体系出发点和人对事物完整的认识,只能是本质的抽象(具体的抽象)。质的抽象只能是本质的抽象中的一个环节,不能作为完整的认识,更不能作为科学体系的出发点
抽象是决定事物性质的概念,事物的性质会随着抽象概念的改变而改变。(按说文解字来说就是“从众多意象中抽取意象”)
很难理解有没有?
我查询各种资料后的理解:抽掉了形象,留下了一个概念
比如这个。没有了形象,但是你依然知道他看起来像个人,概念还在,你依然还能理解.
1.1抽象过程
想象一下,
第二难点:什么是对象?
生活中实际的事物,东西,就是对象.所以我们会存在万物皆对象的说法.比如你现在手边的手机,鼠标,电脑...他们都是对象.
第三难点:什么是类?
我们把实际的东西,对象拿到程序之中就形成了类,这就是一个抽象的过程,把实际存在的东西给变成了不实际存在的东西.
举个简单例子:生活中,我们有燕子,画眉鸟,啄木鸟,麻雀,总结他们所共有的常见的特征(都有翅膀,都会飞,都有脚,体型都很小),形成一
个类,就叫鸟类(这其实就是一个抽象过程).然后把这个得到的鸟类抽象到程序之中,我们使用class关键字来代替类,于是鸟类就成为
了——>class birds,于是class就产生了,它就是类.我们生活中的所有事物都是一个对象都有他的类.手机属于电子产品类.《JAVA编
程思想》属于书类class book,可乐属于水类class water.
这就是为什么会产生面向对象编程的概念,一切都是对象,都属于某个类,我在程序之中都能声明这个类class.
这里描述了如何把生活中的一个实际的类,给抽象到我的程序之中,以后将会提到,如何对它进行操作.
1.2每个对象都有一个接口
这里我认为书上讲的非常好,看书即可
昨天讲述了类,对象的概念,今天要明白类,对象,属性的关系
1.对象属于类,属性又属于对象
还是昨天的例子:鸟类class(在JAVA中我们称class为数据类型).
现在我有了鸟类,但是,你能发送请求,让鸟类去干某件事吗?显然不行,但是,如果是一个麻雀呢?
类它是一个抽象的概念没有具体实体,你无法对一个概念性东西下达命令,所以我就需要给他创建出实体,即实例化一个对象出来————麻雀,
Java中语法:Birds smallWhite= new Birds();
注意:
这里的smallWhite并不是它的实体,只是它的一个引用,什么意思呢?
smallWhite就相当于你给小鸟起的名字,想象一下,如果所有人都没了名字,你让别人干事会怎么说?(诶,那边那个长的英俊潇洒的同学,你过来帮我个忙,别人怎么知道你在找他,说不定会有一堆人过来)
因此名字就产生了,你再找别人帮忙,就可以说(诶,小明,帮我个忙.是不是简单很多!)
我们这里的smallWhite也是这样,是个名称,实体在你使用 new 关键字的时候就已经创建了 (存在于内存中的堆之中,以后会提到),但是,你想让他去帮你干事,你却用不了他,因为他没名字,所以才会有smallWhite的产生.
我们想让它去干事就是使用 '点' ,来告诉这个有名字的实体对象(发送请求),你应该去干某事.
先使用 new 创建一个 名字叫smallWhite的小鸟,然后
smallWhite.eatFood() 想象你在说: 嘿,那个叫小白的小鸟,你该去吃饭了!!
smallWhite.feet=2; 小白你应该有两条腿!
1.3每个对象都提供服务
我的理解:对象就是我们的现实实体,书中让我们理解为“服务的提供者”,具有很多功能,我认为这不冲突,我么可以自定义一个对象所具有的功能.
一个class就是一个服务提供者的共同特性(People),它提供我们多种服务(transfer...),通过new来实例化一个功能提供者(people01),通过" 点 "来调用他的服务(people01.transfer()——第一个人具有翻译功能)(提问:现在,我告诉你有第二个人,他的写作水平很高,你知道该怎么让他来帮你写作吗?)
1.4被隐藏的具体实现
他首先介绍了什么是类创建者 和 客户端程序员,简单就可以理解为,
类的创建者:我构造一个类出来,并且我自定义这个类具有哪些功能,让别人可以使用这些功能
客户端程序员:我使用_类创建者_创造出来的类,使用它的功能,完成我所需的目标,
那么问题就出来了,我创建了这个类出来有些属性和方法我是不能让你来改变的,
举例:我现在自定义一个鸟类,然后我认为鸟有三条腿,但是你认为鸟就应该是两条腿,我又希望你不能改变这个"我定义的事实",出现了这种需求:
我不希望你改变我定义的事实,
关键字诞生:private,protected,以及public
这些访问权限范围是多大,书上都定义很清楚,随着深入学习,很多东西才能了解.
1.5代码复用的具体实现
代码复用:组合与继承;
组合与继承的区别:
组合是内部类,像是 汽车拥有引擎一样,只被该量汽车所使用;继承和内部类很相似,但是考虑到代码的重用.把他独立出来,
像布谷鸟类继承鸟类,可以继承鸟类的公共特性,但是你实例化一辆奔驰车出来,我的奔驰车需要一个引擎类,你打算独立出去使用继承吗?显然,不科学,因为这个引擎只有我才能用,别人都用不了,于是就安排在内部类,成为组合方式.
简单理解就是根据经验判断,你想让这个类变为组合还是继承,考虑它的范围是多大,公共特性广不广,能不能被反复的调用使用,如果可以就考虑继承,否则考虑组合.
举例:
英国短毛猫类,波斯猫类,加菲猫类...都可以继承自猫类;
引擎类,车轮类,玻璃类,车门类...组成了汽车类;
1.6继承
书上讲的很好,看书即可
使父类,子类产生差异的方式:
1.子类直接添加新方法
2.子类中重新定义父类方法——>覆盖
1.6.1 引入 "is-a"和"is-like-a"
什么是纯粹替代?
导出类可以代替基类,只覆盖了基类的方法,关键是没有添加新的方法.这样就是"is-a",
"is-like-a"导出类会添加新的方法.(看完之后我就是这么想的,但是问题就来了)
这里的理解非常困难,因为看完书上的例子感觉自己懂了,但是自己举个例子,情况又不对了
例如:
"is-a"大众车是一辆车,这没什么;
"is-like-a"我给兰博基尼车添加新方法"氮气推进",这里怎么说??兰博基尼车像一辆车?我看不对吧,他明明就是一辆车,所以概念这种东西非常难理解,
我只能这样理解:我原来定义的车类实际上是一个普通车类,但是我们人为的把他的概念扩大化形成一个车类,
车类中含有"氮气推进方法",普通车类不含有.
于是:大众车是车类,兰博基尼车是车类.大众车是普通车类,兰博基尼车像一个普通车类.
简单的说就是我们没有理解好一个类该有的属性,方法的范围.其实上例是三层的继承关系.理解好一个类的该有的范围,不要自己认为的它具有某种方法(普通车类不会氮气推进),
这样理解可能还简单点.
举例:
以鸟类为例,我定义 基类——鸟类,然后添加 飞行方法——低空飞行
然后 声明 鸟类1 extends 鸟类 重写 飞行方法——高空翱翔,
这里 鸟类1 可以替代原基类鸟类 只是飞行方法不同而已,于是就成为"is-a"关系, 鸟类1 是一个 鸟类
现在我 声明 鸟类2 extends 鸟类 添加新方法 游泳方法——高速移动
这里 鸟类2 可以替代原基类鸟类 但是他又不像原来的鸟类一样,因为他比他们高级,他会游泳,
"is-like-a"所以只能说 鸟类2 像一个 鸟类.
1.7伴随多态的可互换对象
难点又来了,不瞒你们说,这本书我在初学JAVA的时候就已经买了,大概基础内容学完之后来看这本书的,当时,我已经看过200多页了.现在这里我又看一边,后面的向上转型我知道,前面这都是啥?什么东西?看完我头都大,休息一下,等下回来再看.......
再次建议初学者请跳过本书,主要这本书是翻译过来的很多寓意和中国可能不同,看起来简直了,总之,,头大,语言晦涩.
我看的不是很明白,标注一下,以后知识多了,回来再看
感觉就是讲多态很方便,多态让我们处理大致,而不需要处理细节.然后向上转型,子类找不到正确的属性方法,就会向上转型
1.8单根继承结构
Java中所有的类都继承自一个最基本的类(Object类).这个类定义了一些功能,属性方法,单根继承结构保证了对象具有某些基本操作,方便垃圾回收(这里描述的有点少)
1.9容器
Java中容器也叫集合,它也是一个类,是用来帮助我们存储对象的.并且管理对象的生命周期
为什么要用容器来存储对象?
第一段描述的很好,看书即可.
容器会帮我们处理细节,比如我们存储多少对象进入容器,什么时候扩充这个容器,这本来都是很麻烦的事情.但是容器帮助我们全都做完了这些事,我们只需关心怎么在合适的时候使用合理的容器,每个容器都有自己的特性
细节的东西,现在不描述,以后会讨论到.现在明白容器这个概念就可以
1.9.1参数化类型
我们常叫他泛型,那么他是什么呢?
联系之前的容器概念和单根继承概念.Java SE1.5之前容器设计的不完善,他只能存储Object类型的对象,数据...存入进去没什么问题,向上转型,父类的方法依然可以成立,但是取出的时候我们不得不向下转型为原来的类型,这就很麻烦,我们需要记住存入的数据类型,为了解决这种麻烦,我们定义了泛型.
使用<>来表示, <>里面规定我们要存储的参数的类型,也就是类的类型例如:List<Student> 在这个List集合之中,我只能存储类型为Student的对象
1.10-1.11-1.12我本来花了两个多小时写的,结果不明原因卡住了,全部丢失了,难受.就这样吧,下午还要学别的东西.
想看的话,我再回来补上.没人就算了.我以后先写Word,再转移上来.5555....
1.13Java与Internet
设计知识面较广,了解即可.
1.14总结
面向过程编程比面向对象编程要麻烦的多,而且也难于理解,就是在讲OOP语言优势
第二章.一切都是对象
2.1用引用保存对象
引用:操纵对象的标识符,我们表面上操作引用,实际上是操作对象
2.2必须由你创建对象
2.2.1存储到什么地方
这里只讲了存到什么地方,但是没有说怎么存储,应该以后会讲到
1.寄存器__处理器内部(速度最快)
2.堆栈__RAM中
3.堆__RAM中
区别,堆栈需要知道什么周期,为了便于移动指针,堆中可以不必知道,而且堆栈比堆快速
4.常量__存储在代码内部
5.非RAM存储__转化为流对象或者持久化对象,这两个对象都是数据传递的媒介,需要时可以再转化为基于RAM存储
2.2.2特例:基本类型
基本类型和基本类型的包装器类,一个在堆栈,一个在堆中,
比较易于理解的内容不发了,看书即可
2.2.3对象的作用域
new创建对象时,由垃圾回收器监视这些对象,作用域结束,对象的引用就会被销毁,一旦引用销毁,就销毁对象,解决了内存泄漏问题
2.4类
成员变量是会自动给基本类型赋予初始值,但是全局变量不会,还有局部变量也不会.
总结下来就是只有类的某个字段会被赋予初始值,不包括类中定义方法的成员变量.
2.6.3static关键字
特点(为什么使用static关键字): static 声明的东西只有单一存储空间(字段,方法,类),另外我们希望不通过实例化这个类,也能调用类中的方法.
第五章.初始化与清理
5.1用构造器确保初始化
首先,假设没有构造器我们想使用一个对象应该怎么做?
对象使用流程:声明对象,初始化对象,使用对象.(这是一个树,这个树有3米高,这个树能帮我...各种树能实现的功能)
对象使用的前提就是初始化,(这很好理解,比如全局变量没有给他初始值int a;,即没有初始化int a = 0;编译器器就会报错,同理对象没有初始化也会报错)但是你在使用JAVA时候并没有感觉好像要给创建出来的对象初始化,这是因为Java自动帮助我们完成了.
基本类型初始化就是赋予初始值:int a = 0;
对象的初始化要求我们在类中定义一个方法initialize(),然后在使用的时候,第一步只能先使用这个方法进行初始化
那么问题又出来了,我每次使用对象都要先初始化,烦死了,每次操作都一样,你帮我干了行不行?(前面也只是一个举例)
当然可以,优化之后就变成了Java自动帮助我们在使用对象的时候调用初始化方法( initialized() ),并且给这个方法改名 构造方法(构造器) Java帮你实现自动调用这个方法,(方法名称与类名相同)
默认构造器那啥的我就不说了,应该都能看懂
5.4 this关键字
这里实际上比较难懂,而且也不好描述,书上描述多看几遍就好
第八章,多态
8.1再论向上转型
这里主要是给它给出的例子先看懂怎么运行的,在理解就容易了.
向上转型产生的原因就是:使用向上转型可以简化我们的操作,不用给每个导出类都写一个相同的方法,只需在基类写一次即可.
8.2转机
8.2.1
方法前期绑定,对于Instument引用,并不知道绑定具体的方法,它需要一个它的具体的导出类的引用,这个在运行时才能知道,也就是后期绑定