再读《Java编程思想》(Review 《Thinking in Java 3rd》)(1-4章)

原创文章,转载请注明出处:http://blog.csdn.net/wind5shy/article/details/3491269

同义词汇表

(By wind5shyhttp://blog.csdn.net/wind5shy)

说明:下表中蓝色的词为本文中固定使用的词汇且本文中不会使用其他的同义词以免造成混淆,某些词不使用根据字面翻译的中文词汇而使用约定俗成,便于理解的中文词汇。

n      type,类型

n      instance实例

n      object对象,包括类和实例的概念

n      field:(对象中的)域、成员、字段、属性

n      method:(对象中的)方法、函数

n      reference引用、句柄

n      base class:基类、父类、超类

n      subclass:导出类、子类

n      extends:扩展、继承

n      overload重载

n      override:重写,覆写,改写,覆盖(Tinking in Java 3rd中文版中把overriding也翻译成了重载,其实overloadoverride并不相同)

n      enclosing class:封装类、外围类

 

关于?:表示这些内容只是我一些不太确定的猜测或者我还没找到满意答案的问题。

(By wind5shyhttp://blog.csdn.net/wind5shy)

 

第一章对象引论

(By wind5shyhttp://blog.csdn.net/wind5shy)

对象

书上的解释没有问题,对对象的理解是多种多样的,我个人把对象看做是服务提供者,封装了数据和对数据的操作,通过约定(就是接口,定义了对象能做什么事)对外提供服务。我们对对象关心的是它能够做什么,而不是它是什么

对象 =服务提供者 = (数据 +对数据的操作) + 接口(隐藏实现,提供约定的服务)

 

关于继承

子类需要新的方法用实现另一接口中的方法来实现,这样可以保持父类与子类的逻辑一致性。

 

泛化(多态)

向一类对象发送一个消息,不关心消息具体是由父类或者子类的哪个具体实例实现,编译时不知道具体实现的对象,直到运行时相应对象才确定。这提供了一种概念层次上的抽象,比如人可以做事,但具体的事情肯定是具体的人来做,我现在有一件事需要处理,有了泛化,那么我写代码就只需写“人做事”,这件具体的事就会安排给具体的人来做,不用我手动来指定。

 

接口与类,继承与实现

类单继承类,可实现多接口;接口可继承多个接口。

 

对象生命周期

在堆中动态创建和管理对象,直到运行时才知道需要多少对象及相应的类型和生命周期,编译器不知道对象的生命周期。

 

容器和迭代器

容器通过迭代器被抽象为顺序的序列,遍历的时候无需关心容器的结构,不管容器是StackArrayList等。

 

单继承

单根继承,子类只有一个父类。

(By wind5shyhttp://blog.csdn.net/wind5shy)

 

第二章一切都是对象

(By wind5shyhttp://blog.csdn.net/wind5shy)

引用与对象

引用 =遥控器,对象 = 电器;声明一个引用,如Stirng s,表示创建一个可以控制String这种电器(对象)的遥控器(引用);遥控器s可以不关联电器单独存在。

 

JVM的储存方式

n        RegisteerCPU寄存器。编译器分配,你不能通过JVM直接控制即与你无关

n        Stack:内存中的栈。堆栈指针下移,分配内存;上移,释放内存。编译器需知道堆栈内数据大小及生命周期以确定指针移动的位置及能否移动。存放基本数据及引用。

n        Heap:内存中的堆。存放对象,你new出来的对象就放在这里,动态管理。

n        Static:内存中固定位置。对应Static关键字。

n        Consitant:直接存在代码内部。在嵌入式系统中,放在ROM

n        Non-RAM:要持久化的数据转成字节流发出去或存到磁盘上。

 

作用域

不允许类似C中的{ int x = 1{ int x = 2}}这样的做法。

 

类定义

定义类的成员和方法,可以在定义处对成员进行初始化。对于继承类来说,

class A {

   int a;

}

 

class B {

   //a = 1;B中含有A的子对象,所以a已经声明过了,这里写a=1不是对其进行声明并初始化,而是对其赋值,在类的定义处不能进行这样的操作,只能在方法或初始化块内进行。

   { a = 1;}

}

 

基本类型默认值

类的某个成员是基本数据类型,即使没有进行初始化,Java也会确保它获得一个默认值。Java基本数值类型都有符号,不存在无符号的数值类型。

 

基本类型

默认值

boolean

false

char 

‘/u0000’ (null)

byte

(byte)0

short

(short)0

int

0

long

0L

float

0.0f

double

0.0d

 

Static关键字

1.      为某特定数据分配空间,不考虑创建对象。

2.      某方法不与其类任何实例有关联。即类中多个对象的同一个static方法或成员都只有一个空间。Static表示方法或成员是属于类的,而不是类的具体实例,所以static成员和方法又叫类成员和类方法

 

javacjava命令

javac编译java文件;java执行编译后的class文件,注意格式:java不带后缀的文件名

 

Javadoc

java文件及相应注释转换为类似java-api风格的html文档来查看,可以在注释中加入html命令。

(By wind5shyhttp://blog.csdn.net/wind5shy)

 

第三章控制程序流

(By wind5shyhttp://blog.csdn.net/wind5shy)

操作符

===、!=外只支持基本类型,String支持++=

三元操作符boolean value1 value2要返回一个值,所以value语句不能是Sysout.out.println这些没有值的语句。

 

别名

联系电器与遥控器的例子,a = bab是引用(遥控器),b把它的值给a,就是表示把遥控器a指向遥控器b对应的电器,所以现在ab都只能操纵b所操纵的电器(对象)。incr(object a){a.i++},传入一个引用的副本a,设这个引用为ba.i++如同用按遥控器a的音量增大,因为ab现在操纵的都是同一个电器,所以b对应的电器音量被增大了。

 

==equals

通常理解==为引用(地址)比较,equals为值比较,其实equals默认也为引用比较,等价于==。这是因为类object中的equals定义为地址比较,但平时用到的类基本上都覆写了equals方法,将其定义为值比较,所以自己创造的类(都是object的子类)里用到equals方法的时候也需要重写。

 

逻辑关系符

或、与、非。与c/c++不同,只能用于boolean值。

 

浮点数

c/c++不同,java为完全精确比较,0.000…0001 != 0

 

短路

逻辑表达式中结果一但确定剩余部分变不再计算。

 

Boolean值的位操作

boolean以单比特值对待,效果与逻辑操作符相同,但不能~(按位非),比逻辑操作符新增^(异或),不能移位操作

 

移位操作符

n      <<(低位补0),有符号>>(正数高位插0,负数高位插1),无符号>>>(高位插0)。

n      char,byte,short移位,自动转为int,结果也是int 

n      右移,int移动位数的二进制表达式中低5位有效(int32位,最大移动32位),如int i  >> 33,即i右移33,33 = 100001,5位即只有00001有效,实际则只移动1位,long同理,低6位有效。 

n      有符号byteshort进行>>>==操作结果可能不正确,如short s = -1s >>>=10;s右移10位应为4194303,但s-1。过程如下:s移位前转化为(int)-1,111……11132位,补码),无符号右移10位变成0……011……111221,即4194303),但要转回short型,取后16位,即111……11116位,为-1)。

 

类型转换

基本类型可以任意互相转换,boolean除外,boolean不能进行任何转换。byte,char,short参与算术或移位运算时自动转为int,结果也是int,需手动转换为原类型。如:char a = a’,b = ‘b’;a = (char)(a + b);

 

For

只有for循环可以在控制表达式里定义变量,其他都不行。

 

标签

起作用的唯一地方是迭代语句之前,标签和迭代语句之间不能加入任何语句。使用的唯一理由是存在循环嵌套,而希望在不止一个的循环嵌套中continuebreak

 

Switch

控制因子是整数,即可以是bytecharshortint,但不能是boolean表达式。

(By wind5shyhttp://blog.csdn.net/wind5shy)

 

第四章初始化与清除

(By wind5shyhttp://blog.csdn.net/wind5shy)

重载

根据参数类型,个数,和顺序来区分(编译器中是把方法的名称与参数列表一起作为方法的真正名字,如aint ichar c)在编译器中的名字就是a_int_char)。返回值不能区分。

 

构造器

n        一种特殊方法,虽然与普通方法不一样,但本质还是方法。

n        保证对象被调用前已初始化即将创建和初始化被绑定到一起,无返回值。

n        构造器里可以有return,但return后不能有值。

n        构造器中可以调用构造器,但只能调用同一类的构造器一次,且调用需写在最开始处。

n        构造器其实是static方法,其static声明是隐式的,因为构造器显然都是针对类的方法,从使用方法上也可以看出来。

n        构造器不能被继承,每个子类都要重新定义自己的构造器(不定义系统自动提供默认构造器)。

 

“这与返回值为空(void)明显不同。对于空返回值,尽管方法本身不会自动返回什么,但你仍可选择让他返回别的东西。构造器则不会返回任何东西,你别无选择。”这段话理解如下:方法前面放一个mark(如voidint等),就是告诉编译器我是成员方法,可以有返回值,可以是int,也可以不返回(如void有说法是void其实也有返回值,是空值,但我试过在void方法里写return null是不行的?),这就是选择权。如果没有mark,就是说我是构造方法,没有选择返与不返的权利。如

public class A {

   public int A() {

      System.out.println("OK");

      return 0;

   }

 

   public static void main(String[] args) {

      new A();

   }

}

这个程序不会打印OK,因为编译器把public   int   A(){}当成成员方法,而不是构造方法。

 

New表达式确实返回了对新建对象的引用,但构造器本身没有任何返回值。”这句话我的理解如下:Object ob = new Object()new Object()实际上是两部分,Object()(构造器)没有返回值,ob得到的引用是new通过某种机制作用到构造器上产生的。

 

this只能在方法内用,表示调用该方法的对象的引用静态方法里不能使用this,因为静态方法不与对象相关。所以一般来说静态方法里不能访问非静态方法和成员,除非给将对象引用作为参数传给静态方法,然后通过这个引用来访问非静态方法与成员。(更具体更底层的原理参见我的博客中《JVM内存管理的角度谈谈静态方法和静态属性》一文:http://blog.csdn.net/wind5shy/archive/2009/01/14/3776931.aspx。)

 

finalize()

n        在调用gc(垃圾回收器)前调用相应对象的finalize()做必要的资源清理工作,如释放I/O,因为gc只负责普通内存清理(通过本地代码分配的内存gc就无能为力,这些内存就需要用finalize来清理)。

n        JVM执行finalize()时间不确定甚至可能不执行,执行后gc也不一定马上会执行,因为不到内存不足的时候JVM是不会关心垃圾处理的。(API解释:finalize的常规协定是:当 JavaTM虚拟机已确定尚未终止的任何线程无法再通过任何方法访问此对象时,将调用此方法在启用某个对象的finalize()后,将不会执行进一步操作,直到 Java 虚拟机再次确定尚未终止的任何线程无法再通过任何方法访问此对象finalize()中抛出的任何异常都将被忽略。由于以上原因除本地代码的情况外应尽量避免使用。

n        显式调用finalize可以确保其执行,以上的内容是针对finalize()是否被系统自动调用的情况。

n        finalize()可以采取任何操作,其中包括再次使此对象对其他线程可用;对于任何给定对象,JVM最多只调用一次finalize()

 

初始化

初始化的目的:对于基本类型来说,初始化是为其赋初值;对应对象来说,是将声明的引用和某个对象关联起来。注意,此时并不一定要新建一个对象。

 

基本类型的对象成员:会被JVM自动初始化且不管是否手动初始化(包括直接赋值与构造器初始化)并在手动初始化之前进行。

 

顺序:先静态成员后非静态成员,再按各自定义顺序初始化。所有成员都会被任何方法(包括构造器)调用前被初始化。

 

“静态初始化只有在必要时刻才会进行静态对象不会再次被初始化”这话理解如下:1、程序中初始化静态对象的代码只有在这些对象会被用到的情况下才会执行,如果对象根本不被用到,代码就不会被执行,在程序中其实也没有意义,如作者所举的例子(个人认为作者这种提法很容易造成困惑,特别是前面提到静态初始化会首先被执行)。2、因为静态成员是采用静态储存,其地址在程序运行期间不会改变,所以一旦初始化之后成员的值会一直存在并且通过固定的地址就可以访问,无需再次进行初始化。

 

块初始化:写在类的初始化位置(定义成员与构造器所处的位置),如果写在方法内就是赋值了。

 

数组

基本类型数组可以当作对象,所以可以用new来初始化,也可以用类似C的方法;对象数组用new初始化后也只是一个仅包括该对象应引用的数组,需要给每一个引用赋值。

(By wind5shyhttp://blog.csdn.net/wind5shy)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值