吾日三省吾身、溫故而知新

題目1:final在Java中的作用?
答案1:final修飾基本數據類型變量和引用數據類型變量
被final修飾的常量在編譯階段會被放入常量池中
在局部或者匿名內部類在使用外部局部變量時只能使用被final修飾的變量。
修飾類:使用final修飾類的目的簡單明確: 表明這個類不能被繼承.
final可以修飾方法(在方法非常龐大的時候,這樣的內嵌手段是幾乎看不到任何性能上的提升的,在最近的Java版本中,不需要使用final方法進行這些優化了

題目2:普通類和抽象類有哪些區別?
答案2:抽象類不能被實例化。
抽象類可以有構造函數,被繼承時子類必須繼承父類一個構造方法,抽象方法不能被聲明爲靜態。
抽象方法只需申明,而無需實現,抽象類中可以允許普通方法有主體
含有抽象方法的類必須申明爲抽象類
抽象的子類必須實現抽象類中所有抽象方法,否則這個子類也是抽象類。

題目3:Java中操作字符串都有哪些類型?它們之間的有什麼區別?
答案3:Java中操作字符串分爲String、StringBuilder、StringBuffer三個類,這三個類之間主要的區別在”運行速度“和”線程安全“方面。
(1)運行速度(執行速度):StringBuilder>StringBuffer>String
String最慢的原因:下面的例子表面上看是abc+def組成abcdef的結果,但我們仔細分析一下,首先String先創建一個對象abc然後在abc=abc+def加起來再賦值給一個新的abc,而原來的abc被JVM的GC(回收機制)給回收掉了,所以實際上這兩個abc不是同一個abc,所以String操作字符串的過程是一個不斷創建對象和回收對象的過程。String爲字符串常量,而StringBuilder和StringBuffer均爲字符串變量,即String對象一旦創建之後該對象是不可更改的,但後兩者的對象是變量,是可以更改的。而StringBuilder和StringBuffer的對象是變量,對變量進行操作就是直接對該對象進行更改,而不進行創建和回收的操作,所以速度要比String快很多。
(2)線程安全
在線程安全上,StringBuilder是線程不安全的,而StringBuffer是線程安全的。如果一個StringBuffer對象在字符串緩衝區被多個線程使用時,StringBuffer中很多方法可以帶有synchronized關鍵字,所以可以保證線程是安全的,但StringBuilder的方法則沒有該關鍵字,所以不能保證線程安全,有可能會出現一些錯誤的操作。所以如果要進行的操作是多線程的,那麼就要使用StringBuffer,但是在單線程的情況下,還是建議使用速度比較快的StringBuilder。

題目4:面向對象的特徵有哪些方面,具體有何含義?
答案4:
面向對象的三大特徵:1.繼承 2.封裝 3.多態性
(1)繼承:就是保留父類的屬性,開擴新的東西。通過子類可以實現繼承,子類繼承父類的所有狀態和行爲,同時添加自身的狀態和行爲。

(2)封裝:就是類的私有化。將代碼及處理數據綁定在一起的一種編程機制,該機制保證程序和數據不受外部干擾。

(3)多態:是允許將父對象設置成爲和一個和多個它的子對象相等的技術。包括重載和重寫。重載爲編譯時多態,重寫是運行時多態

題目5:定義長方形類,含:
屬性:寬、高(整型);
方法:求周長、面積;
構造方法3個:
(1)無參——寬、高默認值爲1;
(2)1個參數——寬、高均爲參數值;
(3)2個參數——寬、高各爲參數值。
寫出代碼並得出打印結果。
答案5:
定義類://定義長寬屬性
private int iWidth; private int iHeight;
//構造器1
public Rectangle(){
this.iHeight = 1;this.iWidth = 1;
}
//構造器2
public Rectangle(int iIndex){
this.iWidth = iIndex;
this.iHeight = iIndex;
}
//構造器3
public Rectangle(int iWidth, int iHeight){
this.iHeight = iHeight;this.iWidth = iWidth;
}
//求周長
public int getLength(){
return 2*(this.iHeight+this.iWidth);
}
//求面積
public int getSquare(){
return this.iHeight*this.iWidth;
}

測試類:public static void main(String[] args) {
// TODO Auto-generated method stub
Rectangle oRec1 = new Rectangle();
System.out.println(“默認長方形的周長爲:”+oRec1.getLength());
System.out.println(“默認長方形的面積爲:”+oRec1.getSquare());

Rectangle oRec2 = new Rectangle(2);
System.out.println("一個參數長方形的周長爲:"+oRec2.getLength());
System.out.println("一個參數長方形的面積爲:"+oRec2.getSquare());

Rectangle oRec3 = new Rectangle(2,3);
System.out.println("兩個參數長方形的周長爲:"+oRec3.getLength());
System.out.println("兩個參數長方形的面積爲:"+oRec3.getSquare());

}
打印結果:默認長方形的周長爲:4
默認長方形的面積爲:1
一個參數長方形的周長爲:8
一個參數長方形的面積爲:4
兩個參數長方形的周長爲:10
兩個參數長方形的面積爲:6

題目6:運行時異常和編譯時異常在運行時候的區別,爲什麼/0這種運行時異常不用寫判斷語句?那麼編譯時異 常又怎麼實現捕獲的?
答案6:運行時異常:都是RuntimeException類及其子類異常,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理
非運行時異常 (編譯異常):是RuntimeException以外的異常,類型上都屬於Exception類及其子類。是必須進行處理的異常,如果不處理,程序就不能編譯通過。
程序就不能編譯通過 /0這種運行是系統自己會處理 編譯異常可以自己處理異常,也可以拋出異常不處理

題目7:String類型new對象時總共創建了幾次?
答案7:這個創建2個class;2次,常量池一次,堆一次

題目8:啓動一個線程用run()還是start()
答案8:啓動一個線程用的是start()方法,使線程進入就緒狀態,以後可以被調度爲運行狀態。run(方法是線程的線程執行體,是線程將要完成的事

題目9:Thread類的sleep()方法和對象的wait()方法都可以讓線程暫停執行,它們有什麼區別?
答案9:
sleep()方法(休眠)是線程類(Thread)的靜態方法,調用此方法會讓當前線程暫停執行指定的時間,
將執行機會(CPU)讓給其他線程,但是對象的鎖依然保持,因此休眠時間結束後會自動恢復(線程回到就緒狀態,
請參考第66題中的線程狀態轉換圖)。wait()是Object類的方法,調用對象的wait()方法導致當前線程放棄對象的鎖(
線程暫停執行),進入對象的等待池(wait pool),只有調用對象的notify()方法(或notifyAll()方法)
時才能喚醒等待池中的線程進入等鎖池(lock pool),如果線程重新獲得對象的鎖就可以進入就緒狀態。

題目10:請說出與線程同步以及線程調度相關的方法。
答案10:
wait():使一個線程處於等待(阻塞)狀態,並且釋放所持有的對象的鎖;
sleep():使一個正在運行的線程進入休眠狀態
notify():喚醒一個處於等待狀態的線程,當然在調用此方法的時候,並不能確切的喚醒 某一個等待狀態的線程,而是由 JVM 確定喚醒哪個線程,而且與優先級無關;
notityAll():喚醒所有處於等待狀態的線程,該方法並不是將對象的鎖給所有線程,而是 讓它們競爭,只有獲得鎖的線程才能進入就緒狀態;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章