写在前面java
从事Java开发快三年了,从SE程序写到EE程序,对Java语言的理解确定与三年前不一样。随着理解的加深,对Java也愈来愈敬畏。因此想忙里偷闲复习一遍《Java编程思想》这本书,当年入门时拜读,对一些东西只知其一;不知其二,跳过了一些暂时用不到的内容,重翻此书温故并知新。c++
在这里把阅读过程当中一些值得我记住的东西和本身的思考记下来,便于之后翻看,也便于与各位探讨。编程
2.1数组
做者在注解中写到“我曾经读到的一本书说:‘Java所支持的按址传递是彻底错误的’,由于Java对象标识符其实是对象的引用’,而且他接着说任何事物都是按值传递的。”oracle
这句话有些拗口,推测是翻译的问题。我从前看过一个简洁的说法与之契合(出处忘记了,对原做者表示抱歉):Java传递的是引用的值。即传递时是将对象的引用复制了一份,对象仍是那个对象,没有多,只是多了一个指向它的引用。我比较赞同这种观点。spa
2.2.net
本节与上一节给出了两种初始化字符串的形式:翻译
二者的比较让我联想到Java常量池:第一种引用指向了一个字符串常量,它在Java常量池中;而第二种引用指向了一个字符串对象。因此用 == 比较二者结果是false。code
相应的:orm
String s0 = "asdf"; String s1 = "asdf"; String s2 = "as" + "df";
s0 == s1结果为true, s1 == s2 结果为true。由于三个引用都指向了常量池中的同一个字符串常量。而
String s0 = "asdf"; String s1 = new String("asdf"); String s2 = "as" + new String("df");
s0 == s1结果为false,s1 == s2结果为false,s0 == s2结果为false。由于s1和s2没法再编译期间肯定,因此它们是单独的字符串对象。
本节中可总结出这样的表述:Java的基本类型和引用存放在Java的堆栈中。
同时Java的对象都在Java堆内存中。
基本类型的相关总结:
Java提供了两个用于高精度计算的类:BigInteger和BigDecimal。分别支持任意精度的整数的定点数。注意这里BigDecimal是定点数,关于定点数和浮点数的区别:
定点数小数点固定的位于实数中间的某个位置。
浮点数 用科学计数法表达实数,由尾数、基数和指数以及正负号组成。Java平台上的浮点数类型float和double采纳了IEEE 754标准中所定义的单精度32位浮点数和双精度64位浮点数的格式。第一个域占1位是符号域,0表示整数、1表示负数。第二个域是指数域,单精度为8位,双精度为11位。因为指数既要表示正数又要表示负数,因此在无符号表示法上加入误差,单精度为12七、双精度为1023,以单精度为例,8位能够表达0到255之间的数,减去误差127获得指数的范围是-127~128。第三个域为尾数域,单精度23位、双精度52位。IEEE标准要求尾数小数点左侧必须为1(由于是二进制),因此保存尾数时省略这个1。基数不用保存由于是2。
BigDecimal的实现:BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成。若是为零或正数,则标度是小数点后的位数。若是为负数,则将该数的非标度值乘以 10 的负 scale 次幂。
这里为何说BigDecimal是定点数不得而知。
建立一个数组对象时,若是元素是引用则会被置为null,若是是基础类型,则会被自动初始化为0。
2.3
在c++中有较大做用域的变量隐藏起来的作法,Java不容许这样的作法。
2.4
若类的某个成员是基本数据类型,即便没有进行初始化,Java会给它赋予一个默认值。大多说数据类型是0,boolean是false,而char是'\u0000', 在书中的表格里'\u0000'的用括号标注为null,在程序里使用其实它是一个空格;
注意默认初始化只适用于类的变量而不适用于方法中的局部变量。若是在方法中定义基本类型不初始化直接使用编译器会报错。
2.5
字符串中的每一个字符的尺寸都是两个字节,以此来提供对Unicode字符集的支持。
2.7
System.getProperties().list()
获取全部环境变量属性,并输出到PrintStream或PrintWriter的对象中。
2.8
IBM的jikes编译器也是一种经常使用的javac编译器
2.8.2小节的第一段话有点别扭,用本身的话总结一下:javadoc注释中有两种内容:第一,直接嵌入HTML中的内容;第二,文档标签,文档标签以@字符开头,若是文档标签独占一行,则须要@在行开头(不算表示注释的*),若是不独占一行,则须要将文档标签用花括号括起来(包括@)。
javadoc只能为public何protected成员进行文档注释,private和默认访问的成员的注释会被忽略。能够在使用javadoc时添加-private参数将private成员的注释也包括在内。
在javadoc注释中可使用HTML标签,以便控制生成的HTML格式,可是不要使用标题标签例如<h1>或<hr>,由于这会和javadoc本身插入的标题冲突。
书中介绍的一些文档标签:
(1)@see 引用其余类的文档,格式:
@see classname
@see fully-qualified-classname
@see fully-qualified-classname#method-name
生成文档时会加入一个具备超连接的See Also条目,可是javadoc不会检查超连接是否有效;
(2){@link package.class#member label}
该标签与@see类似,只用于行内,用label做为超连接的文本而不是See Also
(3){@docRoot}
生成到文档根目录的相对路径,用于文档树页面的显示超连接
(4){@inheritDoc}
从当前这个类的直接基类中继承相关文档到当前的文档注释中。
(5)@version version-information
version-information是任何包含在版本说明中的重要信息。若是javadoc命令使用了-version参数,则从生成的HTML文档中特别提取出版本信息。
(6)@author author-information
包含做者信息,javadoc一样有-author参数。可使用多个标签以便列出全部做者,可是它们必须连续放置。所有做者信息会合并到同一段落。
(7)@since
指定程序代码最先使用的版本
(8)@param parameter-name description
参数的描述
(9)@return
返回值的描述
(10)@throws
该方法抛出异常的说明
(11)@deprecated
表示一些旧特性已由改进的新特性取代,建议用户不要再使用这些旧特性。
/Output标签那段话不是很明白,应该是与以前提到的做者本身实现的doclets相关。有没有筒子能解释一下呢?谢谢。