1. float型float f=3.4是否正確?
答:不正確,應為float f=3.4f
2. 當一個對象被當作參數傳遞到一個方法后,此方法可改變這個對象的屬性,并可返回變化后的結果,那么這里到底是值傳遞還是引用傳遞?
答:是引用傳遞。
3. 在java中一個類被聲明為final類型,表示了什么意思?
答:表示該類不能被繼承,意味著它不能再派生出新的子類,不能作為父類被繼承,是頂級類。
4. Error與Exception有什么區別?
答:Error(錯誤)表示系統級的錯誤和程序不必處理的異常,是java運行環境中的內部錯誤或者硬件問題,比如,內存資源不足等,對于這種錯誤,程序基本無能為力,除了退出運行外別無選擇。
Exception(違例)表示需要捕捉或者需要程序進行處理的異常,它處理的是因為程序設計的瑕疵而引起的問題或者在外的輸入等引起的一般性問題,是程序必須處理的。
5. 談談final, finally的區別。
答:final是修飾符(關鍵字)如果一個類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個類不能既被聲明為 abstract,又被聲明為final。將變量或方法聲明為final,可以保證它們在使用中不被改變。被聲明為final的變量必須在聲明時給定初值,而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載。
Finally是在異常處理時提供 finally 塊來執行任何清除操作。如果拋出一個異常,那么相匹配的 catch 子句就會執行,然后控制就會進入 finally 塊(如果有的話),只要有finally語句塊,無論程序如何運行,它都必然被執行到。
6. String s = new String("xyz");創建了幾個String Object?
答:創建了兩個,new String("xyz")是一個對象,“xyz”一個對象,他們2個存放在堆區中,而s只是一個指向 new String("xyz")的引用變量,存放于棧區中。
7. short s1 = 1; s1 = s1 + 1;有什么錯? short s1 = 1; s1 += 1;有什么錯?
答:第一個有錯誤,因為s1=s1+1,不能把s1強制轉為int類型的
第二個沒有錯誤,因為s1+=1的時候會把short類型的s1自動轉型為int類型
8. 數組有沒有length()這個方法? String有沒有length()這個方法?
答:數組沒有,String有。
9. Overload和Override的區別
答:方法的覆蓋(Overriding)和重載(Overloading)是 Java多態性的不同表現。覆蓋(Overriding)是父類與子類之間多態性的一種表現,重載(Overloading)是一個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被覆蓋 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被“屏蔽”了。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重載(Overloading)。Overloaded的方法可以改變返回值的類型。
10. abstract class和interface有什么區別?
答:聲明方法的存在而不去實現它的類被叫做抽象類(abstract class),它用于要創建一個體現某些基本行為的類,并為該類聲明方法,但不能在該類中實現該類的情況。不能創建abstract 類的實例。然而可以創建一個變量,其類型是一個抽象類,并讓它指向具體子類的一個實例。不能有抽象構造函數或抽象靜態方法。Abstract 類的子類為它們父類中的所有抽象方法提供實現,否則它們也是抽象類為。取而代之,在子類中實現該方法。知道其行為的其它類可以在類中實現這些方法
接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過實現這樣的接口而獲得。接口中的所有方法都是抽象的,沒有一個有程序體。接口只可以定義static final成員變量。接口的實現與子類相似,除了該實現類不能從接口定義中繼承行為。當類實現特殊接口時,它定義(即將程序體給予)所有這種接口的方法。然后,它可以在實現了該接口的類的任何對象上調用接口的方法。由于有抽象類,它允許使用接口名作為引用變量的類型。通常的動態聯編將生效。引用可以轉換到接口類型或從接口類型轉換,instanceof 運算符可以用來決定某對象的類是否實現了接口
11. 構造器Constructor是否可被override?
答:構造器Constructor不能被繼承,因此不能重寫Overriding,但可以被重載Overloading。
12. 是否可以繼承String類?
答:String類是final類所以不可以繼承。
13. 題目如下:
父類:
public class FatherClass


