1.是否可以從一個static方法內部發出對非static方法的調用?
不可以。當一個static方法被調用時,可能還沒有創建任何實例對象,如果從一個static方法中發出對非static方法的調用,那個非static方法是關聯到哪個對象上的呢?這個邏輯無法成立.
2.Integer與int的區別?
int是java提供的8種原始數據類型之一,Integer是java為int提供的封裝類。int的默認值為0,而Integer的默認值為null,即Integer可以區分出未賦值和值為0的區別,int則無法表達出未賦值的情況。
在JSP開發中,Integer的默認為null,所以用el表達式在文本框中顯示時,值為空白字符串,而int默認的默認值為0,所以用el表達式在文本框中顯示時,結果為0,所以,int不適合作為web層的表單數據的類型。
在Hibernate中,如果將OID定義為Integer類型,那么Hibernate就可以根據其值是否為null而判斷一個對象是否是臨時的,如果將OID定義為了int類型,還需要在hbm映射文件中設置其unsaved-value屬性為0。
3.Math.round(11.5)等於多少?Math.round(-11.5)等於多少?
Math類中提供了三個與取整有關的方法:ceil、floor、round,
- ceil的英文意義是天花板,該方法就表示向上取整,Math.ceil(11.3)的結果為12,Math.ceil(-11.3)的結果是-11。
- floor的英文意義是地板,該方法就表示向下取整,Math.floor(11.6)的結果為11,Math.floor(-11.6)的結果是-12.
- round表示“四舍五入”,Math.round(11.5)的結果為12,Math.round(-11.5)的結果為-11。
4.Overload和Override的區別?Overloaded的方法是否可以改變返回值的類型?
Overload是重載的意思,Override是覆蓋的意思,也就是重寫。重載Overload表示同一個類中可以有多個名稱相同的方法,但這些方法的參數列表各不相同(即參數個數或類型不同)。
重寫Override表示子類中的方法可以與父類中的某個方法的名稱和參數完全相同,通過子類創建的實例對象調用這個方法時,將調用子類中的定義方法,這相當於把父類中定義的那個完全相同的方法給覆蓋了,這也是面向對象編程的多態性的一種表現。子類覆蓋父類的方法時,只能比父類拋出更少的異常,或者是拋出父類拋出的異常的子異常,因為子類可以解決父類的一些問題,不能比父類有更多的問題。子類方法的訪問權限只能比父類的更大,不能更小。如果父類的方法是private類型,那么,子類則不存在覆蓋的限制,相當於子類中增加了一個全新的方法。
5.接口是否可繼承接口?抽象類是否可實現(implements)接口?抽象類是否可繼承具體類(concreteclass)?抽象類中是否可以有靜態的main方法?
接口可以繼承接口。抽象類可以實現(implements)接口,抽象類可以繼承具體類。抽象類中可以有靜態的main方法。抽象類與普通類的唯一區別就是不能創建實例對象和允許有abstract方法。
6.Java中實現多態的機制是什么?
- 抽象的來講,多態的意思就是同一消息可以根據發送對象的不同而采用多種不同的行為方式。(發送消息就是函數調用)
- 實現的原理是動態綁定,程序調用的方法在運行期才動態綁定,追溯源碼可以發現,JVM 通過參數的自動轉型來找到合適的辦法。
7.abstractclass和interface語法上有什么區別?
抽象類可以有構造方法,接口中不能有構造方法。
抽象類中可以有普通成員變量,接口中沒有普通成員變量
抽象類中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的普通方法。
抽象類中的抽象方法的訪問類型可以是public,protected和(默認類型,雖然eclipse下不報錯,但應該也不行),但接口中的抽象方法只能是public類型的,並且默認即為public abstract類型。
抽象類中可以包含靜態方法,接口中不能包含靜態方法
抽象類和接口中都可以包含靜態成員變量,抽象類中的靜態成員變量的訪問類型可以任意,但接口中定義的變量只能是publicstatic final類型,並且默認即為publicstatic final類型。
一個類可以實現多個接口,但只能繼承一個抽象類。
8.abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized?
- abstract的method不可以是static的,因為抽象的方法是要被子類實現的,而static與子類扯不上關系!
- native方法表示該方法要用另外一種依賴平台的編程語言實現的,不存在着被子類實現的問題,所以,它也不能是抽象的,不能與abstract混用。
- synchronized與abstract不可同時修飾一個方法,synchronized應該是作用在一個具體的方法上才有意義.
9.內部類可以引用它的包含類的成員嗎?有沒有什么限制?
完全可以。如果不是靜態內部類,那沒有什么限制!如果你把靜態嵌套類當作內部類的一種特例,那在這種情況下不可以訪問外部類的普通成員變量,而只能訪問外部類中的靜態成員.
10.String s = "Hello";s = s + "world!";這兩行代碼執行后,原始的String對象中的內容到底變了沒有?
沒有。因為String被設計成不可變(immutable)類,所以它的所有對象都是不可變對象。在這段代碼中,s原先指向一個String對象,內容是 "Hello",然后我們對s進行了+操作,那么s所指向的那個對象是否發生了改變呢?答案是沒有。這時,s不指向原來那個對象了,而指向了另一個 String對象,內容為"Hello world!",原來那個對象還存在於內存之中,只是s這個引用變量不再指向它了。
通過上面的說明,我們很容易導出另一個結論,如果經常對字符串進行各種各樣的修改,或者說,不可預見的修改,那么使用String來代表字符串的話會引起很大的內存開銷。因為String對象建立之后不能再改變,所以對於每一個不同的字符串,都需要一個String對象來表示。這時,應該考慮使用StringBuffer類,它允許修改,而不是每個不同的字符串都要生成一個新的對象。
11.String s = new String("xyz");創建了幾個StringObject?是否可以繼承String類?
兩個或一個都有可能,”xyz”對應一個對象,這個對象放在字符串常量緩沖區,常量”xyz”不管出現多少遍,都是緩沖區中的那一個。new String每寫一遍,就創建一個新的對象 ,它使用常量”xyz”對象的內容來創建出一個新String對象。如果以前就用過’xyz’,那么這里就不會創建”xyz”了,直接從緩沖區拿,這時創建了一個StringObject;但如果以前沒有用過"xyz",那么此時就會創建一個對象並放入緩沖區,這種情況它創建兩個對象。至於String類是否繼承,答案是否定的,因為 String默認final修飾,是不可繼承的 。
12.String、StringBuffer與StringBuilder的區別?
String 類型和 StringBuffer 類型的主要性能區別其實在於 String 是不可變的對象
StringBuffer和StringBuilder底層是 char[]數組實現的
StringBuffer是線程安全的,而StringBuilder是線程不安全的
13.對於如下代碼:
String s1 = "a";
String s2 = s1 + "b";
String s3 = "a" + "b";
System.out.println(s2 == "ab");
System.out.println(s3 == "ab");
第一條語句打印的結果為false,s2=a1+"b",相當於構建了一個新的string對象,並將對象引用賦予s2變量,s2的變量值此時就和常量池中“ab”不一致了,只是他們對象值是相等的。
第二條語句打印的結果為true.javac編譯可以對字符串常量直接相加的表達式進行優化,不必要等到運行期再去進行加法運算處理,而是在編譯時去掉其中的加號,直接將其編譯成一個這些常量相連的結果.
14.下面這條語句一共創建了多少個對象:String s="a"+"b"+"c"+"d";
第一行代碼被編譯器在編譯時優化后,相當於直接定義了一個”abcd”的字符串,所以,上面的代碼應該只創建了一個String對象。
15.try {}里有一個return語句,那么緊跟在這個try后的finally{}里的code會不會被執行,什么時候被執行,在return前還是后?
首先finally{}中的語句是一定會執行的,那么這個可能正常脫口而出就是return之前.
16.final, finally, finalize的區別?
- final 用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。內部類要訪問局部變量,局部變量必須定義成final類型。
- finally是異常處理語句結構的一部分,表示總是執行。
- finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等。但是JVM不保證此方法總被調用.
17.error和exception有什么區別?
error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說內存溢出。不可能指望程序能處理這樣的情況。exception表示一種設計或實現問題。也就是說,它表示如果程序運行正常,從不會發生的情況。
18.簡單說說Java中的異常處理機制的簡單原理和應用。
異常是指java程序運行時(非編譯)所發生的非正常情況或錯誤,與現實生活中的事件很相似,現實生活中的事件可以包含事件發生的時間、地點、人物、情節等信息,可以用一個對象來表示,Java使用面向對象的方式來處理異常,它把程序中發生的每個異常也都分別封裝到一個對象來表示的,該對象中包含有異常的信息。
Java對異常進行了分類,不同類型的異常分別用不同的Java類表示,所有異常的根類為java.lang.Throwable,Throwable下面又派生了兩個子類: Error和Exception,Error表示應用程序本身無法克服和恢復的一種嚴重問題,程序只有奔潰了,例如,說內存溢出和線程死鎖等系統問題。
19.Java中堆和棧有什么區別?
JVM 中堆和棧屬於不同的內存區域,使用目的也不同。棧常用於保存方法幀和局部變量,而對象總是在堆上分配。棧通常都比堆小,也不會在多個線程之間共享,而堆被整個 JVM 的所有線程共享。
棧:在函數中定義的一些基本類型的變量和對象的引用變量都是在函數的棧內存中分配,當在一段代碼塊定義一個變量時,Java 就在棧中為這個變量分配內存空間,當超過變量的作用域后,Java 會自動釋放掉為該變量分配的內存空間,該內存空間可以立即被另作它用。
棧內存是指程序進入一個方法時,會為這個方法單獨分配一塊私屬存儲空間,用於存儲這個方法內部的局部變量,當這個方法結束時,分配給這個方法的棧會釋放,這個棧中的變量也將隨之釋放。
堆:堆內存用來存放由 new 創建的對象和數組,在堆中分配的內存,由 Java 虛擬機的自動垃圾回收器來管理。
20.能將 int 強制轉換為 byte 類型的變量嗎?如果該值大於 byte 類型的范圍,將會出現什么現象?
可以做強制轉換,但是 Java 中 int 是 32 位的,而 byte 是 8 位的,所以,如果強制轉化,int 類型的高 24 位將會被丟棄,因為byte 類型的范圍是從 -128 到 127。
21.a.hashCode() 有什么用?與 a.equals(b) 有什么關系?
hashCode() 方法對應對象整型的 hash 值。它常用於基於 hash 的集合類,如 Hashtable、HashMap、LinkedHashMap等等。它與 equals() 方法關系特別緊密。根據 Java 規范,兩個使用 equal() 方法來判斷相等的對象,必須具有相同的 hashcode。
java集合中有 list 和 set 兩類,其中 set不允許元素重復實現,那個這個不允許重復實現的方法,如果用 equal 去比較的話,如果存在1000個元素,你 new 一個新的元素出來,需要去調用1000次 equal 去逐個和他們比較是否是同一個對象,這樣會大大降低效率。hashcode實際上是返回對象的存儲地址,如果這個位置上沒有元素,就把元素直接存儲在上面,如果這個位置上已經存在元素,這個時候才去調用equal方法與新元素進行比較,相同的話就不存了,散列到其他地址上
22.字節流與字符流的區別?
要把一段二進制數據數據逐一輸出到某個設備中,或者從某個設備中逐一讀取一段二進制數據,不管輸入輸出設備是什么,我們要用統一的方式來完成這些操作,用一種抽象的方式進行描述,這個抽象描述方式起名為IO流,對應的抽象類為OutputStream和InputStream,不同的實現類就代表不同的輸入和輸出設備,它們都是針對字節進行操作的。
底層設備永遠只接受字節數據,有時候要寫字符串到底層設備,需要將字符串轉成字節再進行寫入。字符流是字節流的包裝,字符流則是直接接受字符串,它內部將串轉成字節,再寫入底層設備,這為我們向IO設備寫入或讀取字符串提供了一點點方便。
23.什么是java序列化,如何實現java序列化?Serializable接口的作用?
將一個java對象變成字節流的形式傳出去稱為序列化,從字節流中恢復一個對象稱為反序列化。 實現serializable接口,這樣,javac編譯時就會進行特殊處理,編譯的類才可以被writeObject方法操作,這就是所謂的序列化。需要被序列化的類必須實現Serializable接口,該接口是一個mini接口,其中沒有需要實現方法,implements Serializable只是為了標注該對象是可被序列化的。
24.Java 中,throw 和 throws 有什么區別
- throw代表的是動作,throws是狀態
- throw用在方法中,而throws用在方法聲明中
- throw只能拋出一種異常,而throws可以拋出多個