前言
作为一个搞了几年Java的老朋友而言,几乎都是摸着石头过河,许多Java方面的技术细节,只知其然,不知所以然。从前做过一些框架和底层的JAVA设计和开发,但是有些技术细节不够严谨,所以有必要在理论上丰富一下自我。先看看TIJ,然后找一些设计模式来研读一下。
Bruce Eckel所写,侯建所译的Thinking系列,大名鼎鼎,但是买来之后一直束之高阁,等到今天再来翻看,Thinking In Java已经到了第4版了,Java已经进入了1.5,所以在网上找了一份英文原版(www.bruceeckel.com)和shhgs的中文版(http://www.wgqqh.com/shhgs/tij.html)进行对照研读,此过程中,列出了若干问题,Blog之日后自省. /WiseKing 2005/11
chapter I Introduction to Objects
1。如何理解对象的状态(state),行为(behavior)和身份(identify)?
2。理解类的重用方式:合成(Composition)和继承(inheritance)?
3。interface与abstract class?
4。java语言的容器类(Container)包括啥?通常用哪个类取出容器内的元素?
5。java中的类都是单根继承的吗?
6。啥是覆盖overriding,重载overloading?
chapter II Everything is an Object
7。指向对象的是指针(pointer),还是引用(reference)?
8。Java中的内存是如何分配的?数据存储的6个地方是哪里?
9。原始(primitive)类型都有哪些?他们是在堆(heap)中分配还是栈(stack)中分配?char是多少位(bit)的?
10。类(class)中的成员变量(fields)必须要附初值吗,如果是final的又将怎样?函数中定义的变量使用前必须要附初值吗?
11。用static定义类数据(class datas)与类方法(class methods)的理解?
chapter III Controlling Program Flow
12。equals和==在比较对象时候的区别,自定义的对象可以直接使用equals比较吗?
13。什么是逻辑运算符的短接(short circuiting)?
14。移位运算符有哪些?,>>>是啥?
chapter IV Initialization & Cleanup
15。编程规范上要求类的成员函数名首字母都要小写,除了那种函数?
16。对原始类型参数的重载函数的调用规则是什么?
17。interface可以定义成员变量吗?如果能有啥要求?
18。如何在构造函数里正确地调用构造函数?
19。静态(static)函数只能调用静态函数或静态成员变量?
20。final, finally, finallize的区别?
21。如何理解java“传送带”方式的内存分配?
chapter V Hiding the Implementation
22。谈谈java中的访问控制符,啥是package访问权限(package access, 有时也称作友员friendly)?
23。下面的代码中i和j的访问控制权限是一回事吗?friendly可以被继承类访问吗?
public class Test{
int i;
private int j;
}
24。类只有两种访问权限,是哪两种?如果不希望别人访问这个类,怎么办(Singleton)?
chapter VI Reusing Classes
25。基类中的private方法如果在继承类中被实现,则其不是覆盖,也不是重载,问什么?
26。在构造派生类的过程中,基类的构造函数总是先得到调用,然后再初始(且只初始)该派生类的成员变量,最后调用该派生类的构造函数正文?例子:
class Meal {
Meal() { System.out.println("Meal()"); }
}
class Bread {
Bread() { System.out.println("Bread()"); }
}
class Cheese {
Cheese() { System.out.println("Cheese()"); }
}
class Lettuce {
Lettuce() { System.out.println("Lettuce()"); }
}
class Lunch extends Meal {
Lunch() { System.out.println("Lunch()"); }
}
class PortableLunch extends Lunch {
PortableLunch() { System.out.println("PortableLunch()");}
}
public class Sandwich extends PortableLunch {
private Bread b = new Bread();
private Cheese c = new Cheese();
private Lettuce l = new Lettuce();
public Sandwich() {
System.out.println("Sandwich()");
}
public static void main(String[] args) {
new Sandwich();
}
}
27。如果在基类中调用抽象方法(该方法在继承类中实现),调用顺序又如何?例子:
abstract class Glyph {
abstract void draw();
Glyph() {
System.out.println("Glyph() before draw()");
draw();
System.out.println("Glyph() after draw()");
}
}
class RoundGlyph extends Glyph {
private int radius = 1;
RoundGlyph(int r) {
radius = r;
System.out.println(
"RoundGlyph.RoundGlyph(), radius = " + radius);
}
void draw() {
System.out.println(
"RoundGlyph.draw(), radius = " + radius);
}
}
public class PolyConstructors {
public static void main(String[] args) {
new RoundGlyph(5);
}
}
chapter VII Polymorphism
28。如何正确理解多态?
29。什么是多态中类和基类之间的上传(up casting)和下传(down casting)?
chapter VIII Interfaces & Inner Classes
chapter IX Error Handling with Exceptions
30. Error和Exception区别?
31。在异常处理中,一个try可以跟随多个catch,但每个catch都有一个且只能有一个特定类型的参数
32。Exception的基类是啥?该类有一个著名的方法printStackTrace()
Throwable<--Exception<--OthersException.
33。throws与throw区别?finally和final的区别?
34。编译时所有的异常都需要在代码中进行处理,除了一类异常,是啥?
RuntimeException.
35。列举常见的RuntimeException?
NullPointerException, ArrayIndexOutOfBoundsException,..
Chapter X Detecting Types
36。如何使用instaceof, calss.forName()?
37。会使用reflect吗?
Chapter XI Collections of Objects
38。数组与其它容器的区别体现在三个方面:效率,类型可识别和可持用原数据类型(primitives),那么由此带来的限制是什么呢?(不可动态扩展,类型固定)
39。数组需要两极构造,一是指数组长度空间的构造,二是指数组单元的构造
40。java2的容器根据所持有对象的方式分为两类:Collection(有一定规律的独立元素)和Map(存储键-值对应的pair), 在Collection中存在两个概念List和Set, List强调顺序性,而Set强调不能保存重复单元
41。熟悉一下JDK(1.4)的容器类的关系图,这样你就会知道HashMap, Vector, ArrayList从哪里继承而来
42。ArrayList和LinkedList的区别,各在什么时候使用最好?
Chapter XII The Java I/O System
43。懂得使用这些类File, InputStream, outputStream, System.in, System.out,
44。什么是序列化Serializable,Serilizable和Externalizable的区别?
Chapter XIII Concurrency
45。定义的线程类可以是继承Thread基类或者实现Runnable接口(如果该类还需要继承别的类),对于Thread类,启动线程的方法是? 我们的程序中要实现的方法是?(start(), run())
Runnable也要实现run()方法,并且调用时候要使用(new Thread(new RunnableThread(),.)).start()
46。线程中的sleep()和yield()方法
47。线程的优先级priority
48。什么是守护线程(Daemon-thread)?如何设置一个线程为守护线程?
49。关键词synchronized的正确理解与使用,关键段(有时你只需要防止多个线程同时访问方法中的某一部分,而不是整个方法)?
50。线程间的协作wait(),notify(),interrupt()