哈哈,在论坛搜索一下能出来一大堆。我比较欣赏的有:Java How to program
The Java Programming Language
Thinking in Java
Core Java
Java 2 Bible全都是经典啊。

解决方案 »

  1.   

    http://www.csdn.net/expert/topic/1094/1094260.xml?temp=.2860834
    正在讨论同样问题的帖子。
      

  2.   

    向大家推荐国内首本权威的Java认证书<<Java 2认证考试指南与试题解析>>, 作者结合自己在Java 应用软件开发中的多年实践经验,根据Sun对Java认证程序员的要求,深入地剖析了Java语言的精髓,细致地分析了SCJP考察的要点,指出考生容易犯错误的地方,并且对大量的SCJP试题进行分类归纳。因此,你既可以把本书作为考试的指南,也可以把它作为学习Java语言的参考书,系统深入地掌握Java语言。
       本书覆盖了SCJP的各个考察点。其中第一部分介绍了SCJP认证的相关信息和参加考试的诀窍。第二部分介绍了Java的基本知识,在每一小节中都细致全面地归纳了各个考察要点,并且针对各个考察要点列举了典型的试题进行解析。这一部分,不但对参加SCJP考试有极大的帮助,也是掌握Java语言精髓的最好资料。最后一部分,给出了精心编排的8套模拟题,让考生巩固知识以及进行考前自测。附带光盘中提供了考试模拟器.
       该书由上海科技出版社出版,价格为88元.您可以到上海科技出版社出版网页上获得更多信息
    http://www.sstp.com.cn/newbook/nb20028c.htm.
    在上海书城有此书购买. 
    ISBN 7-5323-6627-8
    此外,如果你和作者本人亲自联系,可以获得此书的部分电子样稿,并获得8折的优惠.作者的联系方式是
    [email protected]  
    or
    [email protected]以下内容摘自<<<<Java2认证指南与试题解析>>一书:1.6  如何准备考试 
    1.6.1  SCJP考试题型 
    SCJP考试的大部分题目是选择题,另外有一小部分简答题和拖拽匹配题。参加考试时,从考试题目的形式上,明显可以看出试题是单选题还是多选题。如果题目的选择项是单选框(Radio Button),那么就只有一个答案;如果题目的选项形式是多选框(Check Box),那么就至少有一个答案。 
    SCJP考试一共有59道题目。在任何一家普尔文授权的考试中心都可以进行考试。普尔文授权的考试中心可以到1-4节中的Sun授权的ASEC-JAVA培训中心去查询。SCJP的考试号为:310-025。 
       通过认证的分数:答对61%以上的题目 考试时间:180分钟 
    考试费:150美元(人民币为1250元) 1.6.2  SCJP考试中的注意点 
       1.要有好的教材 
    好的教材会强调考试难点和容易犯的错误,并且有模拟题和讲解。由于Java的风行和Java认证的价值,国外已经有几本优秀的Java考试辅导书。而在国内,专门针对Java考试的中文书几乎没有。本书全面透彻地讲解了Java语言的各个知识点,并解析了大量具有典型性的SCJP试题,旨在让读者在真正掌握Java语言的同时,轻轻松松地通过SCJP认证,一举两得,相信它会对你有很大帮助。 
       2.深刻理解面向对象的思想 
    Java是一种纯粹的面向对象的程序设计语言。在SCJP考试中,对象与类是考试的重点和难点,涉及到很多的概念和语法规则,比如继承、方法重载、方法覆盖、多态、动态绑定等。在正式使用Java进行开发之前,必须将我们的思维方式转入一个彻底的面向对象的世界。做不到这一点,就无法体会Java语言的精髓,写不出地道的Java程序。当然,你也无法彻底理解Java中的基本概念以及概念之间的联系与区别。只有深刻理解了面向对象的思想,才能够真正掌握Java的灵魂。 
       3.对概念细节的精确把握 
    对于每一个考察点,考试中几乎都有体现。SCJP的考察点相当细致,Sun公司公布的考试大纲的考察要点,比如命令行参数、应用程序的main方法的声明方式、包和文件的命名规则、标识符的合法性、子类和父类的构造方法的关系、访问修饰符等许多语言的细微点,SCJP考试中都有可能考到。因此在学习Java语言时要精确把握概念细节,不能模模糊糊,似是而非。 
       4.系统地学习,大量地上机实习 
    程序设计是一项实践性很强的技术,只有上机实践,才能深刻地理解并灵活地运用课本中的理论,达到增长技能的目的。你可以亲自运行测试模拟题中提供的源代码,加深影响,还可以举一反三,改变一下源代码,看看又会出现什么结果,不断地归纳总结,这样在你的脑海里就会逐渐形成完整周密的Java体系结构。 
       5.适应上机考试的形式 
    SCJP考试的形式是Windows的图形界面,有一些题目题干和选项较长,要通过右侧的滚动条才能够看到全部的题目。因此,你必须确信读完了全部的题目,如果因为没有用滚动条来看清剩下的几行而导致答错题目那就太冤枉了,所以要极力避免因为粗心而导致的失误。 
    考试一共59道题目,全部考试时间为120分钟,平均每道题目两分钟。考试系统允许你向前检查和更改你的答案,当你全部回答完后,你也可以从头检查,或者仅仅检查你没有把握的题目。建议你在考试中,在没有把握的题目上作一个标记,等到完成全部题目之后,再回过头来仔细分析。仔细检查完毕,并且对所作的解答很有把握后,你就可以按下确认结束考试的按钮,系统当时就会给出你的考试分数,你立即就可你知道是否通过了考试。此时,会打印出一份分数通知单。如果通过,那么恭喜你了,几个星期以后,你会收到一份正式的Sun Microsystems 总公司寄发的Sun Certified Programmer for the Java2 Platform资格证书和徽标,并有权将通过Sun认证的标记印在个人名片上,作为个人技术能力的肯定。 
       6.从考察点出发解题 
    考试时用的全是英语,而且有大量的Java程序源代码。有些SCJP试题会采用声东击西之术,加一些复杂的干扰代码,故意吸引考生的注意力,使得考生费力费时地去读懂源代码,却忽略了真正的问题所在,钻入了题中设置的圈套。如果你直接从可能考察的知识点出发,来分析代码,就可以避免处于被动地位。下面以试题1为例来说明。 
       试题1:What will be the result of attempting to compile and run the following code?    public class Sample { 
       public static void main(String args[]) { 
      int i = 4; 
      float f = 4.3; 
       double d = 1.8; 
      int c = 0; 
       if (i == f) c++; 
       if (((int) (f + d)) == ((int) f + (int) d)) c += 2; 
       System.out.println(c); 
     } 
       } a) The code will fail to compile. 
    b) 0 will be written to the standard output. 
    c) 1 will be written to the standard output. 
    d) 2 will be written to the standard output. 
    e) 3 will be written to the standard output. 
       答案:a 
       解析:以上代码中if表达式写得很复杂,制造假相,使你误以为本题旨在计算if表达式的值。实际上当你读到“float f = 4.3”这个语句就应该敏感地发现问题所在(double类型直接数赋值给float类型变量应该通过强制类型转换),不必细看下面的源代码,就可以看提供的选择项了。 
    7. 看清试题,警惕陷阱 
    Java的考察点非常细致。SCJP试题会提供一些似是而非的源代码,考生必须非常清晰地把握各种概念细节,认真细心地阅读试题,才能敏锐地察觉考题的用意,绕过题中的陷阱。下面以试题2和试题3为例来说明。 
    试题2:What happens when you try to compile and run the following program?    class Mystery { 
       String s; 
       public static void main(String[] args) { 
      Mystery m = new Mystery(); 
       m.go(); 
       } 
       void Mystery() { 
       s = "constructor"; 
       } 
       void go() { 
       System.out.println(s); 
       } 
       } Select the one right answer. 
    a) this code will not compile 
    b) this code compiles but throws an exception at runtime 
    c) this code runs but nothing appears in the standard output 
    d) this code runs and "constructor" in the standard output 
    e) this code runs and writes "null" in the standard output 
       答案:e 
       解析:以上试题中故意设置了一个陷阱,定义了一个貌似构造方法的Mystery()方法。由于它被声明了返回类型,所以其实不是构造方法。new Mystery()语句其实调用的是类Mystery的缺省构造方法。 
    试题3:What will be the result when you try to compile and run the following code? 
      private class Base{ 
           Base(){ 
     int i = 100; 
       System.out.println(i); 
        } 
     }    public class Pri extends Base{ 
           static int i = 200; 
           public static void main(String argv[]){ 
     Pri p = new Pri(); 
       System.out.println(i); 
        } 
      } a) Error at compile time 
    b) 200 
    c) 100 followed by 200 
    d) 100 
       答案:a 
       解析:试题3看上去好像在考察成员变量i和静态变量i的作用域。实际上代码的第一行中将private修饰一个外部类(top level class),将导致编译出错。 
    8. 综合运用知识,不顾此失彼 
    Java的考察点很多,它们不是彼此孤立的,这些考察点既有本质的差别,又有相似之处,它们相互联系,形成完整的Java体系结构。有时一道SCJP试题会涉及多个考察点,所以在解题中,应该综合运用各种知识,联系地看问题,不要顾此失彼。下面以试题4和试题5为例来说明。 
    试题4:Given the following code, which method declarations, when inserted at the indicated position, will not cause the program to fail compilation?    public class Qdd1f { 
       public long sum(long a, long b) { return a + b; } 
       // insert new method declaration here 
       } a) public int sum(int a, int b) { return a + b; } 
    b) public int sum(long a, long b) { return 0; } 
    c) abstract int sum(); 
    d) private long sum(long a, long b) { return a + b; } 
    e) public long sum(long a, int b) { return a + b; } 
       答案:a,e 
       解析:试题4的考察点很明显,让考生从选项中选出合法的重载方法。选项c中的抽象方法也是sum(long a, long b)的一个重载方法,但是不能加到以上代码中,因为类Qdd1f不是抽象类,不能包含抽象方法。所以这道题考察了两个知识点:一个是方法重载的规则,另一个是非抽象类中不能有抽象方法。 
    试题5:What wi