《Thinking In Java》第四版中文版读书笔记一

来源:互联网 发布:openwrt手机网络共享 编辑:程序博客网 时间:2024/05/23 05:07

一、书籍整体结构和风格

   拿到书籍后,我首先大致浏览了书的目录和第一章概述的内容。第一感觉是该书讲的java知识较为全面和深入,从java中最基本的概念:对象、类、接口等内容到集合、容器、多线程、违例控制等方面都有全面的介绍和解析,且结构清晰,有清楚的知识架构。其分析的角度也是从最本质的内存分配、生存时间等方面来展开的,不适合初学者入门学习,但对于有一定编程基础的人来说,能让读者深入了解java的本质。是一本值得阅读的好书。同时,该书也提到一些和java相关联的领域。例如计算机网络基础中的客户机/服务器机制、中间件、脚本编制语言,以及信息安全领域的数字证书等,使得读者能建立一个较为全面的知识系统。

   作者语言风格和大多数外国作者一样较为幽默轻松,但也由于是由外文书籍翻译为中文原因,很多专业词汇无法翻译准确,导致语言比较冗杂,晦涩难懂,加大了阅读的难度。

二、CHAP1对象入门

   在第一章内容中,主要介绍了以下几个概念 :

   1、对象(Object):将问题空间中的元素以及它们在方案空间的表示物称作“对象”。使用通俗的话来说就是一个具体实物或案例。

   2、类(class):客观世界中的许多对象,无论其属性还是其行为常常有许多共同性,抽象出这些对象的共同性便可以构成类。

   3、接口(Interface):必须有一种办法能向对象发出请求,令其做一些实际的事情,向对象发出的请求就是通过它的“接口”定义的。即接口是一系列方法的声明,是一些方法特征的集合。

   4、继承:重新使用接口,即使用已存在的类的定义作为基础建立新类,由关键字extends实现。

   5、多形性(Polymorphism):将一条消息发给对象时,如果并不知道对方的具体类型是什么,但采取的行动同样是正确的,这种情况就叫作“多形性”。用以实现多形性的方法叫作“动态绑定”。

   6、多线程:利用对象,可将一个程序分割成相互独立的区域。我们通常也需要将一个程序转换成多个独立运行的子任务。象这样的每个子任务都叫作一个“线程”(Thread)。一个程序容纳了多个同时执行的线程就是“多线程”。

   7、永久性:创建一个对象后,只要我们需要,它就会一直存在下去。但在程序结束运行时,对象的“生存期”也会宣告结束。

三、CHAP2一切都是对象

   第二章内容主要对关于对象的一些基本概念进行讲解,并介绍了java的编码规范。主要有以下几点:

   1、句柄(Handle):java中一切对对象的操纵都是通过句柄。举例说明:

                     String s = new String("asdf");

String s是创建一个句柄s,new String("asdf");是创建了一个新对象,而“=”符号就是将句柄和新对象连接起来,以便句柄可以操纵该对象。

   2、内存的分配:对象句柄内存分配于堆栈当中,java对象内存分配于中,编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。静态数据(static)存储在静态存储空间中。 

   3、主类型:并非句柄的“自动”变量,这个变量容纳了具体的值,并置于堆栈中,能够更

高效地存取。主要有:boolean、char、short、int、long、float、double、void。

   4、Java的数组:创建对象数组时,实际创建的是一个句柄数组。也可以创建主类型数组。举例说明:

                     String[]s = new String[10];

String[] s是创建一个句柄数组,newString[10]是创建10个新的对象,而“=”符号就是将句柄数组中的每一个句柄和新对象一一对应的连接起来。

   5、对象的作用域:Java对象不具备与主类型一样的存在时间。用new 关键字创建一个Java对象的时候,它会超出作用域的范围之外。即句柄会在作用域的终点处消失。然而,句柄指向的对象依然占据着内存空间。

   6、垃圾收集器:为解决5所造成的“内存溢出”问题,它会查找用new创建的所有对象垃圾收集器只知道释放那些由new 分配的内存),并辨别其中哪些不再被引用。随后,它会自动释放由那些闲置对象占据的内存,以便能由新对象使用。

   7、类的主要元素:数据成员(字段/成员变量)和成员函数(成员函数)。每个对象都为自己的数据成员保有存储空间;数据成员不会在对象之间共享

   8、调用对象中的对象的数据成员:对象A.对象B.数据成员b = 100

   9、默认值

     ①非主数据类型的数据成员必须进行显示初始化,没有默认初始值

     ②若某个主数据类型属于一个类成员,则有默认初始值

     ③局部变量(即非成员变量,只是方法内部变量)没有默认初始值,必须显式初始化。

   10、命名法:采用了与Internet域名类似的名字。反转使用自己的Internet域名。

   11、static关键字:一旦任何数据或方法设置为static,无论新建多少个对象,其静态部分都共享一个内存空间。静态成员或方法可以通过对象引用,也可通过类直接引用

   12、注释文档:javadoc,可导出为HTML文档,用浏览器查阅。

   13、编码样式:大写一个类名的首字母,若类名由几个单词构成,那么把它们紧靠到一起,每个嵌入单词的首字母都采用大写形式。标识符的第一个字母采用小写。

