60道SCJP考试真题精解
60道SCJP考試真題精解
短整型的數據類型的長度是16 bits,有符號。另外需要說明的是java中所有的整(Integral)數(包括byte,short,int,long)全是有符號的。
Java的標識符可以以一個Unicode字符,美元符($)開始,下滑線(_),后續字符可以是前面的符號和數字,沒有長度限制,大小寫敏感,不能是保留字。
十六進制數以0x開頭,long型數以L(大小寫均可,一般使用大寫,因為小寫的l和數字1不易區分)。
String類型可以直接使用+進行連接運算。
String是一種Object,而不是簡單的字符數組,不能使用下標運算符取其值的某個元素。
toUpperCase()方法是String對象的一個方法,作用是將字符串的內容全部轉換為大寫并返回轉換后的結果(String類型)。
String類型不能進行減(-)運算。
在靜態方法中不能使用類中的非靜態成員。
private成員,在類外不能直接引用。
BorderLayout將容器劃分為五個部分,容器大小的改變不會影響其中的組件的位置而是影響他們的大小。
FlowLayout根據放入其中的組件的最合適大小調整組件的位置,根據組件放入的順序安排,一行不能容納時放入下一行,因此容器的大小改變可能改變組件的位置。
CardLayout顯示放入該容器的當前頁中的組件,一次顯示一個,容器大小的改變不能影響其中組件的位置。
GridLayout將容器劃分為固定的網格,組件加入后占據一個單元,各組件的相對位置不會因為容器的大小變化而變化,改變的只是組件的大小。
Java中有true,但是這也不是關鍵字而是字面量(literal)。
Java中不需要sizeof操作符,所有的類型(原始類型)的大小都是固定的。
const是java中未被使用的關鍵字。
equals()方法判定引用值是否指向同一對象。
/*equals()方法是可以被重載的,但是按照java語言的本意來說:如果沒有重寫(override)新類的equals(),則該方法和 == 操作符一樣在兩個變量指向同一對象時返回真,但是java推薦的是使用equals()方法來判斷兩個對象的內容是否一樣,就像String類的equals()方法所做的那樣:判定兩個String對象的內容是否相同,而==操作符返回true的唯一條件是兩個變量指向同一對象。*/類File重寫方法equals()在兩個分立的對象的內容和類型一致時返回true。
? 變量t是一個Person對象,但是它是用Teacher實例化的,這個問題涉及到java的編譯時多態和運行時多態的問題,就編譯時多態來說,t實際上是一個Person類,這涉及到類型的自動轉換(將一個子類的實例賦值給一個父類的變量是不用進行強制類型轉換,反之則需要
? 進行強制類型轉換,而且被賦值的變量實際上應該是一個子類的對象),如果對t調用了子類中新增的方法則造成編譯時錯誤編譯將不能通過,而在運行時,運行時系統將根據t實際指向的類型調用對應的方法,對于本例來說,t.print(10)將調用t實際指向的Teacher類的對應方法。在java中,可以用一個子類的實例實例化父類的一個變量,而變量在編譯時是一個父類實例,在運行時可能是一個子類實例。
Java的原始數據類型一共就八個,分別是:byte,short,int,long,boolean,char,float,double。注意這些是大小寫敏感的,而Boolean是booelan的封裝類(wrapper class)。
Java的移位操作符一共有三種,分別是”>>”,”>>>”,”<<”,執行的操作分別是有符號右移,無符號右移,左移,有符號右移的意思是說移入的最高位和原最高符號位相同,無符號右移是移入位始終補零,左移時最低位始終補零,最高位被舍棄。移位操作符另一個非常值得注意的特點是其右操作數是取模運算的,意思是說對于一個int型數據而言,對它移位32位的結果是保持不變而非變成零,即:a>>32的結果是a而不是0,同理,對long型數是對右操作數取64的模,a>>64==a;還有一點需要注意的是移位操作符”>>>”只對int型和long型有效,對byte或者short的操作將導致自動類型轉換,而且是帶符號的。
java是多線程的語言,多個線程可以”同時”訪問同一數據區,而在處理某些數據時不希望其它的線程修改那些數據的值或者某些操作是不可打斷的,要做到這個,可以使用synchronized關鍵字聲明這一點。
在java中,程序運行的入口就是main()方法,它必須是這樣的形式:public static void main(String args[])。但是嚴格來講main()方法的返回類型是void還可以加上int和boolean,因為并沒有限定是程序入口的main()方法,而main()方法是可以重載的。一般意義上的main()當然就是指我們剛開始所說的main()方法了。
對于TextField的該種形式的構造函數來說,前一個參數是文本域中初始的字符串的顯示值,而后一個是推薦的顯示寬度,以列數表示,在構造文本域的時候會將這個大小設置為最佳大小,如果容器的限制使得文本域不能顯示這么多也沒有辦法,一般來說是比這個大小大的,而且即使寬度很小,你也可以在文本域的一行中輸入很長的字符串,只有你不使用回車,在超過顯示寬度后文本域會自動出現水平滾動條(沒有被設置為關閉,缺省是不關閉的),而文本域的缺省編輯方式是可編輯的,一個文本域只能使用一種字體,這個字體可以在運行的過程中動態的改變,但是文本域中的所有字符串都將使用這個字體顯示。
Java語言將內存分配和釋放的工組交給了自己,程序員不必做這些工作,它提供一個系統級的線程跟蹤每個內存的分配,在JVM的空閑處理中,垃圾收集線程將檢查和釋放不再使用的內存(即可以被釋放的內存)。垃圾收集的過程在java程序的生存期中是自動的,不需要分配和釋放內存,也避免了內存泄漏。可以調用System.gc()方法建議(suggest)JVM執行垃圾收集以使得可被釋放的內存能立即被使用,當此方法返回的時候,JVM已經做了最大的努力從被丟棄的對象上回收內存空間。程序員不能指定收集哪些內存,一般而言也不用關心這個問題,除非是程序的內存消耗很大,特別是有很多臨時對象時可以“建議“進行垃圾收集以提高可用內存。需要指出的是調用System.gc()方法不能保證JVM立即進行垃圾收集,而只能是建議,因為垃圾收集線程的優先級很低(通常是最低的)。
浮點數的賦值是帶有小數點的數字缺省是double型的,如果在浮點數后面加f或者F則是float,后面加d或者D則是double,科學計數法形式的浮點數也是double型的,而double的精度比float高,將一個高精度的double賦值給一個低精度的float時需要進行強制類型轉換,反之則不需要。
類中有幾種變量,分別是:局部變量(英文可以為:local\automatic\temporary\stack variable)是定義在方法里的變量;實例變量(英文為:instance variable)是在方法外而在類聲明內定義的變量,有時也叫成員變量;類變量(英文為:class variable)是用關鍵字static聲明的實例變量,他們的生存期分別是:局部變量在定義該變量的方法被調用時被創建,而在該方法退出后被撤銷;實例變量在使用new Xxxx()創建該類的實例時被創建,而其生存期和該類的實例對象的生存期相同;類變量在該類被加載時被創建,不一定要用new Xxxx()創建,所有該類的實例對象共享該類變量,其生存期是類的生存期。任何變量在使用前都必須初始化,但是需要指出的是局部變量必須顯式初始化,而實例變量不必,原始類型的實例變量在該類的構造方法被調用時為它分配的缺省的值,整型是0,布爾型是false,而浮點型是0.0f,引用類型(類類型)的實例變量的缺省值是null(沒有進行實際的初始化,對它的使用將引起NullPointException),類變量的規則和實例變量一樣,不同的是類變量的初始化是在類被加載時。
在同一個類的不同構造方法中調用該類的其它構造方法需要使用this(…)的形式,而且必須是在構造方法的第一行調用,這個和普通的方法重載調用的方式不同,普通的方法可以直接使用方法名加參數來調用,而且調用位置沒有限制
在父類型的構造函數被調用前不能引用類的成員。構造方法是一個類對象實例化的起點(雖然嚴格來說首先執行的并不是構造方法的第一個語句,而是內存的分配),因此在構造方法中不能將成員作為參數引用。
對原始數據類型的變量的聲明將為之分配內存并賦予一個缺省值,而非原始數據類型的變量必須用new Xxxx()分配內存及初始化。但是嚴格來講,因為只有原始類型的實例變量和類變量的聲明在類對象被創建/類被加載時完成內存的自動分配,而原始類型的局部變量必須顯式初始化,從這點來看原始類型的局部變量沒有被自動分配內存,SL275中只提出了非原始數據類型的變量必須使用new Xxxx()完成內存的分配而沒有指出原始數據類型的變量是否在聲明時即自動進行內存分配,而從局部變量不能在顯式初始化前使用這點來看在聲明時沒有進行內存分配。
類文檔的內容主要是:類層次、類及用途描述、成員變量列表、構造方法列表、成員方法列表、從類層次上繼承的方法列表、成員變量的詳細說明、構造方法詳細說明、成員方法詳細說明。
邏輯操作符(logical operator)的“與”應該是&&,而&是位邏輯操作符(bitwise logical operator)的“與”,使用的對象不一樣,邏輯操作符的“與”的左右操作數都應該是布爾型(logical boolan)的值,而位邏輯操作符的左右操作數都是整型(integral)值。
SL275中描述的Java程序運行的過程是這樣的:類加載器(class loader)加載程序運行所需要的所有類,它通過區分本機文件系統的類和網絡系統導入的類增加安全性,這可以限制任何的特洛伊木馬程序,因為本機類總是先被加載,一旦所有的類被加載完,執行文件的內存劃分就固定了,在這個時候特定的內存地址被分配給對應的符號引用,查找表(lookuo table)也被建立,由于內存劃分發生在運行時,解釋器在受限制的代碼區增加保護防止未授權的訪問;然后字節碼校驗器(byte code verifier)進行校驗,主要執行下面的檢查:類符合JVM規范的類文件格式,沒有違反訪問限制,代碼沒有造成堆棧的上溢或者下溢,所有操作代碼的參數類型都是正確的,沒有非法的數據類型轉換(例如將整型數轉換成對象類型)發生;校驗通過的字節碼被解釋器(interpreter)執行,解釋器在必要時通過運行時系統執行對底層硬件的合適調用。
運行時解釋器執行代碼。
在運行時,字節碼被加載,驗證然后在解釋器里面運行。
類加載器通過分離本機文件系統的類和從網絡導入的類增加安全性。
實例變量在類的一個實例構造時完成初始化,而且在類的靜態方法中不能直接訪問類的非靜態成員而只能訪問類成員,類的普通方法可以訪問類的所有成員和方法,而靜態方法只能訪問類的靜態成員和方法,因為靜態方法屬于類,而普通方法及成員變量屬于類的實例,類方法(靜態方法)不能使用屬于某個不確定的類的實例的方法和變量,在靜態方法里面沒有隱含的this,而普通方法有。
方法重載的規則是:一、參數列表必須不同,個數的不同完全可以,如果個數相同則參數類型的不同不能引起歧意,例如int 和long,float和double就不能作為唯一的類型不同;二、返回值可以不同,但是不能是重載時唯一的不同點(這點和c++中不同,c++中返回類型必須一致)。
方法重寫發生在類繼承時,子類可以重寫一個父類中已有的方法,必須在返回類型和參數列表一樣時才能說是重寫,否則就是重載。
java中方法重寫的一個重要而且容易被忽略的規則是重寫的方法的訪問權限不能比被重寫的方法的訪問權限低!重寫的另一個規則是重寫的方法不能比被重寫的方法拋棄(throws)更多種類的異常,其拋棄的異常只能少,或者是其子類,不能以拋棄異常的個數來判斷種類,而應該是異常類層次結果上的種類。
修飾符的順序,一個最完整的修飾是public static final int varial_a=100;這個順序不能錯
Java中的package語句必須是源文件中除去說明以外的第一條語句,導入包語句可以有幾個,但是必須位于package語句之后,其它類定義之前,一個源文件中可以有幾個類,但最多只能有一個是public的,如果有,則源文件的文件名必須和該類的類名相同。
==操作符比較的是操作符兩端的操作數是否是同一個對象,而String的equals()方法比較的是兩個String對象的內容是否一樣,其參數是一個String對象時才有可能返回true,其它對象都返回假。需要指出的是由于s和t并非使用new創建的,他們指向內存池中的同一個字符串常量,因此其地址實際上是相同的
將int,short,byte賦值給long型時不需要顯式的類型轉換,反之,將long型數賦值給byte,short,int型時需要強制轉換
流布局管理器(FlowLayout)將根據框架的大小隨時調整它里面的組件的大小,包括高度和寬度,這個管理器不會約束組件的大小,而是允許他們獲得自己的最佳大小,一行滿了以后將在下一行放置組件;卡片管理器(CardLayout)一次顯式一個加入的組件(根據加入時的關鍵字);網格管理器(GridLayout)將容器劃分為固定的網格,容器大小的改變將影響所有組件的大小,每個組件的大小都會同等地變化;邊界管理器(BorderLayout)將容器劃分為五個區域,分為東南西北和中間,東西區域的寬度為該區域里面組件的最佳寬度,高度為容器的高度減去南北區域的高度,這是一個可能變化的值,而南北區域的寬度為容器的整個寬度,高度為組件的最佳高度,中間區域的高度為容器的高度減去南北區域的高度,寬度為容器的寬度減去東西區域的寬度。
InputStream是所有輸入流的父類
方法void flush()是緩沖輸出流的基本方法,作用是強制將流緩沖區中的當前內容強制輸出。
Java基礎API中的FilterInputStream 的已知子類有:BufferedInputStream, CheckedInputStream, CipherInputStream, DataInputStream, DigestInputStream, InflaterInputStream, LineNumberInputStream, ProgressMonitorInputStream, PushbackInputStream 。
FilterInputStream的構造方法只有一個,其參數是一個InputStream對象。
switch語句的用法,switch的判斷的條件必須是一個int型值,也可以是byte、short、char型的值,case中需要注意的是一個case后面一般要接一個break語句才能結束判斷,否則將繼續執行其它case而不進行任何判斷,如果沒有任何值符合case列出的判斷,則執行default的語句,default是可選的,可以沒有,如果沒有default而又沒有任何值匹配case中列出的值則switch不執行任何語句。
TimedOutException 不是一個RuntimeException。下面的哪些聲明可以被加入第一行完成此方法的聲明。
如果程序在運行的過程中拋出異常,而這個異常又不是RuntimeException或者Error,那么程序必須捕獲這個異常進行處理或者聲明拋棄(throws)該異常,捕獲異常可以使用try{}catch(){}語句,而拋棄異常在方法聲明是聲明,在方法的聲明后面加上throws XxxxException,拋棄多個異常時在各異常間使用逗號(,)分隔,題目中的程序在運行時拋出的不是一個RuntimeException,所有必須捕獲或者拋棄,而程序又沒有捕獲,所有應該在方法聲明中聲明拋棄。由于Exception是所有異常的父類,所有當然也可以代表RuntimeException了。
56.一個新創建的線程并不是自動的開始運行的,必須調用它的start()方法使之將線程放入可運行態(runnable state),這只是意味著該線程可為JVM的線程調度程序調度而不是意味著它可以立即運行。線程的調度是搶先式的,而不是分時間片式的。具有比當前運行線程高優先級的線程可以使當前線程停止運行而進入就緒狀態,不同優先級的線程間是搶先式的,而同級線程間是輪轉式的。一個線程停止運行可以是因為不同原因,可能是因為更高優先級線程的搶占,也可能是因為調用sleep()方法,而即使是因為搶先而停止也不一定就進入可運行隊列的前面,因為同級線程是輪換式的,它的運行可能就是因為輪換,而它因搶占而停止后只能在輪換隊列中排隊而不能排在前面。
57.Thread的API文檔中的說明是該方法恢復被掛起的(suspended)線程。該方法首先調用該線程的無參的checkAccess() 方法,這可能在當前線程上拋出SecurityException 異常,如果該線程是活著的(alive)但是被掛起(suspend),它被恢復并繼續它的執行進程。
總結
以上是生活随笔為你收集整理的60道SCJP考试真题精解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构:(4)算法及其描述
- 下一篇: 笔记本软件页面分辨率低_笔记本最容易忽略