程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 【譯】Core Java Questions and Answers【1-33】,answers1-33

【譯】Core Java Questions and Answers【1-33】,answers1-33

編輯:JAVA綜合教程

【譯】Core Java Questions and Answers【1-33】,answers1-33


前言

譯文鏈接:http://www.journaldev.com/2366/core-java-interview-questions-and-answers

Java 8有哪些重要的特性

Java 8發布於2014年3月,這塊內容在Java面試中非常常見。如果你能清晰的回答這方面的問題,說明you are not out,喜歡學習最新的技術。Java 8是繼Java 5的注解和泛型之後所做的最大的改動,主要的新特性如下:

1、接口支持靜態方法和默認方法

2、函數式接口和Lambda表達式

3、為Collection類提供的Stream API

4、Java日期時間API

強烈建議大家打開上面的鏈接,以便更加深入理解這些知識。

你是怎樣理解Java的平台獨立性的

平台獨立性意味著你可以在任何操作系統上運行同樣的Java程序,你可以在Windows操作系統上編寫Java程序,然後在Mac系統上運行。

什麼是JVM,它是否平台獨立

Java虛擬機(JVM)是Java編程語言的核心,JVM負責將字節碼轉換成機器可讀的代碼,JVM並不擁有平台獨立性,所以不同的操作系統會有不同的JVM。我們可以自定義一些JVM參數,如配置最大內存和最小內存給JVM。JVM之所以叫做虛擬機,是因為它提供了一個不依賴於底層操作系統的接口。

JDK與JVM的區別

Java Development Kit(JDK)主要是以開發為目的,而JVM是JDK的一部分,用於執行Java程序。

JDK提供了全套工具,包括編譯、調試和執行Java程序,其中執行部分是由JVM負責的,JVM保證了Java的平台獨立性。

JVM與JRE的區域

Java Runtime Environment (JRE)是JVM的實現,JRE由JVM(Java虛擬機)和Java核心類庫組成,可以保證任何Java程序成功運行。

但是,JRE並不包含任何開發工具,如Java的編譯、調試等。

如果你僅僅想運行Java程序,那麼安裝JRE即可。

Java中哪個類是所有類的超類

java.lang.Object是所有類的根類,並且我們不需要顯示的繼承它。

為什麼Java不支持多重繼承

Java之所以不支持多重繼承是因為“菱形繼承問題”(磚石問題),如下圖:假定類A和B都實現了SuperClass中的一個方法,那麼將導致編譯器在編譯類C時產生歧義,不知道應該選擇哪個方法。詳情請閱讀Multiple Inheritance in Java。

雖然Java類不支持多重繼承,但是接口是可以多重繼承的,一個接口可以繼承多個類因為接口僅僅只是申明方法,具體實現由實現類來定義,所以對於接口來說是不會有“菱形繼承問題”的。

為什麼Java不是一門完全面向對象的語言

Java之所以被認為不是一門完全面向對象的語言是因為它支持基本數據類型,如int、short、long等。這些基本數據類型給Java程序開發帶來了方便,顯然Java是可以給這些基本類型封裝成對象,但是如果僅僅用於表示,並沒有帶來過多的好處。(據說基本數據類型不需要垃圾回收,因此比對象類型多了另一個性能優勢)

眾所周知,對於所有的基本數據類型,Java都提供了對應的封裝類,如Integer, Long等,它們額外提供了一些方法。

path和classpath變量的區別

PATH是操作系統使用的一個環境變量,用於定位可執行程序所在的位置,所以當我們安裝Java或想要讓任何可執行程序被操作系統找到的時候,都需要添加可執行程序所在位置的路徑到系統PATH變量裡。

Classpath是針對Java而言的,用於讓Java程序在運行時查找依賴的類文件,classpath可以是一個目錄、zip文件、jar文件等。

Java中的main方法

main()方法是java程序的入口,main()方法的語法如下:

public static void main(String args[]).

main方法是公共靜態方法,所以java能夠在不實例化該類的情況下直接訪問該方法,main方法的輸入參數是一個字符串數組,通過該數組我們可以傳入運行時參數給java程序。

什麼是Java的重載和覆蓋

當我們有多個重名的方法且這些方法的入參不同時,這種情況叫做方法重載;

覆蓋與繼承相關,當父類和子類有一個相同的方法(方法名和參數),叫方法重寫,一般會在子類方法前面添加@Override注解,保證父類方法被修改時,子類也一起修改。

