第1章 对象导论
l 面向对象特性:万物皆为对象;程序是对象的集合,它们通过发送消息来告知彼此所要做的;每个对象都有自己的由其他对象所构成的存储;每个对象都拥有其类型;某一特定类型的所有对象都可以接收同样的消息。(对象具有状态、行为和标识)
第2章 一切都是对象
l Javadoc用以注释,输出为html,命令以/**开始,以**/结束。独立文档标签以@开头,置于注释行最前面。注释中可以用html标签以方便查看。Javadoc标签:1、@see引用其他类;2、{@link package.class#member label}用于行内;3、{@docRoot}文档根目录相对路径;4、{@inheritDoc}继承文档;5、@version版本信息;6、@author作者信息;7、@since最早Java版本;8、@param方法参数列表;9、@return返回值;10、throws异常;11、@deprecated过时。
第3章 操作符
第4章 控制执行流程
l 逗号操作符:for循环中隔开。
l 吸血鬼数字
第5章 初始化与清理
l static就是没有this的方法。
l finalize():对象可能不被垃圾回收,垃圾回收并不等于“析构”,垃圾回收只与内存有关。之所以有finalize()方法是因为在分配内存的时候可能采用了类似C语言中的做法,而非Java的通常做法,主要是Native Method的非Java代码。finalize()相当于只是标记为可以被回收。
l 垃圾回收器:引用计数,停止-复制,标记-清扫,分代,自适应。
l 可变参数列表,void print(Object... args);原先是用数组的方式来做的。只在重载方法的一个版本上使用可变参数列表,或者压根不用它。
l 枚举:toString()显示enum实例的名字,ordinal()表示声明顺序,values()返回enum常量的数组。
第6章 访问权限控制
l 起因:变动的事物与不变的事物区分开来。
l public、protected、private、包访问权限。类库设计员尽量都private。
第7章 复用类
l 组合,继承,代理(继承和组合的中庸),同时使用组合和继承。
l 向上转型,final变量,final方法。
第8章 多态
l 多态通过分离做什么和怎么做,从另一个角度将接口和实现分离开来。
l 子类基类的初始化构造问题。
l 当使用现有类来建立新类时,应该首先考虑组合,尤其是不能十分确定应该使用哪一种方式时,过多的继承可能会加重设计负担变得复杂。
第9章 接口
l 接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法。
l 接口与其方法默认且必须是public的。
l 使用接口的核心原因:为了能够向上转型为多个类型(以及由此带来的灵活性)。使用接口的第二个原因:(同抽象类)防止客户端程序员创建该类的对象并确保这仅仅是建立一个接口。
l 通过继承来扩展接口。
l 应该优先选择类而不是接口,
第10章 内部类
l 将一个类的定义放在另一个类的定义内部,称为内部类。可以把一些逻辑相关的的类组织在一起,并控制内部类的可见性。
l 内部类拥有外围类所有元素的访问权。内部类如果需要生成对外部类对象的引用,可以使用外部类名字后加.this。创建内部类对象则需要外部类对象.new后加内部类名字。
l 在方法和作用域内的内部类。
l 匿名内部类。
l 嵌套类:static内部类。可放在接口中。
l 使用内部类最吸引人的原因:每个内部类都能独立继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都是没有影响的。使得多重继承的方案变得完整。
l 闭包closure是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。内部类是面向对象的闭包。
l 继承类不会覆盖内部类,但可以明确地继承某个内部类。
l 局部内部类,不能有访问说明符。
第11章 持有对象
l Java容器类库的用途是“保存对象”,分为Collection(独立元素序列)和Map(一组成对的键值对对象)。
l List:ArrayList,LinkedList。迭代器:Iterator,ListIterator。Stack。Set:HashSet,TreeSet,LinkedHashSet。Map:HashMap、TreeMap、LinkedHashMap。Queue:PriorityQueue。
l 新程序中不应该使用过时的Vector、Hashtable、Stack。
第12章 通过异常处理错误
l Java的基本理念是“结构不佳的代码不能运行”。
l 使用异常处理能够降低错误处理代码的复杂度。
l 异常处理理论上有两种基本模式:Java支持终止模式,恢复模式(调用方法修正或者把try放在while循环中直到满意,但是会时耦合性过高)。
l 创建自定义异常。
l 栈轨迹printStackTrace()的信息可以用getStackTrace()来获取。Catch块中可以重新抛出异常。
l RuntimeException是特例,代表编程错误。
l Finally块用来关闭释放等操作。Finally总是会执行。
l 异常限制。
l 构造器中的异常。
l 原则:只有在你知道如何处理的情况下才捕获异常。
l 应该在以下情况使用异常:1、在恰当的级别处理问题(在知道如何处理的地方才捕获异常);2、解决问题并重新调用产生异常的方法;3、进行少许修补,然后绕过异常发生的地方继续执行;4、用别的数据进行计算,以代替方法预计会返回的值;5、把当前运行环境下能做的事情尽量做完,然后把相同的异常重抛到更高层;6、把当前运行环境下能做的事情尽量做完,然后把不同的异常重抛到更高层;7、终止程序;8、进行简化;9、让类库和程序更安全。
第13章 字符串
l String。Formatter。
l 正则表达式:需要着重动手尝试一下。
第14章 类型信息,需要重看
l 运行时类型信息使得你可以在程序运行时发现和试用类型信息。
l 向下转型,instanceof。多种Pet随机生成不同Pet。
l 反射。
l 动态代理。
第15章 泛型
l 一次调用返回多个值,使用泛型创建元组。
l EnumSet。
l 在泛型代码内部,无法获取任何有关泛型参数类型的信息。(被java擦除了)
l 使用
l 泛型通配符,如List extends Fruit> list = new ArrayList
l 无界通配符>
l 使用带有泛型类型参数的转换或instanceof不会有任何效果,但是可以使用Object来存储然后再转型为T。
l 自限定的类型:class SelfBound
l 混型。
第16章 数组
l 数组与其他类的容器之间的区别:效率、类型和保存基本类型的能力。在Java中,数组是一种效率最高的存储和随机访问对象引用序列的方式。缺点是大小被固定了。
l Arrays实用功能:equals()比较两个数组是否相等(deepEquals()用于多维数组),fill(),sort()用于对数组排序,binarySearch()用于在已排序的数组中查找元素,toString()产生数组的String表示,asList()接受任意的序列或数组转换为List容器。System.arraycopy()用来复制数组(比for循环复制快得多且对所有类型做了重载,不执行自动装包拆包)。
第17章 容器深入研究
l Java容器类包括如上图所示,以及Java Se5新添加:Queue接口,ConcurrentMap和ConcurrentHashMap,CopyOnWriteArrayList和CopyOnWriteArraySet,EnumMap和EnumSet。以及WeakHashMap等保存WeakReference的特殊Map。
第18章 Java I/O系统
l File类,既能代表一个特定文件的名称,又能代表一个目录下的一组文件的名称。File.list()方法获取目录列表。
l InputStream:ByteArrayInputStream、StringBufferInputStream、FileInputStream、PipedInputStream、SequenceInputStream、FilterInputStream(DataInputStream、BufferedInputStream、LineNumberInputStream、PushbackInputStream)。
l OutputStream:ByteArrayOutputStream、FileOutputStream、PipedOutputStream、FilterOutputStream(DataOutputStream、PrintStream、BufferedOutputStream)。
l InputStreamReader->Reader,OutputStreamWriter->Writer,FileReader,FileWriter,StringReader、StringWriter,CharArrayReader,CharArrayWriter,PipedReader,PipedWriter,FilterReader、FilterWriter、BufferedReader、BufferedWriter、PrintWriter、LineNumberReader、StreamToken、PushbackReader。
l RandomAccessFile:适用于由大小已知的记录组成的文件,需要知道文件排版才能知道如何操作。
l 标准I/O重定向,重定向到文件。
l 缓冲器:ByteBuffer、MappedByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer、ShortBuffer。
l 文件加锁。压缩:CheckedInputStream、CheckedOutputStream、DeflaterOutputStream、ZipOutputStream、GZipOutputStream、InflaterInputStream、ZipInputStream、GZipInputStream。
l 序列化:trsndient关键字防止被序列化。
l XML:javax.xml.*;以及ElliotteRusty Harold的开源库XOM类库www.xom.nu。
l Preferences API相对于对象序列化为更小的数据集合的存储。
第19章 枚举类型
l enum将一组具名的值的优先级和创建为一种新的类型。
l 基本上可以看做一个类,有origin()values()compareTo()。
l EnumSet、EnumMap。
l enum可以与其他功能如多态反省反射结合使用。
第20章 注解
l 注解为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据。
l Java内置注解:@Override、@Deprecated、@SuppressWarnings。四种元注解:@Target、@Retention、@Documented、@Inherited。
l 自定义注解。
第21章 并发
l java.util.concurrent包中的Executor。FixedThreadPool、ChchedTHreadPool、SingleThreadExecutor。
l 线程优先级setPriority(),后台线程setDeamon()。
l 方法:run()、yield()、join()、interrupt()、stop()、wait()、notify()、notifyAll()。
l 原子类:AtomicInteger、AtomicLong、AtomicReference。(锁更安全一些synchronized或者显示的Lock对象)
l 使用显式的Lock和Condition对象。BlockingQueue,CountDownLatch,CyclicBarrier,DelayQueue,PriorityBlockingQueue,ScheduledExecutor,Semaphore,Exchanger。
第22章 图像化用户界面
l 略