《Java核心技术 卷一》(第十版)读书笔记

第一章 Java程序设计概述

Java的特性

简单性

  Java没有诸如C++一样的头文件、指针、结构、联合、虚基类、操作符重载一类的东西,但是C++的许多特性在Java中仍有应用。

面向对象

  面向对象设计是一种程序设计技术。它将重点放在对象与对象的接口上。Java与C++的主要不同点就在于多重继承,在Java中,取而代之的是更为简单的接口概念。

分布式

  Java有一个丰富的例程库,用于处理想HTTP和FTP之类的TCP/IP协议。Java程序能够通过URL打开和访问网络上的对象。

健壮性

  Java投入了大量的精力进行早期的问题检测,后期动态的(运行时)检测,并消除了容易出错的情况······Java和C++最大的不同在于Java采用的指针模型可以消除重写和损坏数据的可能性。

安全性

  Java适用于网络/分布式环境,在安全方面投入了很大精力,使用Java可以构建防病毒,防篡改的系统。它能够防范诸如运行时堆栈溢出、破坏自己的进程空间之外的内存、未经授权读写文件等攻击。

体系结构中立

  编译器编译源码生成与特定的计算机体系结构无关的字节码,字节码又可通过任意计算机上的解释器来执行,其还可以动态的翻译为本地机器代码。

可移植性

  在Java中,数据类型具有固定大小,这消除了代码移植时的主要问题。二进制数据以固定的格式进行存储和传输,消除了字节顺序的困扰。字符串是标准的Unicode格式存储的。除了与用户界面有关的部分外,所有其他Java库都能很好的支持平台独立性。

解释型

  Jaca解释器可以在任何移植了解释器的机器上执行Java字节码。

高性能

  字节码可以(在运行时刻)动态地翻译成对应运行这个应用的特定CPU的机器码。

多线程

  多线程可以带来更好的交互响应和实时行为,Java是第一个支持并发程序设计的主流语言。

动态性

  它能够适应不断发展的环境。库中可以自由地添加新方法和实例变量,而对客户端没有任何影响。

Java applet 与 Internet

  在网页中运行的Java程序称为applet。要使用applet,需要启动Java的Web浏览器执行字节码,而不需要安装任何软件。由于兼容性问题以及安全问题,applet的使用渐渐减少。

Java发展史

版本 年份 语言新特性 类与接口数量
1.0 1996 语言本身 211
1.1 1997 内部类 477
1.2 1998 strictfp修饰符 1524
1.3 2000 1840
1.4 2002 断言 2723
5.0 2004 泛型类、”for each”循环、可变元参数。自动装箱、元数据、枚举、静态导入 3279
6 2006 3793
7 2011 基于字符串的switch、钻石操作符、二进制字面量、异常处理改进 4024
8 2014 lambda表达式、包含默认方法的接口、流和日期/时间库 4240

第二章 Java程序设计环境

术语名 缩写 解释
Java Development Kit JDK 编写Java程序使用的软件
Java Runtime Environment JRE 运行Java程序的软件
Server JRE - 在服务器上运行Java程序的软件
Standard Edition SE 用于桌面或简单服务器应用的Java平台
Enterprise Edition EE 用于复杂服务器应用的Java平台
Micro Edition ME 用于手机或其他小型设备的Java平台
Java FX - 用于图形化用户界面的一个替代工具包,在Oracle的Java SE的发布版本中提供
OpenJDK - Java SE的一个免费开源实现,不包含浏览器集成或Java FX
Java 2 J2 一个过时术语,用于描述1998 ~ 2006年间的Java版本
Software Development Kit SDK 一个过时的术语,用于描述1998 ~ 2006年间的JDK
Update u Oracle术语,表示bug修正版本
Netbeans - Oracle的集成开发环境

第三章 Java的基本程序结构

一个简单的Java应用程序:

1
2
3
4
5
public class HelloWorld{
public static void main(String[] args){
System.out.println("HelloWorld");
}
}

