分享

读《Thinking in Java》第4版笔记(下)

 禅悟我心 2018-02-03

21. 用抽象类还是接口?

如果事先知道某个类会成为基础类,那么第一个选择就是把它变成一个接口。只有在必须使用方法定义或者成员变量的时候,才应考虑采用抽象类。

22.注意根据Java 命名规则,static final修饰的基本数据类型(亦即编译期常数)应全部采用大写字母(用下划线分隔单个标识符里的多个单词)。

23.字段的初始化时机是在类加载时,也就是在访问字段之前就初始化了。

static字段和代码块会先于非static字段和代码块加载。静态变量和静态代码块的加载顺序由编写先后决定。

24.内部类因为有外部类的引用,可以直接访问外部类的成员变量,private也可以。这是编译器帮我们实现的。

25.由于C++的vector不进行范围检查,所以访问速度较快——在Java 中,由于对数组和集合都要进行范围检查,所以对性能有一定的影响。

26. 自动转换字符串技术

一旦编译器碰到一个字串,后面跟随一个“+”,就希望后面又跟随一个字串。这里编译器对“+”的处理是创建一个StringBuilder对象,用append()方法拼接两个字符串。

如果+的后面是一个对象,那么自动调用append(Object obj),底层方法是obj.toString();如果+的后面是基本数据类型,就调用append(相应数据类型)。

27.TreeSet是用红黑树排序的有序Set。

28.创建不可修改的集合对象。

Collection c = new ArrayList();

...

c = Collections.unmodifiableCollection(c);

Map m = new HashMap();

...

m = Collections.unmodifiableMap(m);

29. 创建线程安全的集合对象

Collection c = Collections.synchronizedCollection(new ArrayList());

List list = Collections.synchronizedList(new ArrayList());

Set s = Collections.synchronizedSet(new HashSet());

Map m = Collections.synchronizedMap(new HashMap());

实现线程安全的原理是,方法用了synchronized关键字。

30.Throwable 对象有两种常规子类。其中,Error 代表编译期和系统错误,我们一般不必特意捕获它们(除在特殊情况以外);Exception 是可以从任何标准Java 库的类方法中抛出的基本类型。

31.自定义异常类

class MyException extends Exception {

public MyException() {}

public MyException(String msg) {

super(msg);

}

}

32.对象序列化可将对象转换成一系列字节,并可完全恢复回原来的样子。这一过程亦可通过网络进行。这意味着序列化机制能自动补偿操作系统间的差异。

为防止对象的敏感部分被序列化,一个办法是将类实现Externalizable。这样,没有任何东西可以自动序列化,只能在writeExternal()明确序列化那些需要的部分;

若操作的是一个Serializable 对象,所有序列化操作都会自动进行。为解决这个问题,可以用transient逐个字段地关闭序列化。

33.Class的newInstance()方法是克隆clone()一个对象的另一种手段。

两者是有区别是,利用newInstance()可在没有现成对象供“克隆”的情况下新建一个对象。

34.protected修饰的成员或方法的可见性,要分子类和超类是否在同一个包中。

与基类不在同一个包中的子类,只能访问自身从基类继承而来的受保护成员,而不能访问基类实例本身的受保护成员。在相同包时,protected和public是一样的。

35.实现Cloneable接口的意义

一个类的对象能调用clone()方法的前提是实现了Cloneable接口,然而Cloneable接口没有定义方法。实现Cloneable接口的意义是:

可用instanceof关键字判断对象是否能够克隆;

if(myHandle instanceof Cloneable)

对于不想被克隆的对象可以抛出CloneNotSupportedException异常。

protected native Object clone() throws CloneNotSupportedException;

36. String是final类

String一旦修改,就返回一个新的String对象。若内容没有改变,则只返回指向原来那个String的引用。

声明为final是不想被修改,作为工具类一来效率会提升,再者提高了安全性。因为底层代码调用了本地方法,与操作系统交互,如果可以随意改,势必降低安全性。

37.线程的四个状态:创建、阻塞、运行、死亡。

38.线程的优先级意味着线程的“重要程度”。

若线程的优先级较低,只不过表示它被准许运行的机会小一些而已。

39.线程组中的线程可以修改组内的其他线程;我们只能降低一个线程组的最大优先级,而不能提高它;一个子组的最大优先级在任何时候都只能低于或等于它的父组的最大优先级。

至此《Thinking in Java》读书笔记完结了,但是学习依然要继续。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多