理論測試題目:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
1. 請描述出java應用程序的運行機制?
先編譯後解釋運行,通過JVM跨平臺。
*.java通過javac編譯成二進制*.class文件後通過不同平臺下的JVM加載解釋運行。
JIT及時編譯器
2. 請說明java中間抽象類和接口的聯繫和區別?
抽象類是用abstract修飾的類,用於知道某一類對象有這個行爲但不知道如何實現。裏面可以包含抽象和非抽象方法。只能單一繼承。繼承抽象類的子類必須實現父類的所有抽象方法,除非本身也是抽象類。
接口是用interface修飾的更高一級的抽象,是一種規範,用於定義其實現類的具體行爲。裏面的屬性都是默認public static final,方法都是默認public abstract。可用於多重繼承。實現接口的類必須實現接口中的所有方法,否則該類必須聲明爲抽象類。
3. 請說明java中間訪問修飾符有那些,分別的作用?
public 允許其他所有的成員訪問。
protected 該類本身,同一個包內及不同包的子類所有成員訪問。
default 只有該類及同一個包內的類可以訪問。
private 除了該類的成員其他都不可以訪問,實現數據隱藏。
4. 詳細說明static關鍵字用在變量,方法和代碼塊上各自的意思?
static用在變量及爲類變量,所有成員共享該變量,其值改變則所有實例成員的變量值都改變。用在方法則該方法只能調用其他靜態方法和變量,不能使用this和super關鍵字。用在代碼塊則在調用任何方法之前調用該靜態塊,主要用於靜態變量賦值。
5. final關鍵字用在變量,方法和類中,分別表示什麼意思?請詳細說明。
final用在變量表示該變量是個常量,用在方法表示該方法不能重寫,用在類則表示該類不可以繼承。
6. 請說明方法重寫和方法重載的定義和作用?
方法重寫是子類重新實現了父類的方法,其名稱及參數不變,返回類型也不能變,訪問修飾符的範圍不能比父類的範圍小。作用是改寫或改善父類的方法。
方法重載是在同一個類中方法名稱相同而參數列表不同。返回類型都可以不同,按類分又可以分爲構造方法重載和普通方法重載。
7. 請說明List,Map,Set三個接口的作用和區別?
List和Set擴展了Collection接口,List允許有重複值,ArrryList、Vector等類實現了該接口。Set不允許有重複值,TreeSet和HashSet實現類該接口,TreeSet還實現了SortSet能自動排序。Map接口是以鍵值對來存儲元素,
8. 請說明HashMap和Hashtable的聯繫和區別?
Hashtable是JDK1.0推出的,他基於線性安全的,不能存儲空值;而HashMap是JDK1.2推出的,他基於線性不安全的,主要是對執行效率進行考慮,能存儲空值。
9. 請代碼演示如何遍歷一個HashMap對象?(關鍵代碼即可)
HashMap hm=new HashMap();
hm.put(object,object);…
Collection c=hm.values();
Iterator it=c.iterator();
While(it.hasNext()){
System.out.println(it.next().toString());
}
如果遍歷鍵就用hm.keySet();
10. 請說明java.io.Serializable的作用?
該接口只是一種標記,繼承了該類則說明該類可以被序列化和反序列化。
11. 你如何理解線程和進程?他們的聯繫和區別?
一個進程可以包含多個線程。
12. java中間如何編寫一個線程類,並啓動他。
13. 你如何理解註解(annotation)?它有什麼作用?
Annotation提供一種機制,將程序的元素如:類,方法,屬性,參數,本地變量,包和元數據聯繫起來。這樣編譯器可以將元數據存儲在Class文件中。這樣虛擬機和其它對象可以根據這些元數據來決定如何使用這些程序元素或改變它們的行爲。
14. 請描述什麼是web應用程序?
Web應用程序就是基於WEB開發的程序。一般用來作一些網絡具有交互功能的東西。
15. 請說明你如何理解Servlet接口,以及說明我們定義的Servlet的生命週期(什麼時候創建,什麼時候銷燬)?
實現了Servlet接口
Servlet在第一次訪問的時候創建,或者指定他在Web服務器啓動的時候創建,在Web服務器重啓或關閉的時候銷燬。服務器資源不夠的時候會自動清除很長時間未使用的資源。
16. 請說明Session的生命週期(什麼時候創建,什麼時候銷燬)?
Session在用戶第一次訪問的時候創建,並使用sessionId唯一標示該用戶,保存在服務器。一般用在多次請求中傳值,銷燬分手動銷燬和超時銷燬,手動銷燬:session.invalidate();超時銷燬:session.setMasInactiveInterval(60*10)
17. 請寫出jsp中間的9大隱式對象。你覺得pageContext有什麼作用?
輸入輸出對象:out,request,response
作用域通信對象:session,pageContext,application
Servlet對象:page,config
錯誤對象:exception
18. 轉發和重定向的區別?
轉發是一次請求,速度快,只限於當前工程,不改變地址欄。
重定向是多次請求,速度慢,可以跨工程,會改變地址欄。
19. this和super有什麼作用。
this是指當前對象,可用來防止命名衝突,super用來調用父類的屬性和方法。包括普通方法和構造方法。
20. final關鍵字到底修飾了什麼?
final使得被修飾的變量"不變",但是由於對象型變量的本質是“引用”,使得“不變”也有了兩種含義:引用本身的不變,和引用指向的對象不變。
引用本身的不變:
final StringBuffer a=new StringBuffer("immutable");
final StringBuffer b=new StringBuffer("not immutable");
a=b;//編譯期錯誤
引用指向的對象不變:
final StringBuffer a=new StringBuffer("immutable");
a.append(" broken!"); //編譯通過
可見,final只對引用的“值”(也即它所指向的那個對象的內存地址)有效,它迫使引用只能指向初始指向的那個對象,改變它的指向會導致編譯期錯誤。至於它所指向的對象的變化,final是不負責的。這很類似==操作符:==操作符只負責引用的“值”相等,至於這個地址所指向的對象內容是否相等,==操作符是不管的。
理解final問題有很重要的含義。許多程序漏洞都基於此----final只能保證引用永遠指向固定對象,不能保證那個對象的狀態不變。在多線程的操作中,一個對象會被多個線程共享或修改,一個線程對對象無意識的修改可能會導致另一個使用此對象的線程崩潰。一個錯誤的解決方法就是在此對象新建的時候把它聲明爲final,意圖使得它“永遠不變”。其實那是徒勞的。
21. instanceof是什麼東東?
instanceof是Java的一個二元操作符,和==,>, <是同一類東東。由於它是由字母組成的,所以也是Java的保留關鍵字。它的作用是測試它左邊的對象是否是它右邊的類的實例,返回boolean類型的數據。(類似C#的is)舉個例子:
String s = "I AM an Object!";
boolean isObject = s instanceof Object;
java中有三種自動類型轉換會造成數據的丟失:
1.int->float
2.long->float
3.long->double
原因是因爲,實型的數據最後一個字節是用來存儲位權的,也就是科學計數法裏邊的10的多少次方,存儲在這個字節裏邊,比如說int想要轉換成float,那麼int的4個字節的數值,會相應的存儲到float除開位權那一個字節的前3個字節中,也就是說4個字節存入3個字節,自然會產生數據的丟失,相應的float中的第4個字節中這個時候存儲的數就會是0。
22. override有什麼作用。
override 有人翻譯成重寫 ,有人翻譯成覆蓋,這是對方法而言,static,private,final方法出外
對於變量,沒有override一說,它們的行爲成爲hiden
如果有一個由父類聲明、由子類new出的對象的引用/在調用父類與子類同名的變量和方法時/則調用子類的方法,調用其自身的變量!!!
例如:
調用方法a.fn()打印的20,是調用的B類中的方法,但是a.x卻是10,是A類中的變量
class A
{
int x=10;
void fn()
{
System.out.println(x);
}
}
class B extends A
{
int x=20;
void fn()
{
System.out.println(x);
}
}
class Test
{
public static void main(String []args)
{
B b=new B();
A a=b;
System.out.println(a.x);
a.fn();
}
}
public static void main(String[] args)
{
Integer a = 127 ;
Integer b = 127 ;
Integer a2 = 200 ;
Integer b2 = 200 ;
Integer a3 = new Integer(100) ;
Integer b3 = new Integer(100) ;
System.out.println (a==b); true 改成128則false
System.out.println (a2==b2); false
System.out.println (a3==b3); false
}
public static void main(String[] args){
int i=10;
for(int j=0;j<10;j++){
i=i++;
System.out.println (i); //始終輸出10
}
}
T.class和t.class是同一個,所以一個包裏不能有t.java和T.java
String String = "111";
寫一個方法,用一個for循環打印九九乘法表
/**
*一個for循環打印九九乘法表
*/
publicvoid nineNineMultiTable()
{
for (int i = 1,j = 1; j <= 9; i++) {
System.out.print(i+"*"+j+"="+i*j+" ");
if(i==j)
{
i=0;
j++;
System.out.println();
}
}
}
描述JAVA中異常處理的機制
• 程序的執行過程中如出現異常,會自動生成一個異常類對象,該異常對象將被提交給Java運行時系統,這個過程稱爲拋出(throw)異常。Java
• 當Java運行時系統接收到異常對象時,會尋找能處理這一異常的代碼並把當前異常對象交給其處理,這一過程稱爲捕獲(catch)異常。
• 如果Java運行時系統找不到可以捕獲異常的方法,則運行時系統將終止,相應的Java程序也將退出。
• 程序員通常只能處理違例(Exception),而對錯誤(Error)無能爲力。
調用的是 Car.Wheel 的構造器
因爲 你這個類,是集成自 Car.Wheel而不是 Car.
同樣,因爲你不是單純的集成子Wheel,所以你必須有一個Car的實例,因爲Wheel屬於Car。
public class B {
public static void main(String[] aa) {
Set <Integer> set = new TreeSet <Integer>();
List <Integer> list = new ArrayList <Integer>();
for (int i = -3; i < 3; i++) {
set.add(i);
list.add(i);
}
for (int i = 0; i < 3; i++) {
set.remove(i);
list.remove(i);
}
System.out.println(set + " " + list);
}
} [-3, -2, -1] [-2, 0, 2]