《Thinking in Java》读书笔记(不断更新中)

概述

春节在家乡,家里的电脑都是我上大学时淘汰的,要么运行不起来AS,要么连接不上手机,要么编译不了程序,这Android是写不了了。
记得前几天写插件的时候,用过Intellij IDEA,感觉很流畅,心说在我的小霸王电脑上试一试。于是我就下载了一个Intellij IDEA,运行Hello World畅快无比,OK,那么这几天有空就复习一下Java基础知识吧,温故而知新。
手头正好有一个本《Thinking in Java》,不看不知道,一看还是有点吓一跳,里面有一些知识和细节还是我不知道的,于是总结一篇读书笔记。(不断更新中)

第2章 一切都是对象

1 类的成员变量若是基本数据类型,即使没有初始化,Java也会确保它获得一个默认值。

char:’\u000000’(null) boolean: false其他都是0,)
只有当变量作为类的成员变量使用时,Java才会确保给定其默认值。
上述原则不适用于 “局部”变量(即并非某个类的字段)
因此,如果在某个方法中定义有int x; 这个想得到的可能是任意值(和CC++中一样),如果不赋初始值,java编译器会报错。


我的理解:堆区的会被自动默认值,栈区的不会。因为数组里的元素也是会赋予默认值。

2 方法名和参数列表(合起来成为“方法签名”)唯一标识出某个方法。

注:和返回值无关

第3章 操作符

1 Random类

在使用Random类的时候,如果构造时传入相同数值,则后面的nextXXXX()得到的值每次都相同了。如果不传入数值,默认是系统的当前时间作为随机数生成器的种子
但不管怎样,多次调用nextXXX(),还是会生成不一样的随机数

2 一元加号 +

唯一的作用: 将 较小类型的操作数 提升为 int

3 进制

大写、小写的L,代表long(使用小写l容易造成混淆,因为和数字1很像。)
大写、小写的F 代表float
大写、小写的D 达标double
前缀0x、0X带包十六进制,后面跟随0-9或大写、小写的a-f。

通过使用Integer、Long类的静态方法 toBinaryString() 输出二进制形式的结果。

4 指数计数法

e 代表10. 1.39 e-43 = 1.39 * 10 (-43次方)

5 按位操作符

异或 ^
~
布尔类型,没有按位非 ~ 运算。大概是为了避免与逻辑NOT 混淆。(逻辑只有 && || ! )
对于布尔类型,按位操作符 和 逻辑操作符 效果相同, 然而 没有 “短路”

6 移位操作符,

只能操作整数。
<< 低位补0
>> 高位补符号位
>>> 高位补0
char、byte、short 在进行 移位处理时,会被自动转换成int。得到的结果也是int。
所以对它们进行<<= >>= >>>= 这种运算,可能得到-1.

第4章 控制执行流程

1 逗号操作符

(注意,不是分割函数参数的逗号分隔符)
Java里唯一用到逗号操作符的地方就是for循环的控制表达式。在初始化,和步进控制部分(1,3部分)使用,判断部分不能用,只能是一个boolean的表达式。

2 switch

书中说只能是int或者char的整数值才能switch,实测String也可以。(java 7 引入)
Enum也可以( Java 5) ,
注意,long不可以。!!!!

3 臭名昭著的goto

Java里没有goto,虽然它是保留字,有一个类似的机制continuebreak,搭配标签
标签式后面跟有冒号的标识符。
在Java中,标签起作用的唯一的地方刚好在迭代语句之前
在标签和迭代之间置入任何语句都不好。
使用标签的唯一理由:我们希望在嵌套循环迭代or开关。

4 continuebreak

continuebreak本身只能中断最内层循环
一般的continue会继续执行递增表达式,continue + 标签,不会执行递增表达式

第5章 初始化与清理

1 类成员变量,定义时就被初始化构造器中初始化 的区别

初始化块优先于构造方法被执行,如果初始化块执行中,构造方法被调用之前没有什么特殊的处理,只是单纯的成员变量赋值,那么效果是一样的。

对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序以此是(静态变量、静态初始化块)>(变量、初始化块)>构造器。

并不是父类完全初始化完毕后才进行子类的初始化,实际上子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。

  那么对于静态变量和静态初始化块之间、变量和初始化块之间的先后顺序又是怎样呢?是否静态变量总是先于静态初始化块,变量总是先于初始化块就被初始化了呢?实际上这取决于它们在类中出现的先后顺序

大家可以随意改变变量a、变量b以及静态初始化块的前后位置,就会发现输出结果随着它们在类中出现的前后顺序而改变,这就说明静态变量和静态初始化块是依照他们在类中的定义顺序进行初始化的。同样,变量和初始化块也遵循这个规律。
参考自:http://tieba.baidu.com/p/1586488031

静态代码块跟静态变量都是类加载时进行初始化的(同等条件下,初始化顺序由书写顺序决定)
非静态变量和非静态代码块是在类实例时进行初始化的(同等条件下,初始化顺序由书写顺序决定)
static final 修饰的变量,在类加载时已被初始化(一次),必须赋初始值。
final 修饰的变量,在每次创建新实例时被初始化(每次),必须赋初始值。

2 方法重载(涉及基本类型的重载)

基本类型能从一个较小的类型自动提升至较大的类型。因此当找不到最合适的方法,会自动向上转型到最接近的。byte-short-int-long-float-double
char略有不同,会把char自动提升至int-long-float-double。

如果传入较大的类型,则必须手动强转,否则编译报错。

3 this关键字

调用方法是“发送消息给对象”。编译器做了一些幕后工作,它暗自把“所操作对象的引用”作为第一个参数传递给方法。
所以a.peel(1);-> Banana.peel(a,1);
这是内部的表示形式,我们写代码不能这么写。

通常this,表示 对当前对象的引用
但是如果在构造器中,为this添加了参数列表,就表示调用其他构造器。
有三点注意事项:

  1. 只能用this调用一个构造器,不能调用2+个构造器
  2. 必须将构造器调用 置于 最初始处(第一行)
  3. 除了构造器之外,编译器禁止在其他任何方法中调用构造器函数。

4 static 的含义

可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。

5 finalize()

不等同于“析构”。 不建议用。 如果通过java调用其他代码,例如C,C里通过malloc()函数获取的空间需要在finalize()里释放。

6 垃圾回收如何工作

Java虚拟机采用 自适应 垃圾回收技术。自适应的、分代的、停止-复制、标记-清扫 式 垃圾回收期。

7 可变参数列表

Java SE5,varargs, 0~n个参数本质仍是数组,foreach用的时候不用判空。

8 枚举类型

Java SE5
enum 其实是.
ordinal()方法,表示特定enum常量的声明顺序
static values()方法,按照enum常量声明顺序,产生数组

第6章 访问权限控制

1 访问控制(隐藏具体实现)与“最初的实现并不恰当”有关。

让客户端程序员,不要触碰那些他们不该触碰的部分。
让类库设计者,可以更改类的内部实现。

2 每个编译单元(.java)只能有一个public类,0+个protected类。

3 编译时,每个类都会输出一个.class,因为编译少量.java 会生成大量的.class

4 如果不提供任何访问权限修饰词,默认是“包访问权限”。

5 protected处理的是继承的概念

6 一个类的构造器是private的,将不能被继承。

7 (具体实现的隐藏)把数据和方法包装进类中,称之封装。

8 虽然不常用,但是编译单元内完全不带public类也是可以的。可以随意命名文件。

9 类只能是public或者包访问权限,(内部类可以是private和protected)

10

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章