Java面試題總結之Java基礎(一)
1、面向對象的特征有哪些?
答:面向對象的特征主要有以下幾個:
1)抽象:抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象并不需要了解全部的問題,而只是選擇其中的一部分,避免考慮一些與目標無關的細節。抽象包括兩個方面,一是過程抽象,二是數據抽象。
2)繼承:一個新類可以從現有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那里繼承方法和實例變量,并且新類可以修改或增加新的方法使之更適合特殊的需要。
3)封裝:封裝是把過程和數據包圍起來,對數據的訪問只能通過已定義的界面。面向對象計算始于這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的對象,這些對象通過一個受保護的接口訪問其他對象。
4)多態性:多態性是指允許不同類的對象對同一消息作出響應。多態性包括參數化多態性和包含多態性。多態性語言具有靈活、抽象、行為共享、代碼共享的優勢,很好的解決了應用程序函數同名問題。
2、作用域public,private,protected,以及不寫時的區別?
答:區別如下:
作用域當前類?????? 同包????? 子孫類? 其他
public ???√ ?????????? √ ??????? ?√???? √
protected √????? ?? ?√ ?????? ?√ ????? ?×
default?? √ ?????????? √ ??????? ?× ????? ?×
private?? √ ?????????? × ??????? ?× ????? ?×
不寫時默認為default。
3、shorts1 = 1; s1 = s1 + 1;有什么錯?
shorts1 = 1; s1 += 1;有什么錯?
答:short s1 = 1; s1 = s1 + 1;s1+1運算結果是int 型,需要強制轉換類型;short s1 = 1; s1 += 1;可以正確編譯,自動類型提升。
4、Java 有沒有goto?
答:goto 是java 中的保留字,現在沒有在java 中使用,可能以后會使用。
5、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
6、&和&&的區別?
答:&&和&都表示與時,區別是&&只要第一個條件不滿足,后面條件就不再判斷,而&要對所有的條件都進行判斷。&還可以用作位運算符,當&操作符兩邊的表達式不是 boolean 類型時,&表示按位與操作兩個操作數中位都為1,結果才為1,否則結果為0。
7、簡述邏輯操作(&,|,^)與條件操作(&&,||)的區別?
答:區別主要有兩點:
a.條件操作只能操作布爾型的,而邏輯操作不僅可以操作布爾型,而且可以操作數值型。
b.邏輯操作不會產生短路。
8、heap 和stack 有什么區別?
答:
1、棧(操作系統):由操作系統自動分配釋放,存放函數的參數值,局部變量的值等。其操作方式類似于數據結構中的棧;
2、堆(操作系統):一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收,分配方式倒是類似于鏈表。
要點:堆,隊列優先,先進先出(FIFO—first in first out)。棧,先進后出(FILO—First-In/Last-Out)。
9、Math.round(11.5) 等于多少? Math.round(-11.5)等于多少?
答:Math.round(11.5)==12 Math.round(-11.5)==-11 round 方法返回與參數最接近的長整數,參數加1/2 后求其floor(向下取整)。
10、swtich 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上?
答:switch(ex)中,ex是一個整數表達式。因此傳遞給switch 和case語句的參數應該是int、short、char 或者byte。long,string 都不能作用在swtich上。
11、編程題: 用最有效率的方法算出2 乘以8 等于幾?
答: 2 << 3。
12、數組中有沒有length()這個方法? String 中有沒有length()這個方法?
答:數組中沒有length()這個方法,有length 屬性。String中有length()這個方法。
13、在JAVA 中,如何跳出當前的多重嵌套循環?
答:在最外層循環前加label 標識,然后用break:label 方法即可跳出多重循環。
14、構造器Constructor 是否可被override?
答:構造器Constructor 不能被繼承,因此不能重寫Overriding,但可以被重載Overloading。
15、兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?
答:不對,有相同的hash code。Java中對于eqauls方法和hashCode方法是這樣規定的:(1)如果兩個對象相同(equals方法返回true),那么它們的hashCode值一定要相同;(2)如果兩個對象的hashCode相同,它們并不一定相同。
16、String 類是否可以被繼承?
答:String 類是final 類,故不可以被繼承。
17、以下二條語句返回值為true 的有:
A:“beijing”==“beijing”;
B:“beijing”.equalsIgnoreCase(new String(“beijing”));
答:A 和B 。equalsIgnoreCase()方法將一個 String 與另一個 String 進行比較時,不考慮大小寫。如果兩個字符串的長度相等,并且兩個字符串中的相應字符都相等(忽略大小寫),則認為這兩個字符串是相等的。equals方法和equalsIgnoreCase方法都是應用十分廣泛的方法,兩者之間的區別為equals方法在比較的過程中嚴格區分大小寫,而equalsIgnoreCase方法在比較的過程中忽略大小寫。
18、當一個對象被當作參數傳遞到一個方法后,此方法可改變這個對象的屬性,并可返回變化后的結果,那么這里到底是值傳遞還是引用傳遞?
答:是值傳遞。Java 編程語言只有值傳遞參數。當一個對象實例作為一個參數被傳遞到方法中時,參數的值就是對該對象的引用。對象的內容可以在被調用的方法中改變,但對象的引用是永遠不會變的。
19、我們在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());
}
returntempStr;
}
20、String, StringBuffer StringBuilder 的區別。
答:String 的長度是不可變的;StringBuffer 的長度是可變的,如果你對字符串中的內容,需要經常進行修改時,那么使用StringBuffer,如果最后需要String,可以使用StringBuffer 的toString()方法轉換成String;線程安全;StringBuilder是JDK1.5發布的,它和StringBuffer本質上沒什么區別,就是去掉了保證線程安全的那部分,減少了開銷。運行速度快慢為:StringBuilder > StringBuffer > String通常應該優先使用StringBuilder類,由于它不執行同步,所以速度更快。
21、Overload 和Override 的區別。Overloaded 的方法是否可以改變返回值的類型?
答:方法的重寫Overriding 和重載Overloading 是Java 多態性的不同表現。重寫Overriding 是父類與子類之間多態性的一種表現,重載Overloading 是一個類中多態性的一種表現。如果在子類中定義的某個方法與其父類中某個方法有相同的名稱和參數,我們說該方法被重寫了(Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被“屏蔽”了。如果在一個類中定義了多個同名的方法,它們的參數個數或參數類型不同,則稱為方法的重載(Overloading)。Overloaded 的方法是可以改變返回值的類型。
22、定義類A 和類B 如下:
class A {
inta = 1;
doubled = 2.0;
void show() {
System.out.println("Class A:a=" + a + "\td=" + d);
}
}
class B extends A {
floata = 3.0f;
String d = "Java program.";
void show() {
super.show();
System.out.println("Class B:a=" + a + "\td=" + 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
23、簡述JVM 加載class 文件的原理機制?
答:Java中的所有類,都需要由類加載器裝載到JVM中才能運行。類加載器本身也是一個類,而它的工作就是把class文件從硬盤讀取到內存中。在寫程序的時候,我們幾乎不需要關心類的加載,因為這些都是隱式裝載的,除非我們有特殊的用法,像是反射,就需要顯式的加載所需要的類。JVM 中類的裝載是由ClassLoader 和它的子類來實現的,Java ClassLoader是一個重要的Java 運行時系統組件。它負責在運行時查找和裝入類文件的類。
24、char 型變量中能不能存貯一個中文漢字?為什么?
答:可以,因為Java默認采用Unicode編碼,一個char 占2個字節,一個漢字也是占2個字節,所以放一個中文漢字是沒問題的。
25、abstract class 和interface 有什么區別?
答:含有 abstract 修飾符的類即為抽象類,抽象類不能創建實例,含有抽象方法的類必須定義為 abstract class。接口是一種特殊的抽象類,接口中的所有方法都必須是抽象的,接口中的方法默認定義為 public abstract 類型,接口中的成員變量類型默認為 public static final。
二者的區別:
(1)? 抽象類可以有構造方法,接口中不能有構造方法。
(2)? 抽象類中可以有普通成員變量,接口中沒有普通成員變量。
(3)? 抽象類中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的方法。
(4)? 抽象類中的抽象方法的訪問權限可以是 public、protected 和(默認類型,雖然 eclipse 不報錯,但一般不使用,因為默認類型子類不能繼承),接口中的抽象方法只能是 public 類型的,并且默認即為 public abstract 類型。
(5)? 抽象類中可以包含靜態方法,在 JDK1.8 之前接口中不能不包含靜態方法,JDK1.8 以后可以包含。
(6)? 抽象類和接口中都可以包含靜態成員變量,抽象類中的靜態成員變量的訪問權限可以是任意的,但接口中定義的變量只能是 public static final 類型的,并且默認即為 public static final 類型。
(7)? 一個類可以實現多個接口,用逗號隔開,但只能繼承一個抽象類,接口不可以實現接口,但可以繼承接口,并且可以繼承多個接口,用逗號隔開。
26、Static Nested Class(嵌套類)和 Inner Class(內部類)的不同?
答:Nested Class 一般是C++的說法,Inner Class 一般是JAVA的說法。
Nested class分為靜態Static nested class 的和非靜態的 inner class。Static Nested Class 是被聲明為靜態(static)的內部類,它可以不依賴于外部類實例被實例化。而通常的內部類需要在外部類實例化后才能實例化。
27、java 中會存在內存泄漏嗎,請簡單描述。
答:會;理論上Java因為有垃圾回收機制(GC)不會存在內存泄露問題(這也是Java被廣泛使用于服務器端編程的一個重要原因);然而在實際開發中,可能會存在無用但可達的對象,這些對象不能被GC回收,因此也會導致內存泄露的發生。例如Hibernate的Session(一級緩存)中的對象屬于持久態,垃圾回收器是不會回收這些對象的,然而這些對象中可能存在無用的垃圾對象,如果不及時關閉(close)或清空(flush)一級緩存就可能導致內存泄露。
28、abstract 的method 是否可同時是static,是否可同時是native,是否可同時是synchronized?
答:都不能。不能是native的,本地方法是由本地代碼(如c代碼)實現的方法,抽象方法是沒有實現的,不能是synchronized的,synchronized和方法具體實現細節相關,抽象方法沒有方法的實現。不能是static的,static方法是不能被覆蓋的,而abstract方法正是要子類去覆蓋它。
29、靜態變量和實例變量的區別?
答:靜態變量也稱為類變量,歸全類共有,它不依賴于某個對象,可通過類名直接訪問;而實例變量必須依存于某一實例,只能通過對象才能訪問到它。
30、是否可以從一個static 方法內部發出對非static 方法的調用?
答:不可以, 靜態方法只能訪問靜態變量,實例方法可以訪問靜態變量和實例變量。
長按識別二維碼關注。
覺得不錯,點下好看,轉發朋友圈支持一下,感激不盡!
Java JDK
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。