{
public FatherClass()

{
System.out.println("FatherClass Create");
}

}
子類:
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
22. 多線程有幾種實現方法,都是什么?同步有幾種實現方法,都是什么?
答:多線程有三種實現方法,分別為:
① 實現Runnable接口,覆蓋Run()方法。
② 繼承Thread,覆蓋Run()方法。
③ 繼承TimerTask,覆蓋Run()方法。
同步的實現是在方法前加synchronized,在調用wait()和notify()。
23. 請說出你所知道的線程同步的方法
答:1. synchronized 方法:通過在方法聲明中加入 synchronized關鍵字來聲明 synchronized 方法。
2. synchronized 塊:通過 synchronized關鍵字來聲明synchronized 塊。
24. 當一個線程進入一個對象的一個synchronized方法后,其它線程是否可進入此對象的其它方法?
答:不可以。synchronized 方法都必須獲得調用該方法的類實例的鎖方能執行,否則所屬線程阻塞,方法一旦執行,就獨占該鎖,直到從該方法返回時才將鎖釋放,此后被阻塞的線程才能獲得該鎖,重新進入可執行狀態。
25. 用JAVA SOCKET編程,實現簡單的Echo功能
如: 客戶端從鍵盤輸入 hi (當用戶輸出exit 退出程序),服務端響應為 hi(服務器要求為多線程)
解:服務器程序:
import java.io.*;

import java.net.*;


public class MyServer extends Thread
{

private Socket cq ;

public MyServer(Socket cq)


{

this.cq = cq;

}

public void run()


{

try


{

BufferedReader in=new BufferedReader(new InputStreamReader(cq.getInputStream()));

PrintWriter out=new PrintWriter(cq.getOutputStream());

while(true)


{

String str=in.readLine();

System.out.println(str);

out.println("message: "+str);

out.flush();

if(str.equals("exit"))

break;

}

}

catch(IOException e)


{

System.out.println(e.message());

}

}


public static void main(String[] args) throws IOException
{

ServerSocket server=new ServerSocket(8009);

while(true)


{

Socket s=server.accept();

new MyServer(s).start();

}

}

}
客戶端程序:
import java.net.*;

import java.io.*;


public class MyClient
{

public static void main(String[] args)throws Exception


{

Socket server=new Socket("localhost",8009);

BufferedReader in=new BufferedReader(new InputStreamReader(server.getInputStream()));

PrintWriter out=new PrintWriter(server.getOutputStream());

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

while(true)


{

String str=br.readLine();

out.println(str);

out.flush();


if(str.equals("exit"))
{

break;

}

System.out.println(in.readLine());

}

server.close();

}

}
14. public class OuterClass {
private double d1 = 1.0;
//insert code here ~~ line 3
}
從下列選項中選擇兩個正確的答案放在 line 3 中(C E)
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();
}
15. STRING與STRINGBUFFER的區別
答:STRING的長度是不可變的,一旦一個String對象被創建,包含在這個實例中的內容(“字符串”)不可以被更改,直至這個對象被銷毀,因此,指向一個 String對象的變量實質上是一個常量,String對象也被稱為常量對象;STRINGBUFFER的長度是可變的,可以通過 StringBuffer的append()、insert()、reverse()、setCharAt()、setLength()等方法,可以對這個字符串中的內容修改。如果你對字符串中的內容經常進行操作,特別是內容要修改時,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法
16. JAVA類實現序例化的方法是?
答:JAVA類要實現序列化,對應的類必須先實現Serializable和 Externalizable這兩種接口,然后就可以調用ObjectOutputStream的witeObject()方法來保存對象以及通過 ObjeatInputStream的readObjeact()方法來讀取保存的對象。
17. Collection框架中實現比較要實現什么接口?
答:要實現Comparable接口,并實現這個接口的唯一方法cpmparaTo(),接受一個Object對象,在這個方法中可以定義對象的排序規則。
18. 介紹JAVA中的Collection 框架結構 , 并畫出來
<>Collection
<>Set
<>List
HashSet
Tree set
ArrayList
Vector
19. 編程題:列出某文件夾下的所有文件 (文件夾從命令行輸入)
解:
import java.io.*;

public class listFile


