面試總結------Java基礎__面試

來源:互聯網
上載者:User

1.為什麼內部類訪問的外部變數需要使用final修飾 。

因為生命週期的原因。方法中的局部變數,方法結束後這個變數就要釋放掉,final保證這個變數始終指向一個對象。
首先,內部類和外部類其實是處於同一個層級,內部類不會因為定義在方法中就會隨著方法的執行完畢而跟隨者被銷毀。問題就來了,如果外部類的方法中的變數不定義final,那麼當外部類方法執行完畢的時候,這個局部變數肯定也就被GC了,然而內部類的某個方法還沒有執行完,這個時候他所引用的外部變數已經找不到了。如果定義為final,java會將這個變數複製一份作為成員變數內建於內部類中,這樣的話,由於final所修飾的值始終無法改變,所以這個變數 所指向的記憶體地區就不會變。

2.Java異常

異常是指程式運行時(非編譯)所發生的非正常情況或錯誤,當程式違反了語音規則,jvm就會將出現的錯誤表示一個異常拋出。 異常也是java 的對象,定義了基類 java.lang.throwable作為異常父類。 這些異常類又包括error和exception兩大類 。
error類異常主要是運行時邏輯錯誤導致,一個正確程式中是不應該出現error的,當出現error一般jvm會終止。 不建議去捕獲。
exception表示可恢複異常,包括檢查異常和運行時異常。
檢查異常是最常見異常比如 io異常sql異常,都發生在編譯階段,這類通過try、catch捕捉 。
運行時異常,編譯器沒有強制對其進行捕捉和處理,一般都會把異常向上拋出,直到遇到處理代碼位置,若沒有處理塊就會拋到最上層,多線程用thread.run()拋出,單線程用main()拋出。

3.Java語言中的異常處理包括聲明異常、拋出異常、捕獲異常和處理異常四個環節。

throw用於拋出異常。throws關鍵字可以在方法上聲明該方法要拋出的異常,然後在方法內部通過throw拋出異常對象。
try是用於檢測被包住的語句塊是否出現異常,如果有異常,則拋出異常,並執行catch語句。
cacth用於捕獲從try中拋出的異常並作出處理。
finally語句塊是不管有沒有出現異常都要執行的內容。

4.Java常用工具

Javaprof.exe :Java剖析工具;
jdb.exe:Java調試器;
javadoc.exe:JDK中提供的文檔產生器
Javac.exe :Java編譯器,將java源檔案編譯成位元組碼檔案
Java.exe:Java解譯器

5.static關鍵字作用。

第一,為某特定資料類型或對象分配單一的儲存空間,與建立對象的個數無關;第二,實現某個方法或屬性與類而不是對象關聯在一起,也就是說在不建立對象的情況下就可以通過類來直接調用方法或使用類的屬性。
static的四種用法:
(1)static成員變數(靜態變數):java沒有全域概念,可以通過static修飾達到全域效果。靜態變數屬於類,其所有執行個體都指向同一個記憶體位址,只要它所在的類被載入,這個靜態變數就會被分配儲存空間。
(2)static成員方法:是類的方法而不是對象的方法,可直接通過類名調用。static方法中不能使用this和super關鍵字,不能調用非static方法,只能訪問所屬類的靜態成員變數和成員方法。
(3)static代碼塊(靜態代碼塊):在類中是獨立的,不在任何一個方法體內,JVM在載入類時會執行static代碼塊,static代碼塊經常被用來初始化靜態變數。
(4)static內部類:不依賴於外部類執行個體對象而被執行個體化,需要在外部類執行個體化後才能執行個體化。不能和外部類有相同的名字,不能訪問外部類的普通成員變數,只能訪問外部類的靜態成員和靜態方法。

6.Java程式初始化順序。

