读Thinking in Java (备忘) - 我们不孤单 - CSDNBlog

来源:百度文库 编辑:神马文学网 时间:2024/04/25 18:07:34

测试对象的等价性:P97

 

计算机表示的数肯定是离散的。比如Java0.01.0之间的全部双精度小数只有2^62  P137

 

组合接口时名字冲突:P270

 

类型安全的群组常量:P272

 

访问权限包括:类的访问权限和其成员(域和方法)的访问权限;事实上,访问权限除了publicprivateprotected外还有一个隐形而重要的--缺省--包访问权:P198

 

一个类的main()方法是可以被另一个类所调用的,因为它可以视为一个普通的静态方法而已:P207

 

如果一个类的构造方法是private,则同时也意味着它是不可继承的!P194,注3

 

更正以前一个模糊认识:如果对一个类没有显式定义constructor,则编译器会调用默认constructor,如果显式定义了constructor则编译器不会认为存在默认constructor;因此,如果父类显式定义了constructor,子类的constructor里一定要显式地调用super()P232,练习56

 

关于static修饰类型初始化特征的一个生动例子:P233,练习18

 

构造器的调用顺序有个很好的例子来演示说明:P250

 

通常异常类型的名称就是唯一的信息,而异常对象本身不包含任何有意义的内容(道出了异常的本质,异常其实就是对错误信息的描述性的类/对象):P314

 

异常说明,编译期被强制检查的异常(checked exception)P320

 

重新抛出异常:P322

 

Throwable(Error+Exception+RuntimeException)P329

 

异常的限制(用于继承/实现):P337

 

把“被检查的异常”转换为“不检查的异常”(防止编程时在catch()块中无意中吞下异常):P349吃掉):P349

 

反射的本质(及其与传统RTTI的区别):P373尾,P374

 

Static数据是对于一个类及其对象家族的公有资源,在生成对象之前即被加载初始化,没有显式初始化的会被赋予默认值;final数据常量对于一个所有者对象来说是不可改变的;要求在使用前必须用常量或非常量表达式对其显式赋值,位置只能在定义时或构造函数内!一个既staticfinal的数据可想而知在表达常量方面有不凡的用途。

 

private修饰的方法隐含都是final的(想想为什么),因此给private方法增添final没什么意义;把一个类声明为final,由于final已经禁止继承了,因此给成员方法添加final修饰符也没有任何意义。

 

怎样作对象引用和引用之间的比较;怎样作对象和对象之间的比较??

 

java.util.Arrays包含了一系列处理数组(包括基本类型数组)的静态方法。其中Arrays.sort()可以对数组进行排序:如果是对象数组则要求数组元素必须实现Comparable接口,根据重载的comparaTo(Object o)方法进行排序计算;对于基本类型数组则无此要求

 

Collections中的Comparator是如何实现的?

 

Iterator特点:一次取出容器中的所有元素,然后一个一个进行处理:P419

 

一个精辟的小例子:打印对象的地址:P421

 

容器类家族类图:P423

 

定义在Object中的方法:equals(),toString(),hashCode()wait(),notify()

 

使用HashMap时,用Stringkey是最方便的。如果要用自己的类作keyHashMap的构造方法接受的参数都是Object型),就一定要重载hashCode()equals()方法。

 

Collection的子类的构造函数接口都提供了Collection类型的参数,即,任何一个子类,可以调用带Collection参数的构造方法,用一个Collection类型的引用来得到本类的一个实例。

 

调用sleep()的时候锁并没有被释放,wait()方法则释放了锁。实际上只能在同步控制方法或同步控制块里调用wait(),notify()notifyAll(),因为不用操作锁,sleep()可以在非同步控制方法里调用。调用wait(),notify()notifyAll()的线程在调用这些方法前必须“拥有”对象的锁:P625

 

sleep()可使优先级低的线程得到执行的机会,当然也可以让同优先级和高优先级的线程有执行的机会;yield()只能使同优先级的线程有执行的机会;我理解,yield()之后该线程又回到就绪状态等待调度,那么低优先级的线程同样竞争不过刚刚出让cpu时间的那个线程;sleep(0)会得到同yield()一样的效果。

 

Sleep()yield()都不会出让对象的锁;因此进行进程通信,最好用wait()notify()notifyAll()

 

反射的神奇之处在于它能自动得到一个类的所有方法,而不用遍历类的整个继承层次并在每个层次检查基类。所以,它为编程提供了极具价值并可以节省时间的工具;因为大多数Java方法的名称非常详细且具有描述性,所以你能查找出包含了你所感兴趣的关键字的方法名称。当你找到了所要找的方法,就可以在JDK文档里查看其细节了:P667

 

JTextField可以实现两种性质的事件,普通的ActionListener和与文本有关的DocumentListenerP680

 

JList与之类似,要实现选中某条目的事件要用ListSelectionListener来监听:P691

 

使用列表模型(list model)的唯一原因是,可以在程序执行的过程中操纵列表框:P691

 

原来Swing中凡是文本的地方都可以接受HTML文本:P710

 

注意容器类validate()的用法:P710

 

当你实现Runnable的时候,你得到的不是一个Thread,而只是一个具有run()方法的类。所以你必须把Runnable对象传递给Thread构造器,才能明确创建一个Thread对象,之后才能调用start()P738

 

我们可以用每个Logger对象注册多个处理器。当日志请求到达Logger时,它告知所有向它注册的处理器,只要Logger的日志级别高于或等于处理器的日志请求级别。(页脚有注:这是观察者设计模式。日志机制完全可以类比于事件机制,其中LogRecord相当于Event):P808