第二章 一切都是对象
Java语言假设我们只进行面向对象的程序设计。
【2.1 用引用操纵对象】
尽管一切都看做对象,但操纵的标识符实际上是对象的一个引用(reference)。
【2.2 必须由你创建所有对象】
【2.2.1 存储到什么地方】
程序运行时有五个地方可以存储数据:寄存器(处理器内部,最快,数量极其有限)、堆栈(位于通用RAM,速度仅次于寄存器,灵活性受限制,对象的引用存于此处)、堆(通用内存池,也位于RAM,灵活性大,分配与清理耗时,new将对象存储于此)、常量存储(代码内部或ROM中)、非RAM存储(流对象和持久化对象等,Java提供了对轻量级持久化的支持)。
【2.2.2 特例:基本类型】
创建一个并非引用的“自动变量”,直接存放于堆栈中,相比new创建的变量(存于堆中)更加高效。
Java中,所有数值类型都有正负。
【2.2.3 Java中的数组】
Java确保数组会被初始化,且不能在范围之外访问。这种范围检查,增加了内存消耗等开销,但换来了安全性和效率的提升。
【2.3 永远不需要销毁对象】
【2.3.2 对象的作用域】
Java对象不具备基本类型一样的生命周期,可以存活于作用域之外。
Java有一个垃圾回收器,用于监视new创建的所有对象,并辨别不再被引用的对象。
【2.4 创建新的数据类型:类】
【2.4.1 字段和方法】
在Java中,所做的全部工作就是:定义类、产生类对象、发送消息给类对象。
有两种类型的元素:字段(或数据成员)和方法(或成员函数)。
当变量成为类的成员使用时,Java确保给定其默认值,以确保其得到初始化(C++无此功能),对于局部变量,任和C++中一样,不做初始化,可能是任意值。
【2.5 方法、参数和返回值】
方法名和参数列表,合起来称为“方法签名”,唯一标识出某个方法。
【2.6 构建一个Java程序】
【2.6.3 static关键字】
当一个域或方法声明为static时,则表明不会与包含它的那个累的任何对象实例关联在一起。
使用类名是引用static变量的首选方式。
【2.7 你的第一个Java程序】
有一个特定类会被自动导入到每一个Java文件中:java.lang。
一个独立运行的程序,文件中必须存在某个类与该文件同名,并且那个类必须包含一个名为main()的方法。static方法的一个重要用法是在不创建任何对象的前提下调用它,这一点对于main()方法特别重要,它是运行应用时的入口。形式如下所示:
-
public static void main(String[] args) {
-
...
-
}
【2.8 注释和嵌入式文档】
【2.9 编码风格】
类名的首字母大写;如果类名由几个单词构成,那么把它们并在一起,其中每个内部单词的首字母都采用大写形式。
几乎其他所有内容---方法、字段(成员变量)以及对象引用名称等,公认的风格与类的风格一样,只是表识符的第一个字母采用小写。
例如:
-
class MyJavaClass {
-
int myData;
-
-
void myFunction(int newData) {
-
//...
-
}
-
-
//...
-
}
第三章 操作符
在System.out.println()语句中包含“+”操作符,在这种上下文环境中,“+”意味着“字符串连接”,并且如果需要,它还要执行“字符串转换”。当编译器观察到一个String后紧跟着一个“+”,而这“+”的后面又紧跟着一个非String类型的元素时,就会尝试将这个非String类型的元素转换成String。
对一个对象进行赋值操作时,我们真正操作的是对对象的引用,所以,倘若将一个对象赋值给另一个对象,实际是将“引用”从一个地方复制到另一个地方。这种特殊的现象通常称作“别名现象”,是Java操作对象的一种基本方式。从现在开始,就该留意,为对象赋值可能产生意想不到的结果。
将一个对象传递给方法时,也会产生别名现象。
整数除法会直接去掉小数位,而不是四舍五入地圆整结果。
“==”和“!=”关系操作符对于基本类型可以直接使用,如果是对象,比较的就是对象的引用,必须使用对所有对象都适用的特殊方法equals()。
特别值得注意的是,equals()的默认行为是比较引用,所以除非在自己的新类中覆盖equals()方法,否则不可能表现出我们希望的行为。
大多数Java类库都实现了equals()方法,以便用来比较对象的内容,而非比较对象的引用。
Java中的逻辑操作符与在C及C++中不同的是:不可将一个非布尔值当作布尔值在逻辑表达式中使用。
使用逻辑操作符时,我们会遇到一种“短路”现象。即一旦能够明确无误地确定整个表达式的值,就不再计算表达式的余下部分。
直接常量后面的后缀字符标志了它的类型。
若为大写(或小写)的L,代表long。
若为大写(或小写)的F,代表float。
若为大写(或小写)的D,代表double。
Java中,“有符号”右移位操作符">>"使用“符号扩展”:若为正,则在高位插入0;若为负,则在高位插入1。
Java中增加了“无符号”右移操作符“>>>”,它使用“零扩展”:无论正负,都在高位插入0。
如果对byte或short类型的值进行移位操作运算,得到的可能不是正确的结果。它们会先被转换成int型,再进行右移操作,然后被截断,赋值给原来的类型,在这种情况下,可能得到-1的结果。
将float或double转型为整型值时,总是对该数字执行截尾。如果想要得到舍入的结果,就需要使用java.lang.Math中的round()方法。
Java没有sizeof,所有数据类型在所有机器中的大小都是相同的。
第四章 控制执行流程
Java不允许我们将一个数字作为布尔值使用。
Java里唯一用到逗号操作符的地方就是for循环的控制表达式。
foreach表示不必创建int变量去对由访问项构成的序列进行计数,foreach将自动产生每一项。该语法用于数组和容器。
尽管goto任然是Java中的一个保留字,但在语言中并未使用它;Java没有goto语句。
在Java中,使用标签。标签起作用的唯一地方刚好是在迭代语句之前。“刚好之前”
下面讲述规则:
> 一般的continue语句退回最内层循环的开头,并继续执行;
> 带标签的continue会到达标签的位置,并重新进入紧接在那个标签后面的循环;
> 一般的break会中断并跳出当前循环;
> 带标签的break会中断并跳出标签所指示的循环。
第五章 初始化与清理
构造器是一类特殊的方法,它没有返回值,采用与类相同的名称,“每个方法首字母小写”的编码风格并不适用于构造器。
区分重载的规则很简单:每个重载的方法必须有一个独一无二的参数类型列表。
如果已经定义了一个构造器(无论是否有参数),编译器就不会帮你自动创建默认构造器。
【5.4 this关键字】
this关键词只能在方法内部使用,表示对“调用方法的那个对象”的引用。this的用法和其他对象引用并无不同。
如果在方法内部调用同一类的另一个方法,不必使用this,直接调用即可。
如果要将当前对象传递给外部的方法,this关键词就很有用。
可能为一个类写了多个构造器,想在一个构造其中调用灵一个构造器,以避免重复代码。this关键字可以做到这一点。
通常写this的时候,表示对当前对象的引用。在构造器中,如果为this添加了参数列表,那么就有了不同的含义。这将产生对符合此参数列表的某个构造器的明确调用。
尽管可以用this调用一个构造器,但不能调用两个。此外,必须将构造器置于最起始处,否则编译器会报错。
除了构造器外,编译器禁止在其他任何地方调用构造器。
【5.5 清理:终结处理和垃圾回收】
【5.6 成员初始化】
Java尽力保证:所有变量在使用前都能得到恰当的初始化。
类的每个基本类型数据成员保证都会有一个初始值。
在类里定义一个对象引用时,如果不将其初始化,此引用就会获得一个特殊值null。
要牢记:无法阻止自动初始化的进行,它将在构造器被调用之前发生。
在类的内部,变量定义的顺序决定了初始化的顺序。即使变量定义散布于方法定义之间,它们仍旧会在任何方法(包括构造器)被调用之前得到初始化。
静态初始化只有在必要的时刻才会进行。只有在第一个对象被创建(或者第一次访问静态数据)的时候,它们才会被初始化。此后,静态对象不会再次被初始化。
初始化的顺序是,先静态对象(如果他们尚未初始化),而后是非静态对象。
Java允许将多个静态初始化动作组织成一个特殊的“静态子句”(有时也叫做“静态块”)。
【5.7 数组初始化】
阅读(4190) | 评论(0) | 转发(0) |