Java面試題總結之Java基礎(二)

Java面試題總結之Java基礎()java

1、寫clone()方法時,一般都有一行代碼,是什麼?c++

答:super.clone(),他負責產生正確大小的空間,並逐位複製。程序員

2GC 是什麼? 爲何要有GC? 面試

答:GC 是垃圾收集的意思(Gabage Collection),內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會致使程序或系統的不穩定甚至崩潰,Java 提供的GC 功能能夠自動監測對象是否超過做用域從而達到自動回收內存的目的,Java 語言沒有提供釋放已分配內存的顯示操做方法。Java 程序員不用擔憂內存管理,由於垃圾收集器會自動進行管理。要請求垃圾收集,能夠調用下面的方法之一:System.gc() Runtime.getRuntime().gc() sql

3、垃圾回收的優勢和原理。並考慮2 種回收機制。編程

答:1.Java 語言中一個顯著的特色就是引入了垃圾回收機制,使c++程序員最頭疼的內存管理的問題迎刃而解,它使得Java 程序員在編寫程序的時候再也不須要考慮內存管理。數組

2.因爲有垃圾回收機制,Java 中的對象再也不有「做用域」的概念,只有對象的引用纔有「做用域」。瀏覽器

3.垃圾回收能夠有效的防止內存泄露,有效的使用可使用的內存。網絡

4.垃圾回收器一般是做爲一個單獨的低級別的線程運行,在不可預知的狀況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清楚和回收,程序員不能實時的調用垃圾回收器對某個對象或全部對象進行垃圾回收。編程語言

回收機制有分代複製垃圾回收和標記垃圾回收,增量垃圾回收。

4、垃圾回收器的基本原理是什麼?垃圾回收器能夠立刻回收內存嗎?有什麼辦法主動通知虛擬機進行垃圾回收?

答:1.對於GC 來講,當程序員建立對象時,GC 就開始監控這個對象的地址、大小以及使用狀況。一般,GC 採用有向圖的方式記錄和管理堆(heap)中的全部對象。經過這種方式肯定哪些對象是"可達的",哪些對象是"不可達的"。當GC 肯定一些對象爲"不可達"時,GC 就有責任回收這些內存空間。

2.能夠。

3.程序員能夠手動執行System.gc(),通知GC 運行,可是Java 語言規範並不保證GC 必定會執行。

5String s=new String(xyz);建立了幾個String Object?

答:兩個對象,一個是"xyx",一個是指向"xyx"的引用對象s。

6、接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承實體類(concrete class)?

答:接口能夠繼承接口。抽象類能夠實現(implements)接口,抽象類可繼承實體類,但前提是實體類必須有明確的構造函數。

7Java 的接口和C++的虛類的相同和不一樣處。

c++虛類至關與java裏面的抽象類,與接口的不一樣之處以下:

一、一個子類只能繼承一個抽象類(虛類),但能實現多個接口;

二、一個抽象類能夠有構造方法,接口沒有構造方法;
三、一個抽象類中的方法不必定是抽象方法,即其中一些方法能夠有實現(有方法體),接口中的方法都是抽象方法,不能有方法體,只有聲明;
四、一個抽象類能夠是public、private、protected、default,
接口只能是public;
五、一個抽象類中的方法能夠是public、private、protected、default,
接口中的方法只能是public和default。

相同之處:都不能實例化。

接口是一類特殊的抽象類,是更抽象的抽象類。

8、一個「.java」源文件中是否能夠包含多個類(不是內部類)?有什麼限制?

答:能夠;一個「.java」源文件裏面能夠包含多個類,可是隻容許有一個public類,而且類名必須和文件名一致。

9、說出一些經常使用的類,包,接口,各舉5 個。

答:經常使用的類:BufferedReader,BufferedWriter ,FileReader ,FileWirter,  String ,Integer;

經常使用的包:java.lang ,java.awt, java.io ,java.util ,java.sql;

經常使用的接口:Remote ,List ,Map ,Document ,NodeList

10Anonymous Inner Class (匿名內部類) 是否能夠extends(繼承)其它類?是否能夠implements(實現)interface(接口)?

答:能夠繼承其餘類或實現其餘接口,在swing 編程中經常使用此方式。

11、內部類能夠引用他包含類的成員嗎?有沒有什麼限制?

答:能夠,若是不是靜態內部類,那沒有什麼限制! 若是你把靜態嵌套類看成內部類的一種特例,那在這種狀況下不能夠訪問外部類的普通 成員變 量,而只能訪問外部類中的靜態成員

12java 中實現多態的機制是什麼?

答:方法的覆蓋Overriding 和重載Overloading 是java 多態性的不一樣表現;覆蓋Overriding 是父類與子類之間多態性的一種表現,重載Overloading 是一個類中多態性的一種表現。

13、在java 中一個類被聲明爲final 類型,表示了什麼意思?

答:表示該類不能被繼承,是頂級類。

14、下面哪些類能夠被繼承?

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)

答:一、二、7 能夠被繼承。

15、指出下面程序的運行結果:

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 代碼段,能夠看做是類首次加載(虛擬機加載)執行的代碼,而對於類加載,首先要執行其基類的構造方法,再執行其自己的構造方法。

16、寫出下面程序的打印結果?

父類:

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

17、內部類的實現方式?

答:示例代碼以下:

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

18、關於內部類:

public class OuterClass {

private double d1 = 1.0;

//insert code here

}

在第3行插入一個內部類聲明,哪兩個內部類聲明有效?(選擇兩個。)

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 正確。