逐行来看一下这段代码的结构

1
public class HelloWorld{···}

  关键字public 称为访问修饰符,访问修饰符用于控制程序的其他部分对这段代码的访问级别。
  关键字class表明这是一个类。
  Helloworld是类名 类名的命名规则很宽松,可以任意命名,但必须用字母作为开头,且不能使用Java保留字

1
public static void main(String[] args){···}

  main方法,Java程序的入口。根据Java语言规范,main方法必须申明为public类型

1
System.out.println("HelloWorld");

  程序语句。

注释

1
2
3
4
5
6
7
8
// 单行注释

/*




*/

数据类型

Java是一种强类型语言,意味着必须为每一个变量声明一种类型。在Java中有8种基本类型:

4种整型

类型 存储需求 取值范围
byte 1 byte -128 ~ 127
short 2 bytes -32,768 ~ 32,767
int 4 bytes -2,147,483,648 ~ 2,147,483,647
long 8 bytes -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

  长整型数值有一个后缀L或l;
  十六进制数值有一个前缀0x或0X
  八进制有一个前缀0
  从Java7开始,加上前缀0b或0B表示二进制数

2种浮点型

类型 存储需求 取值范围
float 4 bytes 大约 ±3.402,823,47E+38F(有效位数为6~7位)
double 8 bytes 大约 ±1.797,693,134,862,315,70E+308(有效位数为15位)

  float类型的数值有一个后缀f或F,没有这个后缀的浮点型数值默认为double类型。
  浮点型不适用于无法接受舍入误差的计算(如金融系统)中,应该使用BigDecimal类。

用于表示溢出和出错情况的三个特殊的浮点数值
正无穷大 负无穷大 NaN(不是一个数字)

常量Double.POSITIVE_INFINITY、Double.NEGATIVE_INFINITY和Double.NaN(以及相应类型的Float类型的常量分别表示这三个特殊的值)

注意:不能这样检测一个特定值是否等于Double.NaN:

1
if(x == Double.NaN)    // is never true

所有的“非数值”都认为是不相同的,但可以使用Double.isNaN方法检测

1
if(Double.isNaN(x))    // check whether x is "not a number"

1种字符类型

  char类型的字面常量要用单引号括起来。
  char类型的值可以表示为十六进制,其范围从\u0000到\Uffff。
  Unicode转义序列会在解析代码前得到处理。如:

1
"\u0022+\u0022"

  并不是一个由””引起来的字符串,而会转义为

1
""+""   //一个空串

  特别的,要小心注释中的\u。如:

1
// \u00A0 is a newline

  其中\u00A0会被认为是一个换行符,而不是单纯的注释文字。

一些特殊的转义序列:

转义序列 名称 Unicode值
\b 退格 \u0008
\t 制表 \u0009
\n 换行 \u000a
\r 回车 \u000d
\" 双引号 \u0022
\' 单引号 \u0027
\\ 反斜杠 \u005c

1种布尔类型

  boolean类型有两个值,false和true,用来判断逻辑条件。整型和布尔值之间不能进行相互转换。

变量

变量声明

  变量名大小写敏感。
  不可使用Java保留字作为变量名。
  变量的声明应尽可能靠近第一次使用该变量的地方。
  变量声明有许多的约定俗成的规范,相关资料可以参考《阿里巴巴Java开发手册》一类的资料,不再赘述。

常量

  在Java中,使用关键字final指示常量。关键字final表示这个变量只能被赋值一次,一旦被赋值,便不能再被更改。
  习惯上常量名使用全大写。
  如果希望某个常量能在一个类中被多个方法使用,那么可以使用static final设置一个类常量。

运算符

运算符 操作
+
-
*
/
% 取模

数值类型之间的转换

数据类型之间的合法转换
数据类型之间的合法转换

  实箭头:无信息丢失的转换。
  虚箭头:可能有精度损失的转换。

强制类型转换