java基礎學習(面試寶典):
62.關於assert
assertion(斷言)assertion(斷言)在軟件開發中是一種常用的調試方式,很多開發語言中都支持這種機制。在實現中,assertion就是在程序中的一條語句,它對一個boolean表達式進行檢查,一個正確程序必須保證這個boolean表達式的值為true;如果該值為false,說明程序已經處於不正確的狀態下,assert將給出警告或退出。一般來說,assertion用於保證程序最基本、關鍵的正確性。assertion檢查通常在開發和測試時開啟。為了提高性能,在軟件發布后,assertion檢查通常是關閉的。
package com.huawei.interview;
public class AssertTest {
public static void main(String[] args) {
int i = 0;
for(i=0;i<5;i++)
{
System.out.println(i);
}
//假設程序不小心多了一句--i;
--i;
assert i==5; //false
}
}
63.java中會存在內存泄露嗎?
(1)內存泄露就是指一個不再被程序使用的對象或變量一直被占據在內存中。java中有垃圾回收機制,它可以保證一對象不再被引用的時候,即對象編程了孤兒的時候,對象將自動被垃圾回收器從內存中清除掉。由於Java 使用有向圖的方式進行垃圾回收管理,可以消除引用循環的問題,例如有兩個對象,相互引用,只要它們和根進程不可達的,那么GC也是可以回收它們的。
(2)java中存在內存泄露的情況,長生命周期的對象持有短生命周期對象的引用就很可能發生內存泄露,盡管短生命周期對象已經不再需要,但是因為長生命周期對象持有它的引用而導致不能被回收,這就是java中內存泄露的發生場景,通俗地說,就是程序員可能創建了一個對象,以后一直不再使用這個對象,這個對象卻一直被引用,即這個對象無用但是卻無法被垃圾回收器回收的,這就是java中可能出現內存泄露的情況,例如,緩存系統,我們加載了一個對象放在緩存中(例如放在一個全局map對象中),然后一直不再使用它,這個對象一直被緩存引用,但卻不再被使用。
(3)檢查java中的內存泄露,一定要讓程序將各種分支情況都完整執行到程序結束,然后看某個對象是否被使用過,如果沒有,則才能判定這個對象屬於內存泄露。
(4)舉例,如果一個外部類的實例對象的方法返回了一個內部類的實例對象,這個內部類對象被長期引用了,即使那個外部類實例對象不再被使用,但由於內部類持有外部類的實例對象,這個外部類對象將不會被垃圾回收,這也會造成內存泄露。
64.能不能自己寫個類,也叫java.lang.String?
可以,但是不推薦使用。
應用的時候,需要用自己的類加載器去加載,否則,系統的類加載器永遠只是去加載jre.jar包中的那個java.lang.String。由於在tomcat的web應用程序中,都是由webapp自己的類加載器先自己加載WEB-INF/classess目錄中的類,然后才委托上級的類加載器加載,如果我們在tomcat的web應用程序中寫一個java.lang.String,這時候Servlet程序加載的就是我們自己寫的java.lang.String,但是這么干就會出很多潛在的問題,原來所有用了java.lang.String類的都將出現問題。
雖然java提供了endorsed技術,可以覆蓋jdk中的某些類,具體做法是….。但是,能夠被覆蓋的類是有限制范圍,反正不包括java.lang這樣的包中的類。
65.代碼中經常出現的問題總結:
(1)abstract method必須以分號結尾,且不帶花括號。
(2)局部變量前不能放置任何訪問修飾符 (private,public,和protected)。final可以用來修飾局部變量(final如同abstract和strictfp,都是非訪問修飾符,strictfp只能修飾class和method而非variable)。
(3)abstract的methods不能以private修飾。abstract的methods就是讓子類implement(實現)具體細節的。同理,abstract method前不能加final。
(4)final int i是個final的instant variable (實例變量,或叫成員變量)。final的instant variable沒有default value,必須在constructor (構造器)結束之前被賦予一個明確的值。int i屬於instant variable (實例變量,或叫成員變量)。instant variable有default value。int的default value是0。
(5)static method不能直接call non-static methods。同理,static method不能訪問non-static instant variable。
(6)沒有人說過Java的Class名字必須和其文件名相同。但public class的名字必須和文件名相同。
(7)interface A{ int x = 0;}接口的屬性默認隱含為 public static final.所以可以通過A.x來明確。