面試題(一):Java基礎知識
Java 基礎知識
01. 面向物件的特性有哪些?
答:封裝、繼承和多型。
02. Java 中覆蓋和過載是什麼意思?
解析:覆蓋和過載是比較重要的基礎知識點,並且容易混淆,所以面試中常見。
答:覆蓋(Override)是指子類對父類方法的一種重寫,只能比父類丟擲更少的異常,訪問許可權不能比父類的小。
被覆蓋的方法不能是 private 的,否則只是在子類中重新定義了一個方法;過載(Overload)表示同一個類中可以有多個名稱相同的方法,但這些方法的引數列表各不相同。
面試官: 那麼構成過載的條件有哪些?
答:引數型別不同、引數個數不同、引數順序不同。
面試官: 函式的返回值不同可以構成過載嗎?為什麼?
答:不可以,因為
如下兩個方法:
void f(){} int f(){ return 1;}
只要編譯器可以根據語境明確判斷出語義,比如在 int x = f();中,那麼的確可以據此區分過載方法。
不過, 有時你並不關心方法的返回值,你想要的是方法呼叫的其他效果 (這常被稱為 “為了副作用而呼叫”),這時你可能會呼叫方法而忽略其返回值,所以如果像下面的呼叫:
fun();
此時 Java 如何才能判斷呼叫的是哪一個 f( ) 呢?別人如何理解這種程式碼呢?所以,根據方法返回值來區分過載方法是行不通的。
03. 抽象類和介面的區別有哪些?
答:
1.
抽象類中可以沒有抽象方法;介面中的方法必須是抽象方法;
2.
抽象類中可以有普通的成員變數;介面中的變數必須是 static final 型別的,必須被初始化 , 介面中只有常量,沒有變數。
3.
抽象類只能單繼承,介面可以繼承多個父介面;
4.
Java8 中介面中會有 default 方法,即方法可以被實現。
5.
面試官:抽象類和介面如何選擇?
答:
1.
如果要建立不帶任何方法定義和成員變數的基類,那麼就應該選擇介面而不是抽象類。
2.
如果知道某個類應該是基類,那麼第一個選擇的應該是讓它成為一個介面,只有在必須要有方法定義和成員變數的時候,才應該選擇抽象類。
3.
因為抽象類中允許存在一個或多個被具體實現的方法,只要方法沒有被全部實現該類就仍是抽象類。
4.
04. Java 和 C++ 的區別:
解析:雖然我們不太懂 C++,但是就是會這麼問,尤其是三面(總監級別)面試中。
答:
1.
都是面向物件的語言,都支援封裝、繼承和多型;
2.
指標:Java 不提供指標來直接訪問記憶體,程式更加安全;
3.
繼承: Java 的類是單繼承的,C++ 支援多重繼承; Java 通過一個類實現多個介面來實現 C++ 中的多重繼承; Java 中類不可以多繼承,但是!!!介面可以多繼承;
4.
記憶體: Java 有自動記憶體管理機制,不需要程式設計師手動釋放無用記憶體。
5.
05. Java 中的值傳遞和引用傳遞
答:
值傳遞是指物件被值傳遞,意味著傳遞了物件的一個副本,即使副本被改變,也不會影響源物件。引用傳遞是指物件被引用傳遞,意味著傳遞的並不是實際的物件,而是物件的引用。
因此,外部對引用物件的改變會反映到所有的物件上。
06. JDK 中常用的包有哪些?
答:java.lang、java.util、java.io、java.net、java.sql。
07. JDK,JRE 和 JVM 的聯絡和區別:
答:
JDK 是 java 開發工具包,是 java 開發環境的核心元件,並提供編譯、除錯和執行一個 java 程式所需要的所有工具,可執行檔案和二進位制檔案,是一個平臺特定的軟體。
JRE 是 java 執行時環境,是 JVM 的實施實現,提供了執行 java 程式的平臺。JRE 包含了 JVM,但是不包含 java 編譯器 / 偵錯程式之類的開發工具。
JVM 是 java 虛擬機器,當我們執行一個程式時,JVM 負責將位元組碼轉換為特定機器程式碼,JVM 提供了記憶體管理 / 垃圾回收和安全機制等。
這種獨立於硬體和作業系統,正是 java 程式可以一次編寫多處執行的原因。
區別:
1.
JDK 用於開發,JRE 用於執行 java 程式;
2.
3.
JDK 和 JRE 中都包含 JVM;
4.
JVM 是 java 程式語言的核心並且具有平臺獨立性。
小結:本節主要闡述了 Java 基礎知識點,這些問題主要是一面面試官在考察,難度不大,適當複習下,應該沒什麼問題。