[翻譯]SCJP考試FAQ by Roseanne Zhang(1)

原文地址: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的基本類型和類型轉換

SCJP topics covered


新手問題

Q. 什麼是java?
A:
  • Java是在印尼的一個美麗小島。參看: Java, Indonesia
  • Java是一種咖啡的名字。
  • Java是Sun的程序員在喝了太多咖啡之後發明的一種程序語言。 他曾經叫 Oak, 但是這個商標被另外一家公司註冊了,所以就改叫Java了,參看: Sun's official history

Q. Java是純粹的面嚮對象語言?
A: 不,他不是。
C++/C#等都不是, SmallTalk纔是被認爲純粹的面向對象。在SmallTalk,所有的東西都是對象,包括int,甚至加號。Java比C++更接近SmallTalk,但仍然不是純粹的面嚮對象語言。爲什麼討論這些呢?語言你幹活的工具,得選一樣更適合你的。如果是急需速度的話,你可以選擇FORTRAN,c或彙編,把程序直接寫到硬件中也是一個好主意,當然,得看有沒有這個必要。而在一些項目中,面向對象是很重要的。SmatlTalk一直不能成爲主流語言,就是因爲他太慢了。

Q. 我們獲得認證的順序是什麼,Programmer,Developer還是Architect?
A:

通過了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.

To the top


Q. 我應該用哪些書或軟件來準備考試?
A:

我的建議是別買任何考試軟件,恕我直言他們都沒什麼大用。

但你至少得有一本書,Bill Brogden的備考書籍是第一選擇.(PS:Bill沒有付我廣告費).找一本免費版本的Bruise Eckle的《Java編程思想》,如果你有錢的話,最好買一本(他也沒付我廣告費)。還有,學會用Sun的在線 "The Java Tutorial" ,這的很多問題都可以通過簡單的搜索Sun的這個免費教程獲得答案。

當做一些免費的或收費的測試卷的時候,把你不懂的真正搞懂。你不是隻爲考試而準備的,而是爲了你未來的面試、工作。讀書,然後一直寫代碼,code,code,code,知道Java真正變成你的。

當你真正受阻的時候,把你的問題發到網上來,尋求別人的解答。


Free Java Books


Q. 當我們在考試的時候發現不明問題的時候應該怎麼辦?
A:

當你在考試的時候碰到不明確的問題時,做個記號,然後盡力猜,先完成考試。如果你有時間,再回來做這個問題,可能就很明瞭了。

千萬記得做標記,要不到最後你會忘記哪些是有疑問的,我就丟過好幾分,因爲沒對一開始不懂的做記號,等後來想在回來該考慮的時候,已經忘記哪些是有疑問的。


Q. 我該怎樣答填空題?
A:


仔細閱讀題目,不要直接解答。只要把問的問題正確解答就可以了,不要寫一些無關的,有些問題會有一系列提示詞讓你挑選。

別畫蛇添足。


Q. 我該在哪獲得Sun考試信息?
A:

語言基礎

Q. Java的關鍵字和預定義字有什麼區別
A:

關鍵字是預定義字,而預定義字不是關鍵字。詳細參看:Java Language Keywords


Q. this關鍵字是什麼?
A:

 

在java和c++中,this是一個用來指向當前所在的自我對象的指針。


Q. main方法應該怎樣修改?爲什麼我違反這個規則的時候,也能照樣運行?
A:

官方建議的mian方法是:

public static void main(String[] args){}

你必須把他記住,在SCJP考試中可能會用到的。

但是,如果你不寫public甚至用private代替public,一些JVM或許會讓你的Java程序不出錯通過編譯,爲什麼?

因爲一些JVM會讓他們容忍他們能容忍的一些錯誤。像這種事在M$的世界中是經常出現的。我猜Sun從他們那學到了這個,看看2001年他們的股票價格,你就會知道爲什麼了。

 


Q. Java編譯器是怎樣解決二義以確定該調用何種方法?
A:

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的註釋,那麼就會出現編譯期的二義性錯誤.