是否可以重載main方法

答案是可以的,一個類可以擁有多個名稱為“main”的方法,但是,當我們運行該類時,java運行環境只會查找符合特性語法(public static void main(String args[]))的main方法。

是否可以在一個Java源文件裡定義多個public類

答案是不能,java源文件裡只能有一個public類,但是我們可以定義多個非public類。

什麼是Java包,哪個包是默認引入的

Java包主要用於組織Java類並對它們分組,可以按功能或模塊分組。一個Java類的完整名稱包含包名和類名,如java.lang.Object類,位於java.lang包下,類名為Object。

java.lang是默認引入的,我們不需要顯式的引入該包下的任何類。

什麼是訪問控制符

Java中的訪問控制符有public、private、protected,如果未使用以上關鍵字修飾,則為默認訪問權限。

訪問控制符主要用於訪問權限的控制。

一個Java類只能用public修飾或不修飾(默認訪問權限)。想要了解更多詳細信息,請訪問Java Access Modifiers。

關於final關鍵字

修飾類:被final關鍵字修飾的類不能被其它類繼承,如String類是一個final類,不能被任何類繼承。

修飾方法:我們可以用final關鍵字修飾方法,以保證該方法不能被子類重寫。

修飾變量:final關鍵字可用於修飾變量,保證其只能被賦值一次,不過這裡需要注意,變量的狀態是可以改變的,舉給例子,如果該變量是一個對象,即使用final修飾,該對象的成員屬性的值是可以改變的。

接口變量:Java中的接口變量默認是用final和static修飾的。

interface a{

  String str="hello.";//final and static

}

關於static關鍵字

修飾類變量:static可用於修飾類裡的成員屬性,讓其成為全局變量;

修飾方法:static可用於修飾類裡的方法,即靜態方法,靜態方法只能訪問靜態變量、調用靜態方法;

更多詳細信息,請訪問java static keyword.

關於finally和finalize關鍵字

finally關鍵字是與try-catch一起使用的,用於保證finally語句塊始終執行,即使有異常在try-catch語句塊內部拋出。

finally語句塊經常用於釋放在try語句塊裡創建的資源。

finalize()是Object類裡一個特殊的方法,我們可以在自己的類裡重寫該方法。這個方法會在該對象被回收時,被垃圾回收器調用。

finalize()方法經常用於在該對象被回收時釋放系統資源。

是否可以聲明一個靜態類

我們不能將一個頂層類聲明為靜態類,但是內部類是可以用static修飾的。被static修飾的內部類叫靜態內部類。

靜態內部類與其它頂層類類似,主要是方便打包。

更多內部類內容請閱讀java inner class.

什麼是靜態導入

當我們想要使用任何靜態變量或者方法時,通常都是先導入這個類,然後根據這個類名來引用其方法或變量,如下示例:

import java.lang.Math;

//inside class
double test = Math.PI * 5;

其實,還有一種方法是使用靜態導入,即直接import該靜態變量:

import static java.lang.Math.PI;

//no need to refer class now
double test = PI * 5;

不過,使用靜態導入會造成一定的混淆,過度使用會使程序變得難於閱讀和維護,所以最好是避免使用。

關於try-with-resources語句

Java 7的一個新特性是使用try-with-resources語句自動管理資源。在Java 7之前,對於資源的關閉,只能顯式的調用關閉資源方法,通常都是在finally語句塊裡關閉,當我們忘了關閉資源的時候,經常會造成內存洩漏。

從Java 7開始,我們可以在try代碼塊裡創建資源,當try代碼塊執行完畢的時候,資源會自動關閉。

關於這方面的更多內容,請閱讀Java Automatic Resource Management.

關於multi-catch代碼塊

Java 7的一個改進是引入了multi-catch代碼塊,我們可以使用一個catch塊來捕獲多個異常,當每個catch塊代碼相似的時候,這會讓我們的代碼更加簡短、清晰。

如果一個catch塊處理多個異常,你可以使用|分隔它們,在這種情況下異常參數是final類型的,所以不能修改。

舉個例子:

Java 7之前:

