Java编程思想18章读书笔记Word文档格式.docx
- 文档编号:17080175
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:33
- 大小:41.99KB
Java编程思想18章读书笔记Word文档格式.docx
《Java编程思想18章读书笔记Word文档格式.docx》由会员分享,可在线阅读,更多相关《Java编程思想18章读书笔记Word文档格式.docx(33页珍藏版)》请在冰豆网上搜索。
1、嵌入式文档(javadoc)6
2、一些标签实例6
九、代码风格7
第三章操作符8
一、更简单的打印语句8
二、使用Java操作符8
三、优先级8
四、赋值8
1、对象的别名现象8
2、方法调用中的别名问题8
五、算术操作符8
一元加减操作符8
六、自动递增和递减8
七、关系操作符8
八、逻辑操作符8
九、直接变量(literal)8
指数计数法8
十、位操作符9
十一、移位操作符9
十二、三元操作符if-else9
十三、字符串操作符+和+=9
十四、使用操作符时常犯的错误9
十五、类型转换操作符9
窄化转换9
十六、Java没有sizeof9
十七、操作符小结9
第四章流程控制10
一、true和false10
二、if-else10
三、迭代Iteration10
逗号操作符10
四、Foreach语法10
五、return10
六、break和continue10
七、臭名昭著的goto10
标签符10
八、switch11
第五章初始化与清理12
一、用构造器确保初始化12
二、方法重载12
1、区分重载方法12
2、涉及基本类型的重载12
3、以返回值区分重载方法:
Java中行不通12
三、默认构造器(缺省构造器)12
四、this关键字12
1、在构造器中调用构造器12
2、static的含义12
五、清理:
终结处理和垃圾回收12
1、finalize()用途何在13
2、你必须实施清除13
3、终结条件(termination)13
4、垃圾回收器如何工作13
六、成员初始化13
指定初始化13
七、构造器初始化14
1、初始化顺序14
2、静态数据的初始化14
3、显式的静态初始化14
4、非静态实例初始化14
八、数组初始化15
可变参数列表(JavaSE5+)15
九、枚举类型(JavaSE5+)16
十、总结16
第六章访问权限控制17
一、包:
库单元17
代码组织17
二、Java访问权限修饰词17
三、接口与实现17
四、类的访问权限17
五、总结17
第七章复用类19
一、组合语法19
二、继承语法(extends)19
1、初始化基类19
2、带参数的构造器19
三、代理(模式)19
四、结合使用组合和继承20
1、确保正确清除20
2、名字屏蔽20
五、在组合与继承之间选择20
六、protected关键字20
七、向上转型20
1、为什么称为向上转型20
2、再论组合与继承20
八、final关键字20
1、final数据20
2、final方法21
3、final类:
无法继承21
4、有关final的忠告21
九、初始化及类的加载21
继承与初始化21
十、总结22
第八章多态23
一、再论向上转型23
忘记(忽略)对象类型23
二、转机(twist曲解)23
1、方法调用绑定23
2、产生正确的行为24
3、可扩展性24
4、缺陷:
“覆盖”私有方法24
5、缺陷:
域与静态方法24
三、构造器和多态25
1、构造器的调用顺序25
2、继承与清理25
3、构造器内部的多态方法的行为25
四、协变返回类型(JavaSE5)26
五、用继承进行设计26
1、纯继承与扩展27
2、向下转型与运行时类型识别27
六、总结27
第一章对象导论
一、抽象过程
Smalltalk的五个基本特性:
1.万物皆为对象;
2.程序是对象的集合,它们彼此通过发送消息来调用对方;
3.每个对象都有自己的存储空间(独立内存),可容纳其他对象(Eachobjecthasitsownmemorymadeupofotherobjects);
(组成新对象)
4.每个对象都拥有其类型(Type);
(某个类的实例Instance)
5.某一特定类型的所有对象都可以接收(Receive)同样的消息。
这种“可替代性(substitutability)”是OOP中最强有力的概念之一。
Booch提出了一个对对象的更加简洁的描述:
对象拥有状态(State)、行为(Behaviour)和标识(Identity)。
这意味着每一个对象都可以拥有内部数据(它们给出了该对象的状态)和方法(它们产生行为),并且每一个对象都可以唯一地与其他对象相区分开,具体说来,就是每一个对象在内存中都有一个唯一的地址。
二、每个对象都有一个接口
接口定义能够对某一特定对象发出的请求。
三、每个对象都提供服务
对象的内聚性
四、被隐藏的具体实现
访问控制public/private/protected
五、复用具体实现
代码复用是面向对象程序设计语言所提供的最了不起的优点之一。
成员类has-a(private)
复用接口
重载Override
1、是一个(is-a)与像是一个(is-like-a)关系
用一个导出类对象来完全替代一个基类对象。
这可以被视为“纯粹替代(puresubstitution)”,通常称之为“替代法则(substitutionprinciple)”。
在某种意义上,这是一种处理继承的理想方式。
我们经常将这种情况下的基类与导出类之间的关系称为“is-a”关系。
判断是否继承,就是要确定你是否可以用is-a来描述类之间的关系,并使之具有实际意义。
有时你必须在导处类型中添加新的接口元素,这样也就扩展了接口并创建了新的类型。
这个新的类型仍然可以替代基类,但是这种替代并不完美,因为基类无法访问你新添加的方法。
这种情况我们可以描述为“is-like-a”关系。
abstractclass概念本质上是相同的→is-a
interface并不要求概念上一致→is-like-a
2、抽象基类和接口
抽象方法只能在抽象类内部创建,当该类被继承时,抽象方法必须被实现,否则继承类仍然是一个抽象类。
interface(接口)这个关键字比抽象类的概念更进了一步,它不允许有任何方法定义,可以实现多个接口。
七、伴随多态的可互换对象
把一个对象不要当作它所属的特定类型来对待,而是将其当作其基类的对象来对待。
面向对象程序设计语言使用了“后期绑定(latebinding)”的概念,当你向对象发送消息时,被调用的代码直到运行时刻才能被确定。
导出类看作是它的基类的过程称为“向上转型(upcasting)”。
八、单根继承结构Object
保证对象都具备某些功能
使垃圾回收器的实现变得容易得多
九、容器Container
List(列表)/Map(散列表、关联数组)/Set(集类,存储一类对象)
向下转型与模板/泛型(参数化类型JavaSE5+)
强制类型转换(可能异常)
泛型消除了向下转型的需求和犯错的可能
十、对象的创建、使用和生命周期
在堆栈上创建对象,编译器可以知道对象的存活时间。
确保正确清除
单根结构、堆栈→垃圾回收
垃圾回收与效率和灵活性
Java垃圾回收的代价:
垃圾回收运行时刻的开销(无法得到在运行时刻你想要得到的灵活性);
但C++编程复杂性极高(灵活性高)。
处理错误
并不是面向对象的特征,之前已经存在
十二、并发Concurrency
多线程
synchronized关键字
十三、Java与Internet
C/S
1、客户端编程
CGI(Commongatewayinterface)Perl/Python
任何形式的动态图形处理几乎都不可能被连贯地执行,因为图形交互格式(graphicinterchangeformat,GIF)的文件对每一种版本的图形都必须在服务器端创建,并发送给客户端。
2、Plug-in插件
脚本语言ECMAScript标准化JavaScript(原来是命名为了赶上Java的热潮)
3、Java
Javaapplet(目前已经淘汰)Flex(ActionScript)
ActiveX(微软)
4、Internet与Intranet(内联网)
5、服务端编程
Java为什么成功
系统易于表达、易于理解
通过类库得到最大的支持
错误处理
大型程序设计(能力)
Java与C++
简单性、性能
第二章一切都是对象
一、用引用(reference)操作对象(对象引用)
C/C++的引用:
某一变量的一个别名int&
r=i
C/C++的指针:
地址
相同点:
都是地址的概念(指针指向一块内存,它的内容是所指内存的地址;
引用是某块内存的别名)。
区别:
1.指针是一个实体,而引用仅是个别名;
2.引用使用时无需解引用(*),指针需要解引用;
3.引用只能在定义时被初始化一次,之后不可变(引用"
从一而终"
);
指针可变;
4.引用没有const,指针有const,const的指针不可变;
5.引用不能为空,指针可以为空;
6."
sizeof引用"
得到的是所指向的变量(对象)的大小,而"
sizeof指针"
得到的是指针本身(所指向的变量或对象的地址)的大小;
typeid(T)==typeid(T&
)恒为真,sizeof(T)==sizeof(T&
)恒为真,但是当引用作为成员时,其占用空间与指针相同(没找到标准的规定)。
7.指针和引用的自增(++)运算意义不一样。
从底层实现角度看,Java的引用相当于指针,但不能进行地址操作,Java的引用只能指向对象;
在语法上更接近C++的引用而不是指针。
二、必须由你创建所有对象
1、存储到哪里
寄存器、堆栈(stack)(对象的引用)、堆(heap)(new保存对象,比在栈中耗时)、静态存储、常量存储、非RAM存储。
基本类型
放在堆栈之中boolean/char/byte/short/int/long/float/double/void
高精度数字:
BigInteger/BigDecimal(包装器类)
3、Java中的数组(Array)
C/C++中的数组就是内存块
Java的主要目标之一就是安全性,确保数组会被初始化
三、永远不需要销毁对象
1、作用域(scoping)
在C和C++里将一个较大作用域的变量“隐藏”起来的做法,在Java里是不允许的。
因为Java设计者认为这样做会导致程序混乱。
尽管在C和C++中是合法的,但是在Java中却不能像下面这样做:
{
intx=12;
intx=96;
//不合法
}
2、对象作用域(与基本数据类型不同)
C++中一旦使用完对象后,必须要销毁对象(析构函数)。
Java使用垃圾回收器,消除“内存泄露”。
类
字段(field)(数据成员)和方法(method)(成员函数)
基本成员默认值
默认值
boolean
false
char
‘\u0000’(null)
byte
(byte)0
short
(short)0
int
0
long
0L
float
0.0f
double
0.0d
五、方法、参数和返回值
参数列表方法的参数
六、构建一个Java程序
1、名字可见性
与Internet域名相似的指定符
2、运用其他构件import
3、static关键字
数据或方法不与包含它的类的任何对象实例关联在一起(只有一份存储空间)。
七、第一个Java程序
编译和运行
八、注释和嵌入式文档
1、嵌入式文档(javadoc)
语法/***/
类、变量和方法
不要在嵌入式HTML中使用标题标签<
h1>
<
hr>
等。
2、一些标签实例
@see:
引用其他类
@see标签允许你引用其他类的文档。
javadoc会在其生成的HTML文件中,用@see标签链接到其他文档。
格式如下:
@seeclassname
@seefully-qualified-classname
@seefully-qualified-classname#method-name
每种格式都会在生成的文档中加入一个具有超链接的“SeeAlso”条目。
但是javadoc不会检查你所提供的超链接是否有效。
{@linkpackage.class#memberlabel}
该标签与@see极其相似,只是它可以用于行内,并且是用“label”作为超链接文本而不用“SeeAlso”。
{@docRoot}
该标签产生到文档根目录的相对路径,用于文档树页面的显式超链接。
{@inheritDoc}
该标签从当前这个类的最直接的基类中继承相关文档到当前的文档注释中。
@version
该标签的格式如下:
@versionversion-information
其中,“version-information”可以是任何你认为适合作为版本说明的重要信息。
如果javadoc命令行使用了“-version”标记,那么就可以从生成的HTML文档中提取出版本信息。
@author
@authorauthor-information
其中,“author-information”,望文生义你也知道,应该是你的姓名,也可以包括电子邮件地址或者其他任何适宜的信息。
如果javadoc命令行使用了“-author”标签,那么就可以从生成的HTML文档中提取作者信息。
你可以使用多个标签,以便列出所有作者,但是它们必须连续放置。
全部作者信息会合并到同一段落,置于生成的HTML中。
@since
该标签允许你指定程序代码最早使用的版本,你将会在HTMLJava文档中看到它被用来指定所用的JavaSE版本。
@param
该标签用于方法文档中,形式如下:
@paramparameter-namedescription
其中,“parameter-name”是方法的参数列表中的标识符,“description”的文本可延续数行,终止于新的文档标签出现之前。
你可以使用任意数量的此标签,大约每个参数都有一个这样的标签。
@return
该标签用于方法文档,格式如下:
@returndescription
其中,“description”用来描述返回值的含义,可以延续数行。
@throws
“异常”(Exception)将在第9章论述。
简言之,它们是由于某个方法调用失败而“抛出”的对象。
尽管在调用一个方法时,只有出现一个异常对象,但是某个特殊方法可能会产生任意多、不同类型的异常,所有这些异常都需要进行说明。
所以,异常标签的格式如下:
@throwsfully-qualified-class-namedescription
其中,“fully-qualified-class-name”给出了一个异常类的完整名字,而且该异常类已经在某处定义过。
而“description”(同样可以延续数行)告诉你为什么此特殊类型的异常会在方法调用中出现。
@deprecated
该标签用于指出一些旧特性已由改进的新特性所取代,建议用户不要再使用这些旧特性,因为在不久的将来,它们很可能会被移除。
如果使用一个标记为@deprecated的方法,则会引起编译器的警告。
九、代码风格
驼峰风格:
类名(首字母大写)和其他所有内容(首字母小写)。
第三章操作符
一、更简单的打印语句
静态导入importstatic...
二、使用Java操作符
与其它语言类似
三、优先级
四、赋值
1、对象的别名现象
是Java操作对象的基本方式。
Tankt1=newTank();
Tankt2=newTank();
t2=t1;
2、方法调用中的别名问题
将一个对象传递给方法时
五、算术操作符
+-*/%
1/0.0得正无穷(Double.POSITIVE_INFINITY)
一元加减操作符
x=a*-b;
六、自动递增和递减
++--前缀式和后缀式
七、关系操作符
>
<
=>
===!
=(true/false)
比较对象引用:
equals
自己的类中要重载equals方法
八、逻辑操作符
&
||!
(true/false)只可应用于布尔值
“短路”现象
九、直接变量(literal)
十六进制0xFF...
指数计数法
1.39e-47其中e是10。
早期FORTRAN(面向科学与工程领域)语言的时候e为大写的E(10的次幂),当时老式设备只能表示大写E(Exponential),不会与自然对数的底数e冲突,后来渐渐引入小写字母,则用e表示10的次幂。
这种惯例在C、C++和Java中保留了下来。
若要取自然对数的底数e,使用Math.E。
十、位操作符
|^(异或)~(取反)
十一、移位操作符
>
(“无符号”右移,高位补0)
十二、三元操作符if-else
boolean-exp?
value0:
value1
十三、字符串操作符+和+=
String后跟+和基本类型变量,基本类型变量转化为字符串Integer.toString()
十四、使用操作符时常犯的错误
==和=&
和&
在Java中会编译报错(布尔型例外)
使用括号(优先级)
十五、类型转换操作符
窄化转换
显式地进行转换,可能会丢失信息
这在C/C++中很麻烦
“类”数据类型不允许进行类型转换,字符串是特殊的情况
十六、Java没有sizeof
C/C++中的sizeof主要是为了移植性
十七、操作符小结
布尔值只能赋予true和false,并测试它为真还是假,不能进行布尔值相加,或者对布尔值进行其它任何运算。
char、byte和short使用算术操作符中的数据类型提升(都会获得int结果,窄化转换为原类型可能丢失信息)。
但int相乘有可能溢出,编译器并不报错,也不抛出异常。
第四章流程控制
一、true和false
不允许把数字作为布尔值使用
二、if-else
三、迭代Iteration
while/do-while/for迭代语句,起控制作用的是布尔表达式。
对于像C那样的传统的过程型语言,要求所有变量都在一个块的开头定义。
以便编译器在创建这个块的时候,可以为那些变量分配空间。
而在Java和C++中,则可在整个块的范围内分散变量声明,在真正需要的地方才加以定义。
这样便可形成更自然的编码风格,也更易理解。
逗号操作符
Java中唯一用到的地方是用在for循环中,语句是顺序执行的。
for(inti=0,j=0;
i<
10;
i++,j++)
四、Foreach语法
可以用于任何Iterable的对象
五、return
void方法有隐式的return;
六、break和continue
for(;
;
)或while(true)
七、臭名昭著的goto
标签符
label1:
outer-iteration{
inner-iteration{
//...
break;
continue;
continuelabel1;
//....
breaklabel1;
}
Java里需要使用标签的唯一理由是有循环嵌套。
八、switch
default/break
enum与switch协调工作
Math.random()产生[0,1)的随机数
第五章初始化与清理
一、用构造器确保初始化
C++引入了“构造器”的概念,Java中也采用了构造器,并额外提供了“垃圾回收器”。
构造函数:
它没有返回值,与返回值为空(void)明显不同。
二、方法重载
1、区分重载方法
都必须有一个独一无二的参数列表。
2、涉及基本类型的重载
常数值(如5)被当做int值处理,如果有某个重载方法接受int参数,它就会被调用。
至于其他情况,如果传入的数据类型(实际参数类型)小于方法中声明的参数类型,实际参数类型就会被提升。
char型略有不同,如果无法找到恰好接受char参数的方法,就会把char直接提升为int型。
如果传入的实参较大,你就得在圆括号里写上类型名称,来执行窄化转换,否则编译器会报错。
Java中行不通
有时调用函数会忽略返回值。
三、默认构造器(缺省构造器)
如果类中没有构造器,编译器会自动帮你创建一个缺省构造器。
四、this关键字
方法内部获得当前对象的引用(编译器传入)。
this关键字只能在方法内部调用,表示对“调用方法的那个对象”的引用。
1、在构造器中调用构造器
用this(...)调用构造器,但不能同时调用两个,且调用必须置于最起始处。
2、static的含义
没有this的方法
static方法内部不能调用非静态方法。
终结处理和垃圾回收
C++中的析构函数,C++中销毁对象必须用到这个函数,而Java中的finalize()并不是“析构函数”。
C++中对象一定会被销毁,而Java中对象并非总被“垃圾回收”,换句话说:
(1)对象可能不被回收;
(2)垃圾回收并
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 编程 思想 18 读书笔记