"The informal intuition is that one method declaration is more specific than another if any invocation handled by the first method could be passed on to the other one without a compile-time type error." Quotation from JLS2

Q. 我可以在哪寫註釋?
A: 看下面這個例子,註釋和註釋的註釋告訴你一切.

Q. What is the return type of constructor, if any?構造函數有返回值嗎?是什麼類型?
A: 構造函數是沒有返回類型的.

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. 變量和參數有什麼區別?
A:
在方法調用的觀點裏,他們是一樣意義的,不過是因爲歷史緣由造成了兩次詞,還有很多這樣關於方法的例子,比如方法(function)和過程(sub),如果你非得找出不同,那也不是問題,先讓我查查字典...

Q. null和void在java中是不是一樣?我能不能在一個沒有返回(void)的方法中返回null?
A: 第一個問題的答案是不,第二個同樣是不!
void意味着不返回任何值,null在java裏面是一個引用類型,但是不指向任何對象.null和void相差是很大的. 參看這裏的進一步說明:
Q. What is the difference of null in Java and NULL in C++?

Q. 能不能在switch-case語句中增加continue?
A: 雖然可以,但你最好不要(他會讓其他case的語句沒法執行)

Q. 能不能同時編譯兩個java文件?他們是有依賴關係的,且不在一個盤符裏。
A:
如果你是一個初學者,就別這樣做,把他放到一個目錄下,別把自己整那麼累.如果你是個老手,我認爲你老闆不會讓你這麼做的.

Keep It Simple and Stupid (KISS). Please!

如果你堅持要那樣的話,那就試試看. 去看看這個,他或許能幫你:
Q. How to create my own package, how to call my class in another package?

Q. 怎樣命名一個沒有定義public類的文件?
A:
Everyone knows one Java file only can contain one public class, and the file must be named as the name of the public class name. But how about Java file with no public class?大家都知道一個java文件只能包含一個public類,而且這個java文件的文件名必須和這個public類名相同.但是如果一個java文件不含任何public類?

對於沒有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.");
   }
}
It is called D.java. You can run it in 2 ways:
java E //output: Strange thing in E.
java F //output: Strange thing in F.

如果你仔細想想,會明白的.(譯者注:每個類在編譯的時候被單獨編譯成一個類名.class的文件,無論他們在不在一個文件)

Q. 爲什麼在接口定義的時候不能用private?
A: 最初大家的討論:here.

在接口中所描述的所有東西都是顯式public或隱式public,如果你定義的時候不說明是什麼類型的,他們都是public而不是default,在接口總不能有非public存在,大家想想接口用途就知道了。


Q. 在哪可以查到Java的語法?
A:
最好的選擇是JLSTHE JAVA LANGUAGE SPECIFICATIONJava語法的官方定義.
如果爲理論研究,這有一個有趣的站點,叫Lykkenborg eZine. 作者想盡量讓Java的語法更容易掌握.

Java的基本類型和類型轉換

Q. signed integer和unsigned integer的區別?
A:
區別在於integer化成二進制後的第一個bit位所代表的含義,如果是signed的話,第一位是0就說明他是正數,是1就說明他是負數;如果是unsigned的話,他從第一位開始都是表示其具體數值.

下面這個二進制如果代表兩種類型的話,其值應該是:
  
如果你不知道負數怎麼出來的,看看這篇文章Two's complement.

在java裏,只有char是無符號的,其他像byte,short,int,long都是有符號的,像c/c++這些語言,除了char總是無符號的,其他類型總是有個unsigned brother.


Q. 爲什麼char的範圍是0到216-1?
A:
0 to 216-1
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

Q. long的長度是64位,float的長度是32位,但爲什麼能不經類型轉換而把long轉換成float?
A: Interesting question!!!有趣的問題!!!
整型(byte,short,char,long)和浮點型(float,double)在計算機內部的表示方法是完全不同的.從long到float的轉換不是簡單地縮短變化,他甚至有可能使有效位數減少(因爲表示範圍不同,如果超出了其能表示的範圍就會錯誤)。詳情看下錶:

