天天看點

31道Java核心面試題,一次性打包送給你(4)

19、main() 方法可以重載嗎?

可以,一個類中可以有多個名稱為“main”的方法:

public class MainTest {
    public static void main(String[] args) {
        System.out.println("main(String[] args)");
    }
    public static void main(String[] args,String arg) {
        System.out.println("(String[] args,String arg");
    }
}      

但該類在運作的時候,隻會找到一個入口,即 public static void main(String[] args)。

20、一個 Java 源檔案中有多個 public 類嗎?

一個 Java 源檔案中不能有多個 public 類。

31道Java核心面試題,一次性打包送給你(4)

21、什麼是 Java 的 package(包)?

在 Java 中,我們使用 package(包)對相關的類、接口和子包進行分組。這樣做的好處有:

使相關類型更容易查找

避免命名沖突,比如說 com.itwanger.Hello 和 com.itwangsan.Hello 不同

通過包和通路權限控制符來限定類的可見性

可以使用 package 關鍵字來定義一個包名,需要注意的是,這行代碼必須處于一個類中的第一行。強烈建議在包中聲明類,不要預設,否則就失去了包結構的帶來的好處。

包的命名應該遵守以下規則:

應該全部是小寫字母

可以包含多個單詞,單詞之間使用“.”連接配接,比如說 java.lang

名稱由公司名或者組織名确定,采用倒序的方式,比如說,我個人部落格的域名是 www.itwanger.com,是以我建立的包名是就是 com.itwanger.xxxx。

每個包或者子包都在磁盤上有自己的目錄結構,如果 Java 檔案時在 com.itwanger.xxxx 包下,那麼該檔案所在的目錄結構就應該是 com->itwanger->xxxx。

預設情況下,java.lang 包是預設導入的,我們不需要顯式地導入該包下的任何類。

package com.cmower.bb;

public class PackageTest {

   public static void main(String[] args) {

       Boolean.toString(true);

   }

}

Boolean 類屬于 java.lang 包,當使用它的時候并不需要顯式導入。

22、什麼是通路權限修飾符?

通路權限修飾符對于 Java 來說,非常重要,目前共有四種:public、private、protected 和 default(預設)。

一個類隻能使用 public 或者 default 修飾,public 修飾的類你之前已經見到過了,現在我來定義一個預設權限修飾符的類給你欣賞一下。

class Dog {

哈哈,其實也沒啥可以欣賞的。預設意味着這個類可以被同一個包下的其他類進行通路;而 public 意味着這個類可以被所有包下的類進行通路。

假如硬要通過 private 和 protected 來修飾類的話,編譯器會生氣的,它不同意。

31道Java核心面試題,一次性打包送給你(4)

private 可以用來修飾類的構造方法、字段和方法,隻能被目前類進行通路。protected 也可以用來修飾類的構造方法、字段和方法,但它的權限範圍更寬一些,可以被同一個包中的類進行通路,或者目前類的子類。

可以通過下面這張圖來對比一下四個權限修飾符之間的差别:

31道Java核心面試題,一次性打包送給你(4)

同一個類中,不管是哪種權限修飾符,都可以通路;

同一個包下,private 修飾的無法通路;

子類可以通路 public 和 protected 修飾的;

public 修飾符面向世界,哈哈,可以被所有的地方通路到。

23、什麼是 final 關鍵字?

final 關鍵字修飾類的時候,表示該類無法被繼承。比如,String 類就是 final 的,無法被繼承。

final 關鍵字修飾方法的時候,表示子類無法覆寫它。

final 關鍵字修飾變量的時候,表示該變量隻能被指派一次,盡管變量的狀态可以更改。

關于 final 更詳細的内容,可以參照我之前寫了另外一篇文章:

我去,你竟然還不會用 final 關鍵字

24、什麼是 static 關鍵字?

static 關鍵字可以用來修飾類變量,使其具有全局性,即所有對象将共享同一個變量。

static 關鍵字可以用來修飾方法,該方法稱為靜态方法,隻可以通路類的靜态變量,并且隻能調用類的靜态方法。

關于 static 更詳細的内容,可以參照我之前寫了另外一篇文章:

面試官:兄弟,說說Java的static關鍵字吧

25、finally 和 finalize 有什麼差別?

finally 通常與 try-catch 塊一起使用,即使 try-catch 塊引發了異常,finally 塊中的代碼也會被執行,用于釋放 try 塊中建立的資源。

finalize() 是 Object 類的一個特殊方法,當對象正在被垃圾回收時,垃圾收集器将會調用該方法。可以重寫該方法用于釋放系統資源。

26、可以将一個類聲明為 static 的嗎?

不能将一個外部類聲明為 static 的,但可以将一個内部類聲明為 static 的——稱為靜态内部類。

27、什麼是靜态導入?

如果必須在一個類中使用其他類的靜态變量或者靜态方法,通常我們需要先導入該類,然後使用“類名.變量/方法”的形式調用。

import java.lang.Math;

double test = Math.PI * 5;

也可以通過靜态導入的方式,就不需要再使用類名了。

import static java.lang.Math.PI;

double test = PI * 5;

不過,靜态導入容易引發混亂(變量名或者方法名容易沖突),是以最好避免使用靜态導入。

28、什麼是 try-with-resources?

try-with-resources 是 Java 7 時引入的一個自動資源管理語句,在此之前,我們必須通過 try-catch-finally 的方式手動關閉資源,當我們忘記關閉資源的時候,就容易導緻記憶體洩漏。

關于 try-with-resources 更詳細的内容,可以參照我之前寫了另外一篇文章:

我去,你竟然還在用 try–catch-finally

29、什麼是 multi-catch?

Java 7 改進的另外一個地方就是 multi-catch,可以在單個 catch 中捕獲多個異常,當一個 try 塊抛出多個類似的異常時,這種寫法更短,更清晰。

catch(IOException | SQLException ex){

    logger.error(ex);

    throw new MyException(ex.getMessage());

當有多個異常的時候,可以使用管道表示符“|”隔開。

30、什麼是 static 塊?

static 塊是由 Java ClassLoader 将類加載到記憶體中時執行的代碼塊。通常用于初始化類的靜态變量或者建立靜态資源。

31、什麼是接口?

接口是 Java 程式設計語言中的一個核心概念,不僅在 JDK 源碼中使用很多,還在 Java 設計模式、架構和工具中使用很多。接口提供了一種在 Java 中實作抽象的方法,用于定義子類的行為約定。

關于接口更詳細的内容,可以參照我之前寫了另外一篇文章:

可能是把 Java 接口講得最通俗的一篇文章

鳴謝

說句實在話,這 31 道 Java 核心面試題在面試的過程中還是很常見的,值得好好複習一遍。關鍵是還有下一波,同樣 31 道,望眼欲穿吧?

好了,我親愛的小夥伴們,能看到這裡絕逼是最優秀的程式員,二哥必須伸出帥氣的大拇指為你點個贊!