您的位置:首页 > 编程语言 > Java开发

Java编程思想(第四版)笔记(一)

2016-05-25 11:53 441 查看


闲来无事,重读一遍Java编程思想,有些自己感觉容易忘记的东西,记个笔记。

第2章 一切都是对象

2.2.2 基本类型

之所以特殊对待,是因为new将对象存储在堆里,故用new创建一个对象------特别是小的、简单的变量,往往不是很有效。因此,对于这些类型,Java采取与C和C++相同的方法。也就是说,不用new来创建对象,而是创建一个并非是引用的“自动”变量。这个变量直接存储“值”,并置于堆栈中,因此更加高效。

所有的数值类型都有正负号,所以不要去寻找无符号的数值类型。

boolean类型所占存储空间的大小没有明确指定,仅定义为能够区字面值true或false。

基本类型具有的包装器类,使得可以在堆中创建一个非基本对象,用来表示对应的基本类型。

第3章 操作符

3.7 关系操作符

==和!=比较的是对象的引用,如果要比较两个对象的实际内容是否相同,必须使用所有对象都适用的特殊方法equals()。但这个方法不适用于基本类型,基本类型直接使用==和!=即可。但equals()方法是Object类的方法,默认的还是比较引用,所以还要在需要比较内容的类中覆盖equals()方法。

在Object类中,==是对地址的比较,equals()方法是对==的封装,hashcode()方法是本地native方法,使用对象地址计算散列码。所以,两个Object对象的==、equals()和hashcode比较的结果应该是相同的,都是和原始地址相关的计算比较。

String类以及大部分基本类型的包装类都已经对equals()和hashcode()方法进行了覆盖,可直接使用它来比较内容是否相同。

3.16 Java没有sizeof

在C和C++中,sizeof()操作符可以告诉你为数据项分配的字节数,原因是为了“移植”。不同的数据类型在不同的机器上可能有不同的大小,所以在进行一些与存储空间有关的运算时,程序员必须熟悉那些类型具体有多大。Java不需要,因为所有数据类型在所有机器中的大小都是相同的。

第4章 控制执行流程

4.3.3 逗号操作符

不同于逗号分隔符,逗号用作分隔符时用来分割函数的不同参数,Java里唯一用到逗号操作符的地方就是for循环的控制表达式。在控制表达式的初始化和步进控制部分,可以使用一系列由逗号分隔的语句;而且那些语句均会独立执行。

第5章 初始化与清理

5.2 方法重载

每个重载发方法都必须有一个独一无二的参数类型列表。甚至参数类型顺序的不同也足以区分两个方法,但会使代码难以维护。不能以返回值区分重载方法,是因为有时你并不关心方法的返回值,比如仅仅写个f();时,将无法区分调用哪一个。

5.4 this关键字

只能在方法内部使用,表示对“调用方法的那个对象”的引用。this的用法和其他对象引用并无不同。

static方法就是没有this的方法,在static方法的内部不能调用非静态方法,反过来倒是可以的。有人认为static方法不是面向对象的,因为它们的确具有全局函数的语义,使用static方法时,由于不存在this,所以不是通过“向对象发送消息”的方式来完成的。的确,要是在代码中出现了大量的static方法,就该重新考虑自己的设计了。

5.5 清理:终结处理和垃圾回收

1.对象可能不被垃圾回收

2.垃圾回收并不等于“析构”

3.垃圾回收只与内存有关

使用垃圾回收器的唯一原因是为了回收程序不再使用的内存。所以对于与垃圾回收有关的任何行为来说(尤其是finalize()方法),也必须同内存及其回收有关。

当垃圾回收时, finalize()方法才会被调用,这就将对finalize()的需求限制到一种特殊情况,即通过某种创建对象方式以外的方式为对象分配了存储空间。可Java中一切皆对象,那这种特殊情况又是什么呢?看来之所以要有finalize,是由于在分配内存时可能采用了类似C语言中的做法,而非Java中的通常做法。这种情况主要发生在使用“本地方法”的情况下,本地方法是一种在Java中调用非Java代码的方式。本地方法目前只支持C和C++,但它们可以调用其他语言写的代码,所以实际上可以调用任何代码。在非Java代码中,也许会调用C的malloc()函数系列来分配存储空间,而且除非调用了free函数,否则存储空间将得不到释放,从而造成内存泄露。当然free()是C和C++中 的函数,所以需要在finalize()中用本地方法调用它。所以,finalize()不是进行普通的清理工作的合适场所。

无论是“垃圾回收”还是“终结”,都不保证一定会发生。如果Java虚拟机并未面临内存耗尽的情形,它是不会浪费时间去执行垃圾回收以恢复内存的。

5.7 初始化顺序

类中初始化顺序:父类静态成员,子类静态成员,父类构造方法,子类构造方法

第6章 访问权限控制

访问权限控制的等级,从最大到最小权限依次为:public、protected、包访问权限(缺省)和private。

6.1 包:库单元

当编写一个Java源文件时,此文件通常被称为编译单元。每个编译单元都必须有一个后缀名.java,而在编译单元内部可以有一个public类,该类的名称必须与文件的名称相同(包括大小写)。每个编译单元只能有一个public类,否则编译器就不会接受。如果在该编译单元中还有其他的类的话,那么在包之外的世界是无法看见这些类的,这是因为它们不是public类,而且它们主要用来为主public类提供支持。

当编译一个.java文件时,在.java文件中的每个类都会有一个输出文件,而该输出文件的名称与.java文件中的每个类的名称相同,只是多了一个后缀名.class。因此,在编译少量.java文件之后,会得到大量的.class文件。

Java解释器的运行过程如下:首先,找出环境变量classpath。classpath包含一个或多个目录,用作查找.class文件的跟目录。从跟目录开始,解释器获取包的名称并将每个句点替换成斜杠,以从classpath根中产生一个路径名称。得到的路径会与classpath中的各个不同的项相连接,解释器就在这些目录中查找与你所要创建的类名称相关的.class文件。

按照惯例,package名称的第一部分是类的创建者的反顺序的Internet域名,这样便是独一无二的。比如,某域名为blog.sina.com,则包名可为com.sina.blog.*。

Java可运行程序是一组可以打包并压缩为一个Java文档文件的.class文件。Java解释器负责这些文件的查找、装载和解释。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java编程思想