Primitive Data Types

類型位數範圍默認值
Boolean8, 1 bit usedtruefalsefalse
char16'/u0000''/uFFFF''/u0000'
byte8-128+1270
short16-32,768+32,7670
int32-2,147,483,648+2,147,483,6470
long64-9,223,372,036,854,775,808+9,223,372,036,854,775,8070
float32-3.40292347E+38+3.40292347E+380.0
double64-1.79769313486231570E+308+ 1.79769313486231570E+3080.0

Q. 爲什麼char=3能夠編譯而float f=1.3會出錯?
A:
char c = 3; byte b = 300; short s = 300; int i = 30000;

當給整型(無論有無符號)分配內存的時候,編譯器會檢查這些值有沒有超過此類型所能表達的範圍,如果不超的話就編譯通過,否則出錯.

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之間,這樣表示更精確.

當然不是每個人都這樣認爲.

Q. 爲什麼JLS把byte到char,float到long定義爲縮短轉換?
A:
因爲char是2 bytes的無符號整型,把他賦給1個字節的帶符號整型當然有可能損失精度,反之亦然,因爲負號在轉換成正數的時候會被重新解釋。

float轉換成long則更顯然了,因爲小數部分會丟失。

Q. boolean類型變量佔用幾個bit?
A:

因爲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

Q. 什麼是類型轉換,能不能給我幾個例子? Q. 什麼是類型轉換,能不能給我幾個例子?
A: *** 類型轉換 ***
把一個類型的變量轉換成另一個類型的變量,當然,他必須是符合Java語法的,比如:
				//

Q. 怎樣轉換類、接口?
A:
  1. 由子類向父類的向上轉換是沒必要轉換,因爲以爲按照關係,橡樹就是樹。
  2. 不要把父類轉換成子類,雖然在編譯的時候會忽略錯誤,但如果你把樹轉換成橡樹,他有可能是對的,但你保證不了,也許某顆書是蘋果樹呢。在這種情況下, ClassCastException 錯誤將會在運行期被拋出。
  3. 如果你轉換同一層次的子類,甚至毫無關係的子類,就會出現編譯期錯誤,因爲編譯期已經掌握了這些類的類型信息。比如,你把橡樹轉換成蘋果樹,甚至傢俱,就會出現編譯錯誤。
  4. 可是,當你進行接口之間的轉換的時候,甚至兩者是毫無關係的,編譯器也不會報錯。
看看這個有趣的例子,他是可運行的:TestCast.java

Q. 爲什麼我的代碼能編譯通過,但是在運行的時候拋ClassCastException?
A:
"Oversea Chinese is a Chinese", but not vise versa.(“海外華人是華人”,但反之不成立)
"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.


Q. char和byte的區別,爲什麼文本文件能用byte流讀?
A:
  1. 在電腦中所有東西都是用0或1代表,每8位構成一個byte,這就是爲什麼所有東西都能用byte流讀取。
  2. byte是內存單元地址的最小單位。
  3. 解釋這些應該是操作系統和軟件課程的事。
  4. 作爲Java的基本類型,char是16位無符號整型,byte是8位帶符號整型,short是16位帶符號整型。
  5. char和short的區別就在於第一位所代表的意思。

Q. 在這個例子中,爲什麼輸出3?
A:
記住下面兩條將會對你有幫助:
  • 3 (整型)在Java裏面默認是int類型.
  • 1.0 (浮點型) 在Java裏面默認是double類型.
關於對錯的解釋:
  1. 錯!因爲3是int,int到short需要顯式轉換.
  2. 錯!三個參數都匹配錯誤.
  3. 對!因爲第二、第三個參數可以向上轉換成double.
  4. 錯!因爲1.0是double類型,double到int需要顯式轉換.
  5. 錯! double到long需要顯式轉換.
  6. 錯!double到float需要顯式轉換.

last updated: 03-27-2005
Copyright ? 1999 - 2005 Roseanne Zhang, All Rights Reserved
[JavaChina] [Online Tutoring, Training] [SCJD Group]
發佈了27 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章