{

public static void main (String[] args)


{

String s="";

InputStreamReader ir=new InputStreamReader(System.in);

BufferedReader in = new BufferedReader(ir);


try
{

s = in.readLine();

File f=new File(s);

File[] files=f.listFiles();

for(int i=0;i


{

if(files[i].isFile())


{

System.out.println("文件:"+files[i]);

}

else


{

System.out.println("目錄:"+files[i]);

}

}

in.close();

}

catch (IOException e)


{

e.printStackTrace();

}

}

}
20. 編程題::寫一個滿足Singleton模式的類出來
一般Singleton模式通常有幾種形式:

public class Singleton
{


private Singleton()
{}

//在自己內部定義自己一個實例,是不是很奇怪?
//注意這是private 只供內部調用

private static Singleton instance = new Singleton();

//這里提供了一個供外部訪問本class的靜態方法,可以直接訪問

public static Singleton getInstance()
{
return instance;
}
}

第二種形式:

public class Singleton
{
private static Singleton instance = null;


public static synchronized Singleton getInstance()
{

if (instance==null)
instance=new Singleton();
return instance; }

}

使用Singleton.getInstance()可以訪問單態類。
上面第二中形式是lazy initialization,也就是說第一次調用時初始Singleton,以后就不用再生成了。
注意到lazy initialization形式中的synchronized,這個synchronized很重要,如果沒有synchronized,那么使用getInstance()是有可能得到多個Singleton實例。關于lazy initialization的Singleton有很多涉及double-checked locking (DCL)的討論,有興趣者進一步研究。
一般認為第一種形式要更加安全些。
使用Singleton注意事項:
有時在某些情況下,使用Singleton并不能達到Singleton的目的,如有多個Singleton對象同時被不同的類裝入器裝載;在EJB這樣的分布式系統中使用也要注意這種情況,因為EJB是跨服務器,跨JVM的。
我們以SUN公司的寵物店源碼(Pet Store 1.3.1)的ServiceLocator為例稍微分析一下:
在Pet Store中ServiceLocator有兩種,一個是EJB目錄下;一個是WEB目錄下,我們檢查這兩個ServiceLocator會發現內容差不多,都是提供EJB的查詢定位服務,可是為什么要分開呢?仔細研究對這兩種ServiceLocator才發現區別:在WEB中的ServiceLocator的采取Singleton模式,ServiceLocator屬于資源定位,理所當然應該使用Singleton模式。但是在EJB中,Singleton模式已經失去作用,所以ServiceLocator才分成兩種,一種面向WEB服務的,一種是面向EJB服務的。
Singleton模式看起來簡單,使用方法也很方便,但是真正用好,是非常不容易,需要對Java的類 線程 內存等概念有相當的了解。
總之:如果你的應用基于容器,那么Singleton模式少用或者不用,可以使用相關替代技術。
21. 編程:編寫一個截取字符串的函數,輸入為一個字符串和字節數,輸出為按字節截取的字符串。 但是要保證漢字不被截半個,如“我ABC”4,應該截為“我AB”,輸入“我ABC漢DEF”,6,應該輸出為“我ABC”而不是“我ABC+漢的半個”
解:
import java.io.*;

class interceptString


{

String interceptStr;

int interceptByte;

public interceptString(String str,int bytes)


{

interceptStr=str;

interceptByte=bytes;

System.out.println("字符串為:'"+interceptStr+"';字節數為:"+interceptByte);

}

public void interceptIt()


{

int interceptCount; interceptCount=(interceptStr.length()%interceptByte==0)?(interceptStr.length()/interceptByte):(interceptStr.length()/interceptByte+1);

System.out.println("截取后斷數為:"+interceptCount);

for (int i=1;i<=interceptCount ;i++ )


{ if (i==interceptCount)


{

System.out.println(interceptStr.substring((i-1)*interceptByte,interceptStr.length()));

} else


{

System.out.println(interceptStr.substring((i-1)*interceptByte,(i*interceptByte)));

}

}

}

public static void main(String[] args)


{

String s="";

InputStreamReader ir=new InputStreamReader(System.in);

BufferedReader in = new BufferedReader(ir);


try
{

s = in.readLine();

interceptString ss = new interceptString(s,4);

ss.interceptIt();

in.close();

} catch (IOException e)


{ e.printStackTrace();}

}

}
posted on 2009-03-04 12:27
ゞ沉默是金ゞ 閱讀(2002)
評論(18) 編輯 收藏 所屬分類:
Java SE