一、CoreJava部分:(共95題:基礎91道,中等難度4道)
基礎及語法: 1 — 61題 1 — 13頁
異常: 62 — 69題 13 — 15頁
集合: 70 — 80題 15 — 18頁
線程: 81 — 90題 18 — 21頁
IO & Socket: 91 — 95題 21 — 24頁
基礎及語法部分:(1--61)
(共61題:基礎60道、中等難度1道)
1、面向對象的特徵有哪些方面? 【基礎】
答:面向對象的特徵主要有以下幾個方面:
1)抽象:抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象並不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面,一是過程抽象,二是數據抽象。
2)繼承:繼承是一種聯結類的層次模型,並且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。對象的一個新類可以從現有的類中派生,這個過程稱爲類繼承。新類繼承了原始類的特性,新類稱爲原始類的派生類(子類),而原始類稱爲新類的基類(父類)。派生類可以從它的基類那裏繼承方法和實例變量,並且類可以修改或增加新的方法使之更適合特殊的需要。
3)封裝:封裝是把過程和數據包圍起來,對數據的訪問只能通過已定義的界面。面向對象計算始於這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的對象,這些對象通過一個受保護的接口訪問其他對象。
4)多態性:多態性是指允許不同類的對象對同一消息作出響應。多態性包括參數化多態性和包含多態性。多態性語言具有靈活、抽象、行爲共享、代碼共享的優勢,很好的解決了應用程序函數同名問題。
2、作用域public,private,protected,以及不寫時的區別?【基礎】
答:區別如下:
作用域 當前類 同包 子孫類 其他
public √ √ √ √
protected √ √ √ ×
default √ √ × ×
private √ × × ×
不寫時默認爲 default 。
3 、 String 是最基本的數據類型嗎 ? 【基礎】
答 : 不是。
4 、 float 型 float f=3.4 是否正確 ? 【基礎】
答:不正確;精度不準確,應該用強制類型轉換,如下所示:float f=(float)3.4 。
5、語句float f=1.3;編譯能否通過?【基礎】
答:不能;應該用強制類型轉換,如下所示:float f=(float)1.3; 。
6、short s1 = 1; s1 = s1 + 1;有什麼錯?
short s1 = 1; s1 += 1;有什麼錯? 【基礎】
答:short s1 = 1; s1 = s1 + 1;s1+1運算結果是int型,需要強制轉換類型;
short s1 = 1; s1 += 1;可以正確編譯,自動類型提升。
7、Java有沒有goto??【基礎】
答:goto是java中的保留字,現在沒有在java中使用。
8、int 和 Integer 有什麼區別? 【基礎】
答:Java 提供兩種不同的類型:引用類型和原始類型(或內置類型);
int是java的原始數據類型,Integer是java爲int提供的封裝類。
Java爲每個原始類型提供了封裝類:
原始類型: boolean,char,byte,short,int,long,float,double
封裝類型:Boolean,Character,Byte,Short,Integer,Long,Float,Double
引用類型和原始類型的行爲完全不同,並且它們具有不同的語義。引用類型和原始類型具有不同的特徵和用法,它們包括:大小和速度問題 ,這種類型以哪種類型的數據結構存儲 ,當引用類型和原始類型用作某個類的實例數據時所指定的缺省值 。對象引用實例變量的缺省值爲 null,而原始類型實例變量的缺省值與它們的類型有關。
9、&和&&的區別?【基礎】
答:&是位運算符,表示按位與運算,&&是邏輯運算符,表示邏輯與(and)。
10、簡述位運算操作(&,|,^)與邏輯操作(&&,||)的區別?【基礎】
答:區別主要有兩點:a.邏輯操作只能操作布爾型的,而位運算操作不僅可以操作布爾型,而且可以操作數值型b.位操作不會產生短路。
11、heap和stack有什麼區別?【基礎】
答:棧是一種線形集合,其添加和刪除元素的操作應在同一段完成,棧按照後進先出的方式進行處理;堆是棧的一個組成元素。
12、Math.round(11.5) 等於多少? Math.round(-11.5)等於多少??【基礎】
答:Math.round(11.5)==12? Math.round(-11.5)==-11? round方法返回與參數最接近的長整數,參數加1/2後求其floor。
13、swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上? 【基礎】
答:switch(expr1)中,expr1是一個整數表達式。因此傳遞給 switch 和 case 語句的參數應該是 int、 short、 char 或者 byte。long,string 都不能作用於swtich。
14、編程題: 用最有效率的方法算出2乘以8等於幾? 【基礎】
答: 2 << 3。
15、有沒有length()這個方法? String有沒有length()這個方法?【基礎】
答:數組沒有length()這個方法,有length的屬性。String有length()這個方法。
16、在JAVA中,如何跳出當前的多重嵌套循環?【基礎】
答:在最外層循環前加label標識,然後用break:label方法即可跳出多重循環。
17、構造器Constructor是否可被override? 【基礎】
答:構造器Constructor不能被繼承,因此不能重寫Overriding,但可以被重載Overloading。
18、兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對? 【基礎】
答:不對,有相同的hash code。
19、是否可以繼承String類? 【基礎】
答:String類是final類,故不可以繼承。
20、以下二條語句返回值爲true的有:
A :“beijing”==“beijing” ;
B :“beijing”.equalsIgnoreCase (new String (“beijing” )); 【基礎】
答 :A 和 B 。
21 、當一個對象被當作參數傳遞到一個方法後 , 此方法可改變這個對象的屬性 , 並可返回變化後的結果 , 那麼這裏到底是值傳遞還是引用傳遞 ? 【基礎】
答:是值傳遞。Java 編程語言只有值傳遞參數。當一個對象實例作爲一個參數被傳遞到方法中時,參數的值就是對該對象的引用。對象的內容可以在被調用的方法中改變,但對象的引用是永遠不會改變的。
22、我們在web應用開發過程中經常遇到輸出某種編碼的字符,如iso8859-1等,如何輸出一個某種編碼的字符串?【基礎】
答 :public String translate(String str){
String tempStr = "";
try{
tempStr = new String(str.getBytes("ISO-8859-1"), "GBK");
tempStr = tempStr.trim();
}catch (Exception e){
System.err.println(e.getMessage());
}
return tempStr;
}
23 、 String 和 StringBuffer 的區別 ? 【基礎】
答 :JAVA 平臺提供了兩個類 :String 和 StringBuffer , 它們可以儲存和操作字符串 , 即包含多個字符的字符數據。這個String類提供了數值不可改變的字符串。而這個StringBuffer類提供的字符串進行修改。當你知道字符數據要改變的時候你就可以使用StringBuffer。典型地,你可以使用StringBuffers來動態構造字符數據。
24、String, StringBuffer StringBuilder的區別。【基礎】
答:String的長度是不可變的;
StringBuffer的長度是可變的,如果你對字符串中的內容經常進行操作,特別是內容要修改時,那麼使用StringBuffer,如果最後需要String,那麼使用StringBuffer的toString()方法;線程安全;
StringBuilder是從 JDK 5 開始,爲StringBuffer該類補充了一個單個線程使用的等價類;通常應該優先使用 StringBuilder 類,因爲它支持所有相同的操作,但由於它不執行同步,所以速度更快。
25、Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型? 【基礎】
答:方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被“屏蔽”了。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱爲方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。
26、定義類A和類B如下:【基礎】
class A {
int a=1;
double d=2.0;
void show(){
System.out.println("Class A: a="+a +"\td="+d);
}
}
class B extends A{
float a=3.0f;
String d="Java program.";
void show(){
super.show( );
System.out.println("Class B: a="+a +"\td="+d);
}
}
(1) 若在應用程序的main方法中有以下語句:
A a=new A();
a.show();
則輸出的結果如何?
(2) 若在應用程序的main方法中定義類B的對象b:
A b=new B();
b.show();
則輸出的結果如何?
答:輸出結果爲:
1 )Class A: a=1 d=2.0 ;
2 )Class A: a=1 d=2.0
Class B: a=3.0 d=Java program 。
27 、描述一下 JVM 加載 class 文件的原理機制 ? 【基礎】
答 :JVM 中類的裝載是由 ClassLoader 和它的子類來實現的 ,Java ClassLoader 是一個重要的 Java 運行時系統組件。它負責在運行時查找和裝入類文件的類。
28、char型變量中能不能存貯一箇中文漢字?爲什麼? 【基礎】
答:能夠定義成爲一箇中文的,因爲java中以unicode編碼,一個char佔16個字節,所以放一箇中文是沒問題的。
29、abstract class和interface有什麼區別? 【基礎】
答:聲明方法的存在而不去實現它的類被叫做抽象類(abstract class),它用於要創建一個體現某些基本行爲的類,併爲該類聲明方法,但不能在該類中實現該類的情況。不能創建abstract 類的實例。然而可以創建一個變量,其類型是一個抽象類,並讓它指向具體子類的一個實例。不能有抽象構造函數或抽象靜態方法。Abstract 類的子類爲它們父類中的所有抽象方法提供實現,否則它們也是抽象類爲。取而代之,在子類中實現該方法。知道其行爲的其它類可以在類中實現這些方法。接口(interface)是抽象類的變體。新型多繼承性可通過實現這樣的接口而獲得。接口中的所有方法都是抽象的,所有成員變量都是public static final的。一個類可以實現多個接口,當類實現特殊接口時,它定義(即將程序體給予)所有這種接口的方法。然後,它可以在實現了該接口的類的任何對象上調用接口的方法。由於有抽象類,它允許使用接口名作爲引用變量的類型。通常的動態聯編將生效。引用可以轉換到接口類型或從接口類型轉換,instanceof 運算符可以用來決定某對象的類是否實現了接口。
30、Static Nested Class 和 Inner Class的不同?【基礎】
答:Static Nested Class是被聲明爲靜態(static)的內部類,它可以不依賴於外部類實例被實例化。而通常的內部類需要在外部類實例化後才能實例化。
31、java中會存在內存泄漏嗎,請簡單描述。【基礎】
答:會;存在無用但可達的對象,這些對象不能被GC回收,導致耗費內存資源。
32、abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized??【基礎】
答:都不能。
33、靜態變量和實例變量的區別?【基礎】
答:靜態變量也稱爲類變量,歸全類共有,它不依賴於某個對象,可通過類名直接訪問;而實例變量必須依存於某一實例,只能通過對象才能訪問到它。
34、是否可以從一個static方法內部發出對非static方法的調用?【基礎】
答:不可以,如果其中包含對象的method(),不能保證對象初始化。
35、寫clone()方法時,通常都有一行代碼,是什麼?【基礎】
答:Clone 有缺省行爲:super.clone(),他負責產生正確大小的空間,並逐位複製。
36、GC是什麼? 爲什麼要有GC? 【基礎】
答:GC是垃圾收集的意思(Gabage Collection),內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會導致程序或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測對象是否超過作用域從而達到自動回收內存的目的,Java語言沒有提供釋放已分配內存的顯示操作方法。 Java 程序員不用擔心內存管理,因爲垃圾收集器會自動進行管理。要請求垃圾收集,可以調用下面的方法之一:System.gc() 或Runtime.getRuntime().gc() 。
37、垃圾回收的優點和原理。並考慮2種回收機制。【基礎】
答:Java語言中一個顯著的特點就是引入了垃圾回收機制,使c++程序員最頭疼的內存管理的問題迎刃而解,它使得Java程序員在編寫程序的時候不再需要考慮內存管理。由於有個垃圾回收機制,Java中的對象不再有“作用域”的概念,只有對象的引用纔有“作用域”。垃圾回收可以有效的防止內存泄露,有效的使用可以使用的內存。垃圾回收器通常是作爲一個單獨的低級別的線程運行,不可預知的情況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清楚和回收,程序員不能實時的調用垃圾回收器對某個對象或所有對象進行垃圾回收。回收機制有分代複製垃圾回收和標記垃圾回收,增量垃圾回收。
38、垃圾回收器的基本原理是什麼?垃圾回收器可以馬上回收內存嗎?有什麼辦法主動通知虛擬機進行垃圾回收?【基礎】
答:對於GC來說,當程序員創建對象時,GC就開始監控這個對象的地址、大小以及使用情況。通常,GC採用有向圖的方式記錄和管理堆(heap)中的所有對象。通過這種方式確定哪些對象是"可達的",哪些對象是"不可達的"。當GC確定一些對象爲"不可達"時,GC就有責任回收這些內存空間。可以。程序員可以手動執行System.gc(),通知GC運行,但是Java語言規範並不保證GC一定會執行。
39、String s=new String(“xyz”);創建了幾個String Object? 【基礎】
答:兩個對象,一個是"xyx",一個是指向"xyx"的引用對象s。
40、接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承實體類(concrete class)? 【基礎】
答:接口可以繼承接口。抽象類可以實現(implements)接口,抽象類可繼承實體類,但前提是實體類必須有明確的構造函數。
41、Java的接口和C++的虛類的相同和不同處。【基礎】
答:由於Java不支持多繼承,而有可能某個類或對象要使用分別在幾個類或對象裏面的方法或屬性,現有的單繼承機制就不能滿足要求。與繼承相比,接口有更高的靈活性,因爲接口中沒有任何實現代碼。當一個類實現了接口以後,該類要實現接口裏面所有的方法和屬性,並且接口裏面的屬性在默認狀態下面都是public static,所有方法默認情況下是public.一個類可以實現多個接口。
42、一個“.java”源文件中是否可以包含多個類(不是內部類)?有什麼限制?【基礎】
答:可以;必須只有一個類名與文件名相同。
43、說出一些常用的類,包,接口,請各舉5個。【基礎】
答:常用的類:BufferedReader BufferedWriter?FileReader?FileWirter
String?Integer;
常用的包:java.lang? java.awt? java.io? java.util? java.sql;
常用的接口 :Remote? List? Map? Document? NodeList
44 、 Anonymous Inner Class ( 匿名內部類 ) 是否可以 extends( 繼承 ) 其它類 ? 是否可以 implements( 實現 )interface( 接口 )? 【基礎】
答 : 可以繼承其他類或實現其他接口 , 在 swing 編程中常用此方式。
45、內部類可以引用他包含類的成員嗎?有沒有什麼限制?【基礎】
答:一個內部類對象可以訪問創建它的外部類對象的內容。
46、java中實現多態的機制是什麼?【基礎】
答:方法的覆蓋Overriding和重載Overloading是java多態性的不同表現;覆蓋Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。
47、在java中一個類被聲明爲final類型,表示了什麼意思?【基礎】
答:表示該類不能被繼承,是頂級類。
48、下面哪些類可以被繼承? 【基礎】
1)java.lang.Thread?(T)
2)java.lang.Number?(T)
3)java.lang.Double?(F)
4)java.lang.Math??(F)
5 )java.lang.Void??(F)
6 )java.lang.Class??(F)
7 )java.lang.ClassLoader?(T)
答:1、2、7可以被繼承。
49、指出下面程序的運行結果: 【基礎】
class A{
static{
System.out.print("1");
}
public A(){
System.out.print("2");
}
}
class B extends A{
??? static{
??????? System.out.print("a");
??? }
??? public B(){
??????? System.out.print("b");
??? }??
}
public class Hello{
??? public static void main(String[] ars){
??????? A ab = new B(); // 執行到此處 , 結果 : 1a2b
? ab = new B();?// 執行到此處 , 結果 : 1a2b2b
??? }
}
答 : 輸出結果爲 1a2b2b ; 類的 static 代碼段 , 可以看作是類首次加載 ( 虛擬機加載 ) 執行的代碼 , 而對於類加載 , 首先要執行其基類的構造 , 再執行其本身的構造。
50、繼承時候類的執行順序問題,一般都是選擇題,問你將會打印出什麼? 【基礎】
父類:
package test;
public class FatherClass {
public FatherClass() {
System.out.println("FatherClass Create");
}
}
子類:
package test;
import test.FatherClass;
public class ChildClass extends FatherClass {
public ChildClass() {
System.out.println("ChildClass Create");
}
public static void main(String[] args) {
FatherClass fc = new FatherClass();
ChildClass cc = new ChildClass();
}
}
答 : 輸出結果爲 :
FatherClass Create
FatherClass Create
ChildClass Create
51 、內部類的實現方式 ? 【基礎】
答 : 示例代碼如下 :
package test;
public class OuterClass {
private class InterClass {
public InterClass() {
System.out.println("InterClass Create");
}
}
public OuterClass() {
InterClass ic = new InterClass();
System.out.println("OuterClass Create");
}
public static void main(String[] args) {
OuterClass oc = new OuterClass();
}
}
輸出結果爲 :
InterClass Create
OuterClass Create
52 、關於內部類 : 【基礎】
public class OuterClass {
private double d1 = 1.0;
//insert code here
}
You need to insert an inner class declaration at line 3 ,Which two inner class declarations are valid?(Choose two.)
A. class InnerOne{
public static double methoda() {return d1;}
}
B. public class InnerOne{
static double methoda() {return d1;}
}
C. private class InnerOne{
double methoda() {return d1;}
}
D. static class InnerOne{
protected double methoda() {return d1;}
}
E. abstract class InnerOne{
public abstract double methoda();
}
答:答案爲C、E;說明如下:
1)靜態內部類可以有靜態成員,而非靜態內部類則不能有靜態成員;故 A、B 錯;
2)靜態內部類的非靜態成員可以訪問外部類的靜態變量,而不可訪問外部類的非靜態變量;故 D 錯;
3)非靜態內部類的非靜態成員可以訪問外部類的非靜態變量;故 C 正確 。
53、數據類型之間的轉換:
1)如何將數值型字符轉換爲數字?
2)如何將數字轉換爲字符?
3)如何取小數點前兩位並四捨五入? 【基礎】
答:1)調用數值類型相應包裝類中的方法parse***(String)或valueOf(String) 即可返回相應基本類型或包裝類型數值;
2)將數字與空字符串相加即可獲得其所對應的字符串;另外對於基本類型 數字還可調用String類中的valueOf(…)方法返回相應字符串,而對於包裝類型數字則可調用其toString()方法獲得相應字符串;
3)可用該數字構造一java.math.BigDecimal對象,再利用其round()方法 進行四捨五入到保留小數點後兩位,再將其轉換爲字符串截取最後兩位。
54、字符串操作:如何實現字符串的反轉及替換?【基礎】
答:可用字符串構造一StringBuffer對象,然後調用StringBuffer中的reverse方法即可實現字符串的反轉,調用replace方法即可實現字符串的替換。
55、編碼轉換:怎樣將GB2312編碼的字符串轉換爲ISO-8859-1編碼的字符串?【基礎】
答:示例代碼如下:
String s1 = "你好";
String s2 = new String(s1.getBytes("GB2312"), "ISO-8859-1");
56、寫一個函數,要求輸入一個字符串和一個字符長度,對該字符串進行分隔。 【基礎】
答:函數代碼如下:
public String[] split(String str, int chars){
int n = (str.length()+ chars - 1)/chars;
String ret[] = new String[n];
for(int i=0; i<n; i++){
if(i < n-1){
ret[i] = str.substring(i*chars , (i+1)*chars);
}else{
ret[i] = str.substring(i*chars);
}
}
return ret;
}
57、寫一個函數,2個參數,1個字符串,1個字節數,返回截取的字符串,要求字符串中的中文不能出現亂碼:如(“我ABC”,4)應該截爲“我AB”,輸入(“我ABC漢DEF”,6)應該輸出爲“我ABC”而不是“我ABC+漢的半個”。 【基礎】
答:代碼如下:
public String subString(String str, int subBytes) {
int bytes = 0; // 用來存儲字符串的總字節數
for (int i = 0; i < str.length(); i++) {
if (bytes == subBytes) {
return str.substring(0, i);
}
char c = str.charAt(i);
if (c < 256) {
bytes += 1; // 英文字符的字節數看作 1
} else {
bytes += 2; // 中文字符的字節數看作 2
if(bytes - subBytes == 1){
return str.substring(0, i);
}
}
}
return str;
}
58 、日期和時間 :
1) 如何取得年月日、小時分秒 ?
2)如何取得從1970年到現在的毫秒數?
3)如何取得某個日期是當月的最後一天?
4)如何格式化日期?【基礎】
答:1)創建java.util.Calendar實例(Calendar.getInstance()),調用其get() 方法傳入不同的參數即可獲得參數所對應的值,如:
calendar.get(Calendar.YEAR);//獲得年
2)以下方法均可獲得該毫秒數:
Calendar.getInstance().getTimeInMillis();
System.currentTimeMillis();
3) 示例代碼如下 :
Calendar time = Calendar.getInstance();
time.set(Calendar.DAY_OF_MONTH,
time.getActualMaximum(Calendar.DAY_OF_MONTH));
4) 利用 java.text.DataFormat 類中的 format() 方法可將日期格式化。
59、Java編程,打印昨天的當前時刻。【基礎】
答:public class YesterdayCurrent{
public static void main(String[] args){
??? Calendar cal = Calendar.getInstance();
??? cal.add(Calendar.DATE, -1);
??? System.out.println(cal.getTime());
? }
}
60 、 java 和 javasciprt 的區別。【基礎】
答 :JavaScript 與 Java 是兩個公司開發的不同的兩個產品。 Java 是 SUN 公司推出的新一代面向對象的程序設計語言 , 特別適合於 Internet 應用程序開發 ; 而 JavaScript 是 Netscape 公司的產品 , 其目的是爲了擴展 Netscape Navigator 功能 , 而開發的一種可以嵌入 Web 頁面中的基於對象和事件驅動的解釋性語言 , 它的前身是 Live Script ; 而 Java 的前身是 Oak 語言。下面對兩種語言間的異同作如下比較:
1)基於對象和麪向對象:
Java是一種真正的面向對象的語言,即使是開發簡單的程序,必須設計對象;
JavaScript是種腳本語言,它可以用來製作與網絡無關的,與用戶交互作用的複雜軟件。它是一種基於對象(Object Based)和事件驅動(Event Driver)的編程語言。因而它本身提供了非常豐富的內部對象供設計人員使用;
2)解釋和編譯:
Java的源代碼在執行之前,必須經過編譯;
JavaScript是一種解釋性編程語言,其源代碼不需經過編譯,由瀏覽器解釋執行;
3)強類型變量和類型弱變量:
Java採用強類型變量檢查,即所有變量在編譯之前必須作聲明;
JavaScript中變量聲明,採用其弱類型。即變量在使用前不需作聲明,而是解釋器在運行時檢查其數據類型;
4)代碼格式不一樣。
61、什麼時候用assert?【中等難度】
答:assertion(斷言)在軟件開發中是一種常用的調試方式,很多開發語言中都支持這種機制。一般來說,assertion用於保證程序最基本、關鍵的正確性。assertion檢查通常在開發和測試時開啓。爲了提高性能,在軟件發佈後,assertion檢查通常是關閉的。在實現中,斷言是一個包含布爾表達式的語句,在執行這個語句時假定該表達式爲 true;如果表達式計算爲 false,那麼系統會報告一個 Assertionerror。
斷言用於調試目的:
assert(a > 0); // throws an Assertionerror if a <= 0
斷言可以有兩種形式:
assert Expression1 ;
assert Expression1 : Expression2 ;
Expression1 應該總是產生一個布爾值。
Expression2 可以是得出一個值的任意表達式;這個值用於生成顯示更多調試信息的 String 消息。
斷言在默認情況下是禁用的,要在編譯時啓用斷言,需使用 source 1.4 標記:
javac -source 1.4 Test.java
要在運行時啓用斷言,可使用 -enableassertions 或者 -ea 標記。
要在運行時選擇禁用斷言,可使用 -da 或者 -disableassertions 標記。
要在系統類中啓用斷言,可使用 -esa 或者 -dsa 標記。還可以在包的基礎上啓用或者禁用斷言。可以在預計正常情況下不會到達的任何位置上放置斷言。斷言可以用於驗證傳遞給私有方法的參數。不過,斷言不應該用於驗證傳遞給公有方法的參數,因爲不管是否啓用了斷言,公有方法都必須檢查其參數。不過,既可以在公有方法中,也可以在非公有方法中利用斷言測試後置條件。另外,斷言不應該以任何方式改變程序的狀態。
異常部分:(62--69)
(共8題:基礎8道)
62、Java中的異常處理機制的簡單原理和應用?【基礎】
答:當JAVA程序違反了JAVA的語義規則時,JAVA虛擬機就會將發生的錯誤表示爲一個異常。違反語義規則包括2種情況。一種是JAVA類庫內置的語義檢查。例如數組下標越界,會引發IndexOutOfBoundsException;訪問null的對象時會引發NullPointerException。另一種情況就是JAVA允許程序員擴展這種語義檢查,程序員可以創建自己的異常,並自由選擇在何時用throw關鍵字引發異常。所有的異常都是java.lang.Thowable的子類。
63、error和exception有什麼區別? 【基礎】
答:error表示系統級的錯誤和程序不必處理的異常,是恢復不是不可能但很困難的情況下的一種嚴重問題;比如內存溢出,不可能指望程序能處理這樣的情況;
exception表示需要捕捉或者需要程序進行處理的異常,是一種設計或實現問題;也就是說,它表示如果程序運行正常,從不會發生的情況。
64、try {}裏有一個return語句,那麼緊跟在這個try後的finally {}裏的code會不會被執行,什麼時候被執行,在return前還是後? 【基礎】
答:會執行,在return前執行。
65、JAVA語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分別代表什麼意義?在try塊中可以拋出異常嗎?【基礎】
答:Java通過面向對象的方法進行異常處理,把各種不同的異常進行分類,並提供了良好的接口。在Java中,每個異常都是一個對象,它是Throwable類或其它子類的實例。當一個方法出現異常後便拋出一個異常對象,該對象中包含有異常信息,調用這個對象的方法可以捕