abstract的method 不可以是static的,因為抽象的方法是要被子類實現的,而static與子類扯不上關系!
abstract的method 不可以是native的,native方法表示該方法要用另外一種依賴平臺的編程語言實現的,不存在著被子類實現的問題,所以,它也不能是抽象的,不能與abstract混用。例如,FileOutputSteam類要硬件打交道,底層的實現用的是操作系統相關的api實現,例如,在windows用c語言實現的,所以,查看jdk 的源代碼,可以發現FileOutputStream的open方法的定義如下:
PRivate native void open(String name) throws FileNotFoundException;
如果我們要用java調用別人寫的c語言函數,我們是無法直接調用的,我們需要按照java的要求寫一個c語言的函數,又我們的這個c語言函數去調用別人的c語言函數。由于我們的c語言函數是按java的要求來寫的,我們這個c語言函數就可以與java對接上,java那邊的對接方式就是定義出與我們這個c函數相對應的方法,java中對應的方法不需要寫具體的代碼,但需要在前面聲明native。abstract的method 不可以是synchronized的,在我幾年的學習和開發中,從來沒見到過這種情況,并且我覺得synchronized應該是作用在一個具體的方法上才有意義。而且,方法上的synchronized同步所使用的同步鎖對象是this,而抽象方法上無法確定this是什么。
下面程序的輸出結果是多少?
import java.util.Date; public class Test extends Date{ public static void main(String[] args) { new Test().test(); } public void test(){ System.out.println(super.getClass().getName()); } }
在test方法中,直接調用getClass().getName()方法,返回的是Test類名
由于getClass()在Object類中定義成了final,子類不能覆蓋該方法,所以,在test方法中調用getClass().getName()方法,其實就是在調用從父類繼承的getClass()方法,等效于調用super.getClass().getName()方法,所以,super.getClass().getName()方法返回的也應該是Test。如果想得到父類的名稱,應該用如下代碼:getClass().getSuperClass().getName();
也許你的答案是在return之前,但往更細地說,我的答案是在return中間執行,請看下面程序代碼的運行結果:
public class Test { public static void main(String[] args) { System.out.println(new Test().test());; } static int test() { int x = 1; try{ return x; } finally{ ++x; } } }
運行結果是1,為什么呢?主函數調用子函數并得到結果的過程,好比主函數準備一個空罐子,當子函數要返回結果時,先把結果放在罐子里,然后再將程序邏輯返回到主函數。所謂返回,就是子函數說,我不運行了,你主函數繼續運行吧,這沒什么結果可言,結果是在說這話之前放進罐子里的。
error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。 比如說內存溢出。不可能指望程序能處理這樣的情況。也就說當發生error的時候,運行程序會被終止,虛擬機退出。我們沒有任何辦法(try-catch)使得程序重新回到正常軌道上。 比如下面的代碼:
ublic class Outer{ public static void main(String[] args){ try{ int[] i=new int[1000000000]; }catch(Exception e){ System.out.println("aaa"); } } }
運行結果:
Exception in thread "main" java.lang.OutOfMemoryError : Java heap space at hr.test.Outer.main(Outer.java:7)
exception 表示一種設計或實現問題。也就是說,它表示如果程序運行正常,從不會發生的情況。不過是運行時異常(如ArrayIndexOutOfBoundsException)還是需檢查異常(如FileNoFindException),都可以通過try-catch使得程序可以繼續運行下去。
注意,運行時異常和需檢查異常的唯一區別就是:前者無需再方法簽名后聲明異常類型,而后者必須聲明。error和exception都繼承了Throwable,因此都可以拋出。
異常是指java程序運行時(非編譯)所發生的非正常情況或錯誤,與現實生活中的事件很相似,現實生活中的事件可以包含事件發生的時間、地點、人物、情節等信息,可以用一個對象來表示,Java使用面向對象的方式來處理異常,它把程序中發生的每個異常也都分別封裝到一個對象來表示的,該對象中包含有異常的信息。Java對異常進行了分類,不同類型的異常分別用不同的Java類表示,所有異常的根類為java.lang.Throwable,Throwable下面又派生了兩個子類:Error和Exception,Error 表示應用程序本身無法克服和恢復的一種嚴重問題,程序只有死的份了。Exception表示程序還能夠克服和恢復的問題,其中又分為系統異常和普通異常,系統異常是軟件本身缺陷所導致的問題,也就是軟件開發人員考慮不周所導致的問題,軟件使用者無法克服和恢復這種問題,但在這種問題下還可以讓軟件系統繼續運行或者讓軟件死掉,例如,數組腳本越界(ArrayIndexOutOfBoundsException),空指針異常(NullPointerException)、類轉換異常(ClassCastException);普通異常是運行環境的變化或異常所導致的問題,是用戶能夠克服的問題,例如,網絡斷線,硬盤空間不夠,發生這樣的異常后,程序不應該死掉。我是天王蓋地虎的分割線
參考:http://hxraid.VEvb.com/blog/749507
新聞熱點
疑難解答