读Thinking in Java (备忘)

来源:百度文库 编辑:神马文学网 时间:2024/04/29 16:46:40
测试对象的等价性:P97
计算机表示的数肯定是离散的。比如Java中0.0和1.0之间的全部双精度小数只有2^62个  P137
组合接口时名字冲突:P270
类型安全的群组常量:P272
访问权限包括:类的访问权限和其成员(域和方法)的访问权限;事实上,访问权限除了public、private、protected外还有一个隐形而重要的--缺省--包访问权:P198
一个类的main()方法是可以被另一个类所调用的,因为它可以视为一个普通的静态方法而已:P207
如果一个类的构造方法是private,则同时也意味着它是不可继承的!P194,注3
更正以前一个模糊认识:如果对一个类没有显式定义constructor,则编译器会调用默认constructor,如果显式定义了constructor则编译器不会认为存在默认constructor;因此,如果父类显式定义了constructor,子类的constructor里一定要显式地调用super():P232,练习5、6
关于static修饰类型初始化特征的一个生动例子:P233,练习18
构造器的调用顺序有个很好的例子来演示说明:P250
通常异常类型的名称就是唯一的信息,而异常对象本身不包含任何有意义的内容(道出了异常的本质,异常其实就是对错误信息的描述性的类/对象):P314
异常说明,编译期被强制检查的异常(checked exception):P320
重新抛出异常:P322
Throwable(Error+Exception+RuntimeException):P329
异常的限制(用于继承/实现):P337
把“被检查的异常”转换为“不检查的异常”(防止编程时在catch()块中无意中吞下异常):P349吃掉):P349
反射的本质(及其与传统RTTI的区别):P373尾,P374首
Static数据是对于一个类及其对象家族的公有资源,在生成对象之前即被加载初始化,没有显式初始化的会被赋予默认值;final数据常量对于一个所有者对象来说是不可改变的;要求在使用前必须用常量或非常量表达式对其显式赋值,位置只能在定义时或构造函数内!一个既static又final的数据可想而知在表达常量方面有不凡的用途。
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时,用String作key是最方便的。如果要用自己的类作key(HashMap的构造方法接受的参数都是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和与文本有关的DocumentListener:P680
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