笔记序言
作为一个学习Java的人怎么能不看一遍Java的Bible呢?在这之前刷过《Head First Java》,但始终觉得不够全面,而且因为是‘刷’,就没有留下任何笔记。于是趁当当搞活动马上买了一本《Thinking in Java》回来,开卷之余,顺手就写下这个笔记。翻开目录一共二十二章,暂时打算每五章发一篇笔记,因为视情况可能会跳过图形化界面的章节。
第一章 对象导论
-
访问权限关键字(access specifier) : public, private, protected
饰词 本类 同一个包的类 子类 其他类 public √ √ √ √ protected √ √ √ × default √ √ × × private √ × × × -
单根继承结构
Java中所有的类最终都继承自单一的基类(Object)。 -
对象的创建和生命周期
Java采用动态内存分配方式,通过new关键字来构建对象的动态实例(基本类型是特例),所有的对象都在堆 (Heap)中分配空间。当“垃圾回收器”的机制发现对象不再被使用时,会销毁对象,自动释放对象占用的内存。
第二章 一切都是对象
-
内存分配
(1) 寄存器:最快的存储区,位于处理器内部,根据需求进行分配,在Java中不能直接控制。
(2) 堆栈:位于通用RAM(随机访问存储器)中,堆栈指针下移分配内存,上移释放内存。存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中)。
(3) 堆:一种通用的内存池(也位于RAM区),用于存放所有的Java对象。
(4) 常量储存:常量值通常直接放在程序代码的内部,常量池存放字符串常量和基本类型常量(public static final)。
(5) 非RAM存储:储存于硬盘等永久存储空间。基本例子:流对象&持久化对象。 -
基本类型
Java每种基本类型所占存储空间的大小具有不变性,所有数值类型都有正负号,没有无符号类型。基本类型 大小 最小值 最大值 包装器类型 默认值 boolean - - - Boolean false char 16-bit Unicode 0 Unicode 2^16-1 Character ‘\u0000’(null) byte 8bits -128 +127 Byte (byte)0 short 16bits -215 +215-1 Short (short)0 int 32bits -231 +231-1 Integer 0 long 64bits -263 +263-1 Long 0L float 32bits IEEE754 IEEE754 Float 0.0f double 64bits IEEE754 IEEE754 Double 0.0d void - - - Void 高精度计算类:BigInteger & BigDecimal
-
数组
Java数组对象自动初始化为null,范围检查保证了数组无法越界访问。 -
作用域
Java的作用域由花括号的位置决定。 -
对象的作用域
Java对象可存活于作用域之外。在Java中我们只需要创建对象,一旦不再需要,垃圾回收器会让它们自行消失。 -
类
class ATypeName { /* Class body goes here */}
类中可设置字段(数据成员)和方法(成员函数) -
方法、参数、返回值
方法基本组成部分:名称在、参数、返回值、方法体。
方法的参数列表指定要传递给方法什么样的信息。 -
static关键字
当一个事物被声明为static时,就意味着这个域或方法不会与包含他它的那个类的任何对象实例关联在一起。静态数据成员可以通过对象名来定位它,也可以直接通过类名访问。静态方法雷同,自行类比。class StaticTest { static int i = 48; public static void main(String[] args) { StaticTest st = new StaticTest(); /*两种访问方式*/ st.i; //这里eclipse会建议使用下面那种静态方式访问 StaticTest.i; } }
-
第一个Java程序
java.lang默认导入到每个Java文件中,其所有类都可以被直接使用。
类的名字和文件名必须相同。 -
编码风格
“驼峰风格”
第三章 操作符
-
操作符“+”
"+"在System.out.println()中意味着字符串拼接,当“+”后面紧接着一个非String类型的元素时,就会尝试把这个非String类型的元素转换为String。 -
别名问题
class Tank { int level; } public class Assignment { public static void main(String[] args) { Tank t1 = new Tank(); Tank t2 = new Tank(); t1.level = 9; t2.level = 47; System.out.println("1: t1.level:" + t1.level + ", t2.level:" + t2.level); t1 = t2; //这里已经绑在一起了,两个引用指向同一个对象,老t1已经被回收 System.out.println("1: t1.level:" + t1.level + ", t2.level:" + t2.level); t1.level = 27; System.out.println("1: t1.level:" + t1.level + ", t2.level:" + t2.level); } } /*Output: 1: t1.level:9, t2.level:47 1: t1.level:47, t2.level:47 1: t1.level:27, t2.level:27 */
这里我们期望t1和t2是独立的,因此我们可以如此解决:
t1.level = t2.level;
-
对象的等价性
==
和!=
比较的是对象的引用。equals()方法用于比较对象的实际内容是否相同,但equals()方法不适用于基本类型ÿ