原文地址:http://bobcat.webappcabaret.net/javachina/faq/01.htm
小弟自娛自樂,翻譯的有些地方有些牽強,請大家幫忙校對,提出問題。如果有考SCJP的兄弟,可以幫忙校隊,或一起翻譯後面的幾篇,既學了Java,又對英語有點幫助.
SCJP Questions & Answers by Roseanne Zhang (1)
這個FAQ是我由Marcus Green's site 和其他一些網站上的發貼收集整理成的。在回答了一些問題之後我發現,很多問題都不斷地被重新提起。這是因爲不同的人處於SCJP考試複習中的不同階段,而且每天都有新人不斷加入。
我的目的是讓人們有地方可以找到這些答案,人們不需要再一次又一次重複回答同樣的問題。我並不想覆蓋有關SCJP的所有疑難,就讓JCHQ去做那個吧,這個FAQs會有點難度,當然並不是所有都這樣。
軟件的可用性是非常重要的,分析、設計、編程都是被髮明來做這個的,也是軟件的基本構成。設計模式是用來重用其他設計思想的。本頁面是用來重用我自己的答案的。希望這些資料能讓你學得更加容易。
我們一起來創造不一樣的世界吧!
新手問題
- Java是在印尼的一個美麗小島。參看: Java, Indonesia
- Java是一種咖啡的名字。
- Java是Sun的程序員在喝了太多咖啡之後發明的一種程序語言。 他曾經叫 Oak, 但是這個商標被另外一家公司註冊了,所以就改叫Java了,參看: Sun's official history
通過了programmer考試只是一個入門,別人會認爲你至少知道什麼是Java,會編譯Java程序,也許更多。
如果你沒在你的工作中用過Java寫代碼,通過了證明了你能用Java寫代碼。這個能力是比現實工作經驗次一等的。如果沒有任何Java或其他語言的編寫經驗,而要跳過developer考試直接考取Architect,我認爲那是瘋狂的!!!
如果你用Java編過代碼,直接去準備Architect考試,那會更合理。無論如何,SCEA價值還是頗高的,可以直接考取SCEA而不一定要先考取SCJP。
爲什麼大部分人直接跳過developer考試而直接考SCJA(舊考試體系中的)?就是因爲就是因爲原來的SCJA就像SCJP都是一些選擇題,相對容易過一些,還有一個原因,就是題庫的外泄導致他更簡單。
這也許是爲什麼Sun把SCJA改成SCEA.
我們有個SCJD Study Group. 如果你通過了SCJP,歡迎加入SCJD.
我的建議是別買任何考試軟件,恕我直言他們都沒什麼大用。
但你至少得有一本書,Bill Brogden的備考書籍是第一選擇.(PS:Bill沒有付我廣告費).找一本免費版本的Bruise Eckle的《Java編程思想》,如果你有錢的話,最好買一本(他也沒付我廣告費)。還有,學會用Sun的在線 "The Java Tutorial" ,這的很多問題都可以通過簡單的搜索Sun的這個免費教程獲得答案。
當做一些免費的或收費的測試卷的時候,把你不懂的真正搞懂。你不是隻爲考試而準備的,而是爲了你未來的面試、工作。讀書,然後一直寫代碼,code,code,code,知道Java真正變成你的。
當你真正受阻的時候,把你的問題發到網上來,尋求別人的解答。
當你在考試的時候碰到不明確的問題時,做個記號,然後盡力猜,先完成考試。如果你有時間,再回來做這個問題,可能就很明瞭了。
千萬記得做標記,要不到最後你會忘記哪些是有疑問的,我就丟過好幾分,因爲沒對一開始不懂的做記號,等後來想在回來該考慮的時候,已經忘記哪些是有疑問的。
仔細閱讀題目,不要直接解答。只要把問的問題正確解答就可以了,不要寫一些無關的,有些問題會有一系列提示詞讓你挑選。
別畫蛇添足。
- General: http://suned.sun.com/USA/certification/javamain.html
- SCJP: http://suned.sun.com/USA/certification/progdetails.html
- SCJD: http://suned.sun.com/USA/certification/devdetails.html
- SCJEA: http://suned.sun.com/USA/certification/archdetails.html
語言基礎
關鍵字是預定義字,而預定義字不是關鍵字。詳細參看:Java Language Keywords
在java和c++中,this是一個用來指向當前所在的自我對象的指針。
官方建議的mian方法是:public static void main(String[] args){}
你必須把他記住,在SCJP考試中可能會用到的。
但是,如果你不寫public甚至用private代替public,一些JVM或許會讓你的Java程序不出錯通過編譯,爲什麼?
因爲一些JVM會讓他們容忍他們能容忍的一些錯誤。像這種事在M$的世界中是經常出現的。我猜Sun從他們那學到了這個,看看2001年他們的股票價格,你就會知道爲什麼了。
In the following example, four test() methods, if we pass ambiguous /b{null} to the test, which one should (will) be called? The 3 on top has super/subclass/sub-subclass relationship. The most specific one (down hierarchy) will be called. The 4th with String as a parameter, but it is a sibling of Tester. Ambiguity compile time error results.
在下面的這個例子中,有四個test()方法,如果我們傳一個不明確的參數到test,那麼那個會被執行?
最上面那三個依次是父類,子類,子類的子類的關係.定義最詳細的那個將會被執行(也就是子類的子類).第四個test用String做參數,但和Tester是一個層次的,如果去掉第四個test的註釋,那麼就會出現編譯期的二義性錯誤.
Quote from Java 2 : The Complete Reference by Patrick Naughton, Herbert Schildt, Herb Schildt Pg. 147:
Constructors look a little strange because they have no return type, not even void. This is because the implicit return type of a class' constructor is the class type itself構造函數看起來有點奇怪,因爲他沒有返回類型,甚至不是void,因爲一個類的構造函數肯定是這個類本身的類型。
MyObj o = new MyObj();
Q. What is the difference of null in Java and NULL in C++?
Keep It Simple and Stupid (KISS). Please!
如果你堅持要那樣的話,那就試試看. 去看看這個,他或許能幫你:
Q. How to create my own package, how to call my class in another package?
對於沒有public類的java文件,其文件名的命名沒有任何限制.如果有一個帶main()的類,你可以考慮把文件名命名爲這個類名.你最好按你的習慣命名,當然這些都不是強制的.做一下下面這個實驗:
// D.java class A {} class B {} class C {} class E { public static void main(String[] args) { System.out.println("Strange thing in E."); } } class F { public static void main(String[] args) { System.out.println("Strange thing in F."); } }
java E //output: Strange thing in E.
java F //output: Strange thing in F.
如果你仔細想想,會明白的.(譯者注:每個類在編譯的時候被單獨編譯成一個類名.class的文件,無論他們在不在一個文件)
在接口中所描述的所有東西都是顯式public或隱式public,如果你定義的時候不說明是什麼類型的,他們都是public而不是default,在接口總不能有非public存在,大家想想接口用途就知道了。
如果爲理論研究,這有一個有趣的站點,叫Lykkenborg eZine. 作者想盡量讓Java的語法更容易掌握.
Java的基本類型和類型轉換
下面這個二進制如果代表兩種類型的話,其值應該是:
如果你不知道負數怎麼出來的,看看這篇文章Two's complement.
在java裏,只有char是無符號的,其他像byte,short,int,long都是有符號的,像c/c++這些語言,除了char總是無符號的,其他類型總是有個unsigned brother.
0 to 65535
0 to 1111 1111 1111 1111
'/u0000' to '/uFFFF'
上面的都是相等的,因爲char是無符號的2字節整數.
用你的科學計算器來算算第一個到第三個的轉換,你也可以這樣認爲:
1111 1111 1111 1111 + 1 = 1 0000 0000 0000 0000 = 216
Primitive Data Types
類型 | 位數 | 範圍 | 默認值 | |
---|---|---|---|---|
Boolean | 8, 1 bit used | true | false | false |
char | 16 | '/u0000' | '/uFFFF' | '/u0000' |
byte | 8 | -128 | +127 | 0 |
short | 16 | -32,768 | +32,767 | 0 |
int | 32 | -2,147,483,648 | +2,147,483,647 | 0 |
long | 64 | -9,223,372,036,854,775,808 | +9,223,372,036,854,775,807 | 0 |
float | 32 | -3.40292347E+38 | +3.40292347E+38 | 0.0 |
double | 64 | -1.79769313486231570E+308 | + 1.79769313486231570E+308 | 0.0 |
當給整型(無論有無符號)分配內存的時候,編譯器會檢查這些值有沒有超過此類型所能表達的範圍,如果不超的話就編譯通過,否則出錯.
float f = 1.3; float f = 1.3f; double d = 1.3;
1.3d和1.3f的區別在於其精度不同,而非範圍.當給浮點點數分配內存的時候,也是因此才產生問題的.1.3默認是doule精度的,將他賦給一個float類型會損失精度.他需要類型轉換.
因爲精度所代表的涵義,1.3和1.30在物理/數學領域是不同的.
距離1.3英里意味着是在1.25英里和1.35英里之間。
距離1.30英里意味着是在1.295英里和1.305之間,這樣表示更精確.
當然不是每個人都這樣認爲.
float轉換成long則更顯然了,因爲小數部分會丟失。
因爲boolean只有兩個值(true,false),一位就絕對夠存儲了。但是,在內存中我們沒法得到每一位的地址,而我們又沒法使用一個byte(8位),換句話說,我們只用了1位,空了7位沒用。
爲證明這個理論,運行這個程序TestBoolSerialize.java. 輸出文件Bool.tmp和Byte.tmp將會是同樣大小,但是Short大小是他們的兩倍。
如果你內存用光了,可能你只能運行到一半就死了?
不要太擔心這個,Java會把內部表示處理得很漂亮的,程序員不需要像c/C++那樣主動申請/釋放內存。還記得在C/C++中進行指針操作的時候,老會用到sizeof()?Java裏沒有sizeof(),我上面那個程序用了sizeof()的小技巧來向你揭示Java的密碼。To the top
//
- 由子類向父類的向上轉換是沒必要轉換,因爲以爲按照關係,橡樹就是樹。
- 不要把父類轉換成子類,雖然在編譯的時候會忽略錯誤,但如果你把樹轉換成橡樹,他有可能是對的,但你保證不了,也許某顆書是蘋果樹呢。在這種情況下, ClassCastException 錯誤將會在運行期被拋出。
- 如果你轉換同一層次的子類,甚至毫無關係的子類,就會出現編譯期錯誤,因爲編譯期已經掌握了這些類的類型信息。比如,你把橡樹轉換成蘋果樹,甚至傢俱,就會出現編譯錯誤。
- 可是,當你進行接口之間的轉換的時候,甚至兩者是毫無關係的,編譯器也不會報錯。
"Chinese is not necessary an oversea Chinese, but possible."(“華人不必是華人,只是可能”)
When you cast super to sub, compiler assume that you know what you were doing, since it is possible. However, runtime will find out b actually is not a Sub.當你把父類轉換成子類,編譯器認爲你知道你在幹什麼,因爲進行這種轉換是可能的。可是,運行時將會發現b卻不是子類(而是父類)
儘管貓是動物,但動物不一定是貓,但也有可能是貓。
這就是爲什麼向下轉換在編譯的時候能通過,因爲編譯器認爲你知道你正在幹什麼,但是,運行時就會發現這隻動物事實上不是貓。
ClassCastException! Big time.
- 在電腦中所有東西都是用0或1代表,每8位構成一個byte,這就是爲什麼所有東西都能用byte流讀取。
- byte是內存單元地址的最小單位。
- 解釋這些應該是操作系統和軟件課程的事。
- 作爲Java的基本類型,char是16位無符號整型,byte是8位帶符號整型,short是16位帶符號整型。
- char和short的區別就在於第一位所代表的意思。
- 3 (整型)在Java裏面默認是int類型.
- 1.0 (浮點型) 在Java裏面默認是double類型.
- 錯!因爲3是int,int到short需要顯式轉換.
- 錯!三個參數都匹配錯誤.
- 對!因爲第二、第三個參數可以向上轉換成double.
- 錯!因爲1.0是double類型,double到int需要顯式轉換.
- 錯! double到long需要顯式轉換.
- 錯!double到float需要顯式轉換.
Copyright ? 1999 - 2005 Roseanne Zhang, All Rights Reserved
[JavaChina] [Online Tutoring, Training] [SCJD Group]