catch (IOException ex) {
     logger.error(ex);
     throw new MyException(ex.getMessage());
catch (SQLException ex) {
     logger.error(ex);
     throw new MyException(ex.getMessage());
}catch (Exception ex) {
     logger.error(ex);
     throw new MyException(ex.getMessage());
}

Java 7之後:

catch(IOException | SQLException | Exception ex){
     logger.error(ex);
     throw new MyException(ex.getMessage());
}

想了解更多信息,請閱讀Java multi catch block。

關於靜態(static)代碼塊

Java靜態代碼塊是一組代碼語句,這些代碼會在加載器加載這些類到內存的時候執行。它可用於初始化靜態變量,經常用於創建靜態資源(當類被加載時);

什麼是一個接口

接口是Java編程語言的核心內容,廣泛應用於JDK中,同樣也應用於設計模式、各種框架及工具中。接口在Java中實現了一種方法打到抽象的目的,可用於定義一些抽象的約定讓子類去實現。

使用接口定義類型、作為頂層層次接口來設計非常有好處。另外,由於一個Java類可以實現多個接口,所以在大多數情況下,最好使用接口作為超級父類。

更多關於接口的內容,請閱讀java interface.

什麼是抽象類

抽象類用於為子類創建默認方法實現,一個抽象類可以包含沒有body的抽象方法,也可以包含已實現的方法。

abstract關鍵字用於創建一個抽象類,抽象類不能被實例化,通常用於讓子類繼承、實現抽象類中定義的抽象方法、覆蓋或者使用抽象類中已實現的方法。

更多關於抽象類的信息,請閱讀java abstract class.

抽象類與接口的區別

抽象類用abstract關鍵字定義,接口用interface關鍵字定義;

抽象類可以有實現方法,接口不行;

一個類只能繼承一個抽象類,但是可以繼承多個接口;

我們可以運行一個包含main方法的抽象類,但是接口不行;

更多關於接口與抽象類的區別,請閱讀Difference between Abstract Class and Interface.

接口是否可以實現或繼承其它接口

接口不能實現接口,但是可以繼承其它接口。

由於接口不能包含具體實現方法,所以它們沒有“磚石問題”,這也是為什麼接口可以多重繼承的原因;

什麼是標識接口

一個標識接口是一個空接口,不包含任何方法,僅僅用於標識實現類擁有某些功能。典型的例子是Serializable 和 Cloneable接口,標識可以序列化和克隆。

什麼是包裝類

Java的包裝類是對8個基本數據類型進行封裝後形成的類,所有包裝類都用final修飾,是不可變的。

Java 5提供的自動拆裝箱功能允許基本數據類型和包裝類自動轉換。

更多關於包裝類的內容,請閱讀Wrapper classes in Java.

關於Java中的枚舉

枚舉是Java 5引入的一個新類型,它的字段包含若干固定的常量,舉個例子,我們可以創建一個Direction枚舉,包含四個固定字段EAST, WEST, NORTH, SOUTH。

enum關鍵字用於創建枚舉類型,跟class有點類似。另外,枚舉常量都是static和final的。

更多關於枚舉請閱讀java enum.

關於Java注解

Java注解提供了與代碼相關的信息,它們對代碼沒有直接影響。注解是在Java 5引入的。

注解是嵌入到程序中的元數據,它可以被注解解析工具或編譯器解析。

我們也可以指定注解是在編譯期可用還是運行期可用。

Java中內置的注解有@Override, @Deprecated 和@SuppressWarnings

更多關於注解的內容,請閱讀java annotations.。

關於Java反射機制

Java反射API可以幫助我們觀察和修改Java程序運行時行為,通過反射機制,我們可以獲取一個Java類、接口或枚舉的方法和屬性信息。反射API屬於Java的高級特性,在平時的編程中,除非特殊情況,一般是不推薦使用的。反射API的使用會破壞一些設計模式,如常見的單例模式,通過反射可以調用私有構造方法,違反了訪問修飾符的規則。

雖然在平時的編程中,我們很少使用反射API,但是反射機制的存在非常重要。現在,基本上任何一個框架都離不開反射API,如常見的Spring、Hibernate或者Tomcat。

更多詳細信息,請閱讀Java Reflection Tutorial。

關於Java中的組合

組合是一種設計技巧,用於實現類之間的has-a關系,我們可以使用對象組合實現代碼復用。

Java使用對象引用變量來實現組合,使用組合的好處是我們可以控制其它對象對客戶端類的可見性,並且只復用我們需要復用的代碼。

更多Java組合的內容,請閱讀Java Composition。

 

太多了,未完待續...

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved