《JAVA编程思想》观书札记

按照书本顺序,持续的了解本书,记录下我的感受,希望能帮助自己,也希望能帮助大家,持续更新!

这篇博客中,都是我的个人理解,若理解有错误,请留言告诉我,万分感谢!

                                                                                                                          ——署名:无名氏,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引用,并不知道绑定具体的方法,它需要一个它的具体的导出类的引用,这个在运行时才能知道,也就是后期绑定

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值