為金3銀4準備的50道Java程式設計師面試題與答案
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 +” d=”+d);
}
}
class B extends A{
float a=3.0f;
String d=”Java program.”;
void show(){
super.show( );
System.out.println(“Class B: a=”+a +” d=”+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)是抽象類的變體。新型多繼承性可通過實現這樣的介面而獲得。介面中的所有方法都是抽象的,所有成員變數都是publicstatic 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
進群 697579751 免費獲取面試資料,學習視訊