1、一個".java"源文件中是否可以包括多個類(不是內部類)?有什么限制?
可以有多個類,但只能有一個public的類,并且public的類名必須與文件名相一致。
2、short s1= 1; s1= s1+1;?有沒有錯?
s1+1運算時會自動提升類型,結果是int,賦值給s1時,將報告需要強轉類型的錯誤。
3、short s1= 1; s1 += 1;有沒有錯?
+=是java規定的運算符,編譯器會對它進行特殊處理,因此可以正確編譯。
4、使用final關鍵字修飾一個變量時,引用的內容一定不能變?
使用final修飾變量時,是引用變量(也就是地址)不能變,引用變量所指向的對象中的內容還是可以改變的
5、是否可以從static方法內對非static方法調用?為什么?
????????不可以。因為非static方法是與對象關聯的,必須創建一個對象,才可以在該對象上進行方法調用(對象.方法)。而static方法調用時不需要創建對象,可以直接調用。如果從一個static方法中發出對非static方法的調用,那個非static方法是關聯到哪個對象上的呢?這個邏輯無法成立。
6、Overload和Override的區別?
重載Overload表示同一個類中可以有多個名稱相同的方法,但這些方法的參數列表各不相同(即參數個數或類型不同)。
重寫Override表示子類中的方法可以與父類中的方法的名稱和參數完全相同,子類對象調用這個方法時,將調用子類中的定義方法,這就把父類中的方法覆蓋了,這也是面向對象編程的多態性的一種表現。
7、Overloaded的方法是否可以改變返回值的類型?
如果幾個重載Overloaded的方法的參數列表不一樣,它們的返回者類型當然也可以不一樣。
如果兩個方法的參數列表完全一樣,不管返回值是否相同,都不允許。因為無法確定編程者倒底是想調用哪個方法了,因為他們被調用時看起來完全相同。
8、接口是否可繼承接口?抽象類是否可實現(implements)接口?抽象類是否可繼承具體類(concreteclass)?抽象類中是否可以有靜態的main方法?
????????接口可以繼承接口。抽象類可以實現(implements)接口,抽象類可以繼承具體類。抽象類中可以有靜態的main方法。
????????記住抽象類與普通類的唯一區別就是不能創建實例對象和允許有abstract方法。
9、Java中實現多態的機制是什么?
????????靠的是父類(或接口定義)的引用變量可以指向子類(或具體實現類)的實例對象。
而程序調用的方法在運行期才動態綁定,就是引用變量所指向的具體實例對象的方法,而不是引用變量的類型中定義的方法。
10、abstractclass和interface有什么區別?
抽象類可以有構造方法,接口中不能有構造方法。
抽象類中可以有普通成員變量,接口中沒有普通成員變量
抽象類中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的普通方法。
抽象類中的抽象方法類型可以是public,protected,接口中的抽象方法只能是public類型的,并且默認為public abstract。
7. 一個類可以實現多個接口,但只能繼承一個抽象類。
11、String s = "Hello";s = s + "world!";執行后,原始的String對象中的內容變了沒有?
????????沒有。因為String被設計成不可變類,所以它的所有對象都是不可變對象。只是s不再指向舊的對象了。
12、下面這條語句一共創建了多少個對象:String s="a"+"b"+"c"+"d";
javac編譯可以對字符串常量直接相加的表達式進行優化直接得出答案,不必要等到運行期再去進行加法運算處理
這行代碼被編譯器在編譯時優化后,相當于直接定義了一個”abcd”的字符串,所以,上面的代碼應該只創建了一個String對象。
13、final, finally, finalize的區別。
????????final 用于聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
????????finally是異常處理語句結構的一部分,表示總是執行。
????????finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法.
14、error和exception有什么區別?
????????error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說內存溢出。不可能指望程序能處理這樣的情況。? ? ? ? ? ? ? ? ? exception表示程序還能夠克服和恢復的問題
15、Java 中堆和棧區別?
棧常用于保存方法幀和局部變量,而對象總是在堆上分配。
棧通常都比堆小,也不會在多個線程之間共享,而堆被整個 JVM 的所有線程共享。
????????棧:在函數中定義的一些基本類型的變量和對象的引用變量都是在函數的棧內存中分配,當在一段代碼塊定義一個變量時,Java 就在棧中為這個變量分配內存空間,當超過變量的作用域后,Java 會自動釋放掉為該變量分配的內存空間,該內存空間可以立即被另作它用。
????????堆:堆內存用來存放由 new 創建的對象和數組,在堆中分配的內存,由 Java 虛擬機的自動垃圾回收器來管理。
16、能將 int 強制轉換為 byte 類型的變量嗎?(引申到所有大類型轉小類型)
? ? ? ? 實際中,我們可以做強制轉換,不會報錯。
但是存在大類型轉小類型的通病: int 是 32 位的,而 byte 是 8 位的,如果強制轉化,int 類型的高 24 位將會被丟棄,所以盡量不要這樣做。
17、hashCode有什么用?與 a.equals(b) 有什么關系?
????????hashCode方法對應對象的 hash 值。它常用于基于 hash 的集合類,如 Hashtable、HashMap、LinkedHashMap等等。根? ? ? ? ? ? 據 Java 規范,兩個使用 equal() 方法來判斷相等的對象,必須具有相同的 hash code。
18、垃圾回收的優點和原理。
????????垃圾回收可以有效的防止內存泄露,有效的使用可以使用的內存。垃圾回收器通常是作為一個單獨的低級別的線程運行,不可預知的情況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清除和回收,程序員不能實時的調用垃圾回收器對某個對象或所有對象進行垃圾回收。回收機制有分代復制垃圾回收和標記垃圾回收,增量垃圾回收。
原理:可以給對象添加一個被引用的計數器,就可以判斷是否已經是無引用對象。但是難以解決循環引用問題。
如果不下小心直接把 Obj1-reference 和 Obj2-reference 置 null。則在 Java 堆當中的兩塊內存依然保持著互相引用無法回收。
可達性分析法:通過一系列的 ‘GC Roots’ 的對象作為起始點,從這些節點出發所走過的路徑稱為引用鏈。當一個對象到 GC Roots 沒有任何引用鏈相連的時候說明對象不可用。?
19,java中會存在內存泄漏嗎
內存泄漏:指一個不再被程序使用的對象或變量一直被占據在內存中。java中有垃圾回收機制,它可以保證當對象不再被引用的時候,對象將自動被垃圾回收器從內存中清除掉。
????????由于Java使用有向圖的方式進行垃圾回收管理,可以消除引用循環的問題,例如有兩個對象,相互引用,只要它們和根進程不可達,那么GC也是可以回收它們的。
java中的內存泄露的情況:長生命周期的對象持有短生命周期對象的引用就很可能發生內存泄露.
盡管短生命周期對象已經不再需要,但是因為長生命周期對象持有它的引用而導致不能被回收,這就是java中內存泄露的發生場景。通俗地說,就是程序員可能創建了一個對象,以后一直不再使用這個對象,這個對象卻一直被引用,即這個對象無用但是卻無法被垃圾回收器回收的,這就是java中可能出現內存泄露的情況,例如,緩存系統,我們加載了一個對象放在緩存中(例如放在一個全局map對象中),然后一直不再使用它,這個對象一直被緩存引用,但卻不再被使用。
?