四、CHAP3控制程序流程

   第三章主要介绍的是java中的运算符和执行控制语句。主要有以下几点:

   1、赋值符“=”:

     ①假设为主类型使用“A=B”,那么B 处的内容就复制到A。若接着又修改了A,那么B根本不会受这种修改的影响。

     ②为对象“赋值”时,我们真正操作的是它的句柄。所以倘若“从一个对象到另一个对象赋值,实际就是将句柄从一个地方复制到另一个地方。这意味着假若为对象使用“C=D”,那么C和D 最终都会指向最初只有D才指向的那个对象。

   2、运算符:算术、关系、逻辑、按位、移位、三元if-else、逗号、字串运算符(+)

按计算优先级顺序为:一元>算术(和移位)>关系>逻辑(和按位)>条件(三元)>赋值

   3、造型(cast):即数据类型的强制转换,当“缩小转换”时,java编译器会强迫我们造型,且造型采用“整数法”,即多余的小数部分直接丢弃,不做任何处理。当“放大转换”时则不必进行明确造型。

   4、执行控制:

      ①条件运算符“= =”:java不允许将一个数字作为布尔值使用。当比较主类型时,“= =”比较的是双方的值,当比较复合数据类型(类)时,比较的是他们的内存地址。(比较值应用equals)

     ②if-else、while、do-while、for(for中可以定义多个变量,但类型需相同)(注意Java 不允许我们将一个数字作为布尔值使用)

      ③中断(break)和继续(continue): break 用于强行退出循环,不执行循环中剩余的语句。而continue则停止执行当前的反复,然后退回循环起始和,开始新的反复。

      ④开关(Switch):使用的选择因子必须是int 或char 那样的整数值。

五、CHAP4初始化和清除

1、用构建器自动初始化:即构造方法。没有返回值。

2、方法的“过载”:即重载。在同一个类内几个函数名字相同,但形参不同,返回值类型不同(c++可以,java不行),要防止调用的二义性。

3、this关键字:

  ①为已调用了其方法的那个对象生成相应的句柄,指“这个对象”或者“当前对象”     

  ②returnthis:返回当前当前调用该方法的对象的句柄。

  ③有多个构建器时,同一个方法内不能使用this同时调用两个构建器

  ④一个构建器调用另一个调用器时必须将this语句放在第一句

  ⑤其他任何方法不能在其内部调用过载的构建器

 

六、CHAP5隐藏实施过程

1、编辑单元(源码文件):一个编辑单元有且只有一个public类,且必须与文件名相同。

    2、java访问指示符:

   ①friendly:默认指示符,包访问,当前包内的其他所有类都能访问。

   ②public:接口访问,所有类都能访问

   ③private:只能本类访问

  ④protected:同一个包内的类以及其他包的子类(衍生类)可以访问

 

七、CHAP6类再生

1、合成:在新类里简单地创建原有类的对象,只需在新类里简单地置入对象句柄即可。

2、tostring():比如System.out.println(xx),括号里面的“xx”如果不是String类型的话,就自动调用xx的toString()方法。

3、继承

  ①定义:使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。

  ②关键词:extends

  ③super关键字:当子类的方法调用父类的方法或成员时,需要用到super。同时super还可调用父类中的某一个构造函数(和this类似,应该为构造函数中的第一条语句)

  ④创建子类对象时,其中包含了一个父类的一个隐藏对象,所以子类的构建器会自动调用父类的构建器,完成对子类对象和父类隐藏对象的初始化。

  ⑤“合成”or“继承”?:属于关系时使用“继承”;“包含关系时使用“合成”。

   4、final关键字:声明该数据、方法或类不能改变。

      ①final数据:基本数据类型定义为final是声明该数据为一个常数,不可改变;对象句柄使用final,会将句柄变成一个常数。进行声明时,必须将句柄初始化到一个具体的对象。而且永远不能将句柄变成指向另一个对象,但对象本身可以变化。

  ②final方法:防止任何继承类改变它的本来含义。

  ③final类:表明自己不希望从这个类继承,或者不允许其他任何人采取这种操作。

   5、运行期类型标识(RTTI):在运行期间对类型进行检查的行为叫作“运行期类型标识”,它的作用是保证下溯造型正确进行。

 

 

Tips  重要例题解析

    1、CHAP6:关于初始化顺序

//: Beetle.java

// The full process of initialization.

class Insect{

int i = 9;

int j;

Insect() {//④调用基础类构建器

prt("i = " + i + ", j = " + j);

j = 39;

}

static int x1 =prt("static Insect.x1initialized");//①基础类静态变量初始化

static int prt(String s) {

System.out.println(s);

return 47;

}

}

public class Beetleextends Insect {

int k = prt("Beetle.k initialized");//⑤实例变量初始化

Beetle() {

prt("k = " + k);//⑥调用衍生类构建器

prt("j = " + j); //⑥调用衍生类构建器

}

static int x2 =prt("static Beetle.x2initialized");//②衍生类静态变量初始化

static int prt(String s) {

System.out.println(s);

return 63;

}

public static void main(String[] args) {

prt("Beetle constructor");//③按顺序执行main方法

Beetle b = new Beetle();//创建新对象,依次调用基础类和衍生类构建器

}

} ///:~

运行结果:

static Insect.x1 initialized

static Beetle.x2 initialized

Beetle constructor

i = 9, j = 0

Beetle.k initialized

k = 63

j = 39

原创粉丝点击