19、數據類型之間的轉換:

1)如何將數值型字符轉換爲數字?

2)如何將數字轉換爲字符?

3)如何取小數點前兩位並四捨五入?

答:1)調用數值類型相應包裝類中的方法parse***(String)或valueOf(String)便可返回相應基本類型或包裝類型數值;

2)將數字與空字符串相加便可得到其所對應的字符串;對於基本類型數字還可調用String 類中的valueOf(…)方法返回相應字符串,而對於包裝類型數字則可調用其toString()方法得到相對應字符串;

3) //方法1  

public void test1(double c)  

{  

   java.text.DecimalFormat df = new java.text.DecimalFormat("#.##");  

   System.out.println(df.format(c));  

}  

//方法2  

public void test2(double c)  

{  

   java.math.BigDecimal bd   =   new   java.math.BigDecimal(String.valueOf(c));         bd   =   bd.setScale(2,java.math.BigDecimal.ROUND_HALF_UP);     

   System.out.println(bd);  

}  

//方法3  

public void test3(double c)  

{  

   long   l1   =   Math.round(c*100);   //四捨五入     

   double   ret   =   l1/100.0;          //注意:使用   100.0   而不是   100       

   System.out.println(ret);  

}  

//方法4  

public void test4(double c)  

{   

   c=((int)(c*100))/100.0;   

   System.out.println(c);  

}  

20、字符串操做:如何實現字符串的反轉及替換?

答:可用字符串構造一StringBuffer 對象,而後調用StringBuffer 中的reverse方法便可實現字符串的反轉,調用replace 方法便可實現字符串的替換。

public static String reverse(String s){

             String str;

             StringBuffer sbBuffer =new StringBuffer(s);

             str=sbBuffer.reverse().toString();

             return str;

}

21、編碼轉換:怎樣將GB2312 編碼的字符串轉換爲ISO-8859-1 編碼的字符串?

答:String s1 = "你好";

String s2 = new String(s1.getBytes("GB2312"), "ISO-8859-1");

22、寫一個函數,要求輸入一個字符串和一個字符長度,對該字符串進行分隔。

答:代碼以下:

public static String[] split(String str, int length) {

      int n = (str.length() + length - 1) / length;

      String ret[] = new String[n];

      for (int i = 0; i < n; i++) {

        if (i < n - 1) {

         ret[i] = str.substring(i * length, (i + 1) * length);

        } else {

           ret[i] = str.substring(i * length);

        }

      }

      return ret;

}

23、寫一個函數,傳入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;

}

24、日期和時間:

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()方法可將日期格式化。

25Java 編程,打印昨天的當前時刻。

答:public class YesterdayCurrent {

     public static void main(String[] args) {

      Calendar cal = Calendar.getInstance();

      cal.add(Calendar.DATE, -1);

      System.out.println(cal.getTime());

      }

}

26java 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)代碼格式不同。

27、何時用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 標記。還能夠在包的基礎上啓用或者禁用斷言。能夠在預計正常狀況下不會到達的任何位置上放置斷言。斷言能夠用於驗證傳遞給私有方法的參數。不過,斷言不該該用於驗證傳遞給公有方法的參數,由於不論是否啓用了斷言,公有方法都必須檢查其參數。不過,既能夠在公有方法中,也能夠在非公有方法中利用斷言測試後置條件。另外,斷言不該該以任何方式改變程序的狀態。

28Java 中的異常處理機制的簡單原理和應用?

答:當JAVA 程序違反了JAVA 的語義規則時,JAVA 虛擬機就會將發生的錯誤表示爲一個異常。違反語義規則包括2 種狀況。一種是JAVA 類庫內置的語義檢查。例如數組下標越界,會引起IndexOutOfBoundsException;訪問null 的對象時會引起NullPointerException。另外一種狀況就是JAVA 容許程序員擴展這種語義檢查,程序員能夠建立本身的異常,並自由選擇在什麼時候用throw 關鍵字引起異常。全部的異常都是java.lang.Thowable 的子類。

29error exception 有什麼區別?

答:1.Exception 和 Error 都是繼承了 Throwable 類,在 Java 中只有 Throwable 類型的實例才能夠被拋出(throw)或者捕獲(catch),它是異常處理機制的基本組成類型。

2.Exception 和 Error 體現了 Java 平臺設計者對不一樣異常狀況的分類。Exception 是程序正常運行中,能夠預料的意外狀況,可能而且應該被捕獲,進行相應處理。

3.Error 是指在正常狀況下,不大可能出現的狀況,絕大部分的 Error 都會致使程序(好比 JVM 自身)處於非正常的、不可恢復狀態。既然是非正常狀況,因此不便於也不須要捕獲,常見的好比 OutOfMemoryError 之類,都是 Error 的子類。

4.Exception 又分爲可檢查(checked)異常和不檢查(unchecked)異常,可檢查異常在源代碼裏必須顯式地進行捕獲處理,這是編譯期檢查的一部分。前面我介紹的不可查的 Error,是 Throwable 不是 Exception。

5.不檢查異常就是所謂的運行時異常,相似 NullPointerException、ArrayIndexOutOfBoundsException 之類,一般是能夠編碼避免的邏輯錯誤,具體根據須要來判斷是否須要捕獲,並不會在編譯期強制要求。

30try {}裏有一個return 語句,那麼緊跟在這個try 後的finally {}裏的code會不會被執行,何時被執行,在return 前仍是後?

答:會執行,在return 前執行。

相關文章
相關標籤/搜索