Think in Java——2
一切都是对象
文章目录
TIJ阅读笔记
用句柄操纵对象
尽管将一切都“看作”对象,但操纵的标识符实际是指向一个对象的“句柄”(Handle)。在其他Java 参考书里,还可看到有的人将其称作一个“引用”,甚至一个“指针”
所有对象都必须创建
数据的保存:
寄存器:处理器内部,临时变量
栈
驻留于常规RAM(随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持。
堆
一种常规用途的内存池(也在RAM 区域),其中保存了Java 对象。和堆栈不同,“内存堆”或“堆”(Heap)最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new 命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间!
静态存储
可用static 关键字指出一个对象的特定元素是静态的。但Java 对象本身永远都不会置入静态存储空间。
常数存储
非RAM存储
绝对不要清除对象
作用域
{
int x = 12;
/* only x available */
{
int q = 96;
/* both x & q available */
}
/* only x available */
/* q “out of scope” */
}
对象的作用域
句柄的作用域结束,对象仍然存在
{
String s = new String("a string");
} /* 作用域的终点 */
句柄s 会在作用域的终点处消失。然而,s 指向的String 对象依然占据着内存空间。在上面这段代码里,我们没有办法访问对象,因为指向它的唯一一个句柄已超出了作用域的边界。
“垃圾收集器”:在对象不被引用时回收对象的空间
创建类
字段、方法(参数表与返回值)
构建Java程序
模块命名:
Java 的设计者鼓励程序员反转使用自己的Internet 域名,因为它们肯定是独一无二的。由于我的域名是BruceEckel.com,所以我的实用工具库就可命名为com.bruceeckel.utility.foibles。
使用其他组件
import、*通配符
static关键字
静态变量
静态方法
注释
一般注释:
//单行注释
/* 这是
* 一段注释,
* 它跨越了多个行
*/
文档注释
控制程序流程
1. 运算符
java作为编程语言,支持常见的运算符,这些运算符有一定的优先级,大部分运算符只能作用于基础数据类型8。
特例:
几乎所有运算符都只能操作“主类型”(Primitives)。唯一的例外是“=”、“==”和“!=”,它们能操作所有对象
-
java预算符优先级
优先级为1的运算符可以改变其他运算的优先级。
优先级 运算符 结合性 1 ()、[]、{} 从左向右 2 !、+(正号)、-(负号)、~、++、– 从右向左 3 *、/、% 从左向右 4 +、- 从左向右 5 «、»、>>> 从左向右 6 <、<=、>、>=、instanceof 从左向右 7 ==、!= 从左向右 8 & 从左向右 9 ^ 从左向右 10 | 从左向右 11 && 从左向右 12 || 从左向右 13 ?: 从右向左 14 =、+=、-=、*=、/=、&=、|=、^=、~=、«=、»=、>>>= 从右向左 -
赋值:
对于对象的操作,=赋值运算符的操作对象的句柄,运算符不能直接访问对象值。
“别名”:不同对象句柄指向相同的对象数据。句柄是独立的,对象是统一的。
-
算术运算符
-
逻辑运算符
“短路求值”
-
按位运算符
&:按位与
|:按位或
^:按位异或
~:非
-
移位运算符
-
三元运算符:
bool ? val1 : val2
-
造型运算符()
cast运算(强制类型转换)
-
2. 执行控制
- if-else
- while、do-while、for、for(😃
- swiitch-case
- break、continue