優先順序依次遞減:(1)靜態對象優先於非靜態對象(靜態對象初始化一次,非靜態對象初始化多次);(2)父類優先於子類;(3)按照成員變數定義的順序。
順序如下:父類靜態變數、父類靜態代碼塊、子類靜態變數、子類靜態代碼塊、父類非靜態變數、父類非靜態代碼塊、子類建構函式。

7.抽象類別與介面

7.1抽象類別通常代表一個抽象概念,他提供一個繼承的出發點,當設計一個新的抽象類別時,一定是用來繼承的。所以,在一個以繼承關係形成的等級結構裡面,樹分葉節點應當是具體類,而樹枝節點均應當是抽象類別。
在使用抽象類別時需要注意幾點:
(1) 抽象類別不能被執行個體化(像剛才的動物,執行個體化是沒有任何意義的),執行個體化的工作應該交由它的子類來完成,它只需要有一個引用即可。
(2) 抽象方法必須由子類來進行重寫。
(3) 如果類中包含抽象方法,該類必須要定義成抽象類別,不管是否還包含有其他方法。
(4) 抽象類別中可以包含具體的方法,當然也可以不包含抽象方法。
(5) 子類中的抽象方法不能與父類的抽象方法同名。
(6) abstract不能與final並列修飾同一個類。
(7) abstract 不能與private、static、final或native並列修飾同一個方法。

7.2介面是用來建立類與類之間的協議,它所提供的只是一種形式,而沒有具體的實現。同時實現該介面的實作類別必須要實現該介面的所有方法. 介面是抽象類別的延伸,java保證資料安全是不能多重繼承的,也就是說繼承只能存在一個父類,但是介面不同,一個類可以同時實現多個介面,不管這些介面之間有沒有關係,所以介面彌補了抽象類別不能多重繼承的缺陷,但是推薦繼承和介面共同使用,因為這樣既可以保證資料安全性又可以實現多重繼承。
在使用介面過程中需要注意如下幾個問題:
(1 )Interface的所有方法存取權限自動被聲明為public。
(2) 介面中的“成員變數”會自動變為public static final(不可變的常量)類型。可以通過類命名直接存取:ImplementClass.name。
(3) 介面中不存在實現的方法。
(4) 實現介面的非抽象類別必須要實現該介面的所有方法。抽象類別可以不用實現。
(5) 不能使用new操作符執行個體化一個介面,但可以聲明一個介面變數,該變數必須引用(refer to)一個實現該介面的類的對象。可以使用 instanceof 檢查一個對象是否實現了某個特定的介面。例如:if(anObject instanceof Comparable){}。
(6) 在實現多介面的時候一定要避免方法名的重複。
(7) 一個類可以支援多個介面,多個類也可以支援相同的介面

7.3 抽象類別與介面的區別:
7.3.1文法層次
(1) Java介面和Java抽象類別最大的一個區別,就在於Java抽象類別可以提供某些方法的部分實現,而Java介面不可以
(2) 一個抽象類別的實現只能由這個抽象類別的子類給出,任何一個實現了一個Java介面所規定的方法的類都可以具有這個介面的類型,而一個類可以實現任意多個Java介面,從而這個類就有了多種類型。
(3) 對子類而言,它只能繼承一個抽象類別(這是java為了資料安全而考慮的),但是卻可以實現多個介面。
7.3.2 設計層次
(1) 抽象層次不同: 抽象類別是對類抽象,而介面是對行為的抽象。抽象類別是對整個類整體進行抽象,包括屬性、行為,但是介面卻是對類局部(行為)進行抽象。
(2 ) 設計層次不同: 所以說抽象類別是自底向上抽象而來的,介面是自頂向下設計出來的.
(3) 跨域不同: 抽象類別所體現的是一種繼承關係,要想使得繼承關係合理,父類和衍生類別之間必須存在”is-a” 關係,即父類和衍生類別在概念本質上應該是相同的。對於介面則不然,並不要求介面的實現者和介面定義在概念本質上是一致的,僅僅是實現了介面定義的契約而已。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.