《Java编程思想》第四版读书笔记 第二章

写在前面java

从事Java开发快三年了,从SE程序写到EE程序,对Java语言的理解确定与三年前不一样。随着理解的加深,对Java也愈来愈敬畏。因此想忙里偷闲复习一遍《Java编程思想》这本书,当年入门时拜读,对一些东西只知其一;不知其二,跳过了一些暂时用不到的内容,重翻此书温故并知新。c++

在这里把阅读过程当中一些值得我记住的东西和本身的思考记下来,便于之后翻看,也便于与各位探讨。编程

2.1数组

做者在注解中写到“我曾经读到的一本书说:‘Java所支持的按址传递是彻底错误的’,由于Java对象标识符其实是对象的引用’,而且他接着说任何事物都是按值传递的。”oracle

这句话有些拗口,推测是翻译的问题。我从前看过一个简洁的说法与之契合(出处忘记了,对原做者表示抱歉):Java传递的是引用的值。即传递时是将对象的引用复制了一份,对象仍是那个对象,没有多,只是多了一个指向它的引用。我比较赞同这种观点。spa

2.2.net

本节与上一节给出了两种初始化字符串的形式:翻译

  1. String s = "asdf";
  2. String s = new String("asdf");

二者的比较让我联想到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堆内存中。

 

基本类型的相关总结:

  1. 基本类型的大小都是固定的,与os和硬件无关;
  2. 全部类型都是有符号的,Java中不存在无符号基本类型;
  3. char占两个字节(以前总忘记);
  4. boolean类型很特殊,做者说它所占存储空间的大小没有明确指定。在《JVM虚拟机规范》一书中提到,字节码中对boolean类型支持有限而且没有该类型,在字节码中将其转换为int,同时oracle的虚拟机实现将boolean数组转换成byte数组。这里就有个问题,反编译时如何肯定是boolean类型呢?有待研究。

 

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相关。有没有筒子能解释一下呢?谢谢。

相关文章
相关标签/搜索