1. 程式人生 > 實用技巧 >Java 程式設計師面試筆記-Java基礎概念

Java 程式設計師面試筆記-Java基礎概念

Java 程式設計師面試筆記-Java基礎概念

Java語言有哪些優點?
  • Java為純面向物件的語言。通過它,開發人員編寫程式更加容易
  • 平臺無關性。 “可以一次編譯,到處執行”, 由於Java是解釋型語言,編譯器會把Java程式碼變成中間程式碼,然後在Java虛擬機器上解釋執行。由於中間程式碼與平臺無關,所以Java語言可以很好的跨平臺執行。
  • Java提供了很多內建的類庫,同過這些類庫,簡化了開發人員的程式設計工作,同時縮短了專案的開發時間
  • 提供了web應用開發的支援,例如, Applet、servlet和JSP可以用來開發web應用程式,Socket、RMI可以用來開發分散式應用程式的類庫
  • 具有較好的安全性和健壯性。Java語言提供了一個防止惡意程式碼攻擊的安全機制(陣列邊界檢測和Bytecode校驗等),Java的強型別機制,垃圾回收器,異常處理和安全檢查機制使得用Java語言編寫的程式有很好的健壯性。
  • 去除了C++語言中難以理解,容易混淆的特性:標頭檔案、指標、結構、單元、運算子過載、虛擬基礎類、多重繼承等,使程式更加嚴謹、簡潔

Java語言是由C++語言改進並重新設計而來的。

Java與C/C++有什麼異同
  1. 相同點:
    • 都是面嚮物件語言
    • 都使用了面向物件思想(例如封裝、多型、繼承等)
    • 二者都有很好的可重用性
  2. 不同點:
    • Java為解釋型語言,C/C++為編譯型語言
    • Java為純面嚮物件語言,所有程式碼必須在類中實現,除基本資料型別外,所有的型別都是類。此外Java中不存在全域性變數和全域性方法,而C++兼具面向過程和麵向物件程式設計的特點,可以定義全域性變數和全域性函式。
    • 與C/C++相比,Java語言沒有指標的概念,這有效的防止了C/C++語言中操作指標可能引起的系統問題,使程式變得更安全。
    • 與C++語言相比,Java語言不支援多重繼承,但是,Java引入了介面的概念,可以同時實現多個介面,由於介面也具有多型特性,因此在Java語言中可以通過實現多個介面來實現與C++中多重繼承類似的目的。
    • 在C++語言中,需要開發人員去管理對記憶體的分配(包括申請和釋放),而Java語言提供了垃圾回收器來實現垃圾的自動回收,不用程式設計師顯式的管理記憶體的分配。在C++語言中,會把釋放資源的程式碼放到解構函式中,Java語言沒有解構函式,但卻引入了一個finalize()方法,當垃圾回收器將要釋放無用物件的記憶體時,會首先呼叫該物件的finalize()方法
為什麼需要 publiic static void main(String[] args)方法?

main方法是java程式的入口方法,JVM在程式執行時,會先查詢main方法

  • public 是許可權修飾符,表明任何類或方法都可以訪問這個方法
  • static表明main方法是一個靜態方法,即方法中的程式碼是儲存在靜態儲存區的,只要類被載入後,就可以使用該方法,而不需要例項化物件來訪問。
  • void表明main方法沒有返回值
  • main是JVM識別的特殊方法名,是程式的入口方法
main方法是否還有其它可用的定義格式
  • static public void main(... ...)
  • public static final void main(... ...)
  • static public synchronized void main(String[] args)
同一個.java檔案中是否可以有多個main方法?

雖然每個類都可以定義main方法,但是隻有與檔名相同的用public修飾的類中的main方法才能作為整個程式的入口方法

如何實現在main()方法執行前輸出“hello world”

在Java語言中,由於靜態塊在類被載入時就會被呼叫,因此可以在main方法執行前,利用靜態塊實現輸出“Hello world” 的功能。

public class Test{
    static {
        System.out.println("Hello World1");
    }
    public static void main(String[] args){
        System.out.println("hello world2");
    }
}
Java程式初始化的順序是怎樣的

Java程式初始化一般遵循3個原則:

  • 靜態物件(變數)優先於非靜態物件(變數)初始化,其中靜態變數只初始化一次,而非靜態物件(變數)可能會初始化很多次
  • 父類優先於子類進行初始化
  • 按照成員變數的定義順序進行初始化。即使變數定義散佈在方法定義中,它們依然在任何方法被呼叫前先初始化。

Java程式初始化工作在許多不同的程式碼塊中來完成,它們的執行順序是:父類靜態變數,父類靜態程式碼塊,子類靜態變數,子類靜態程式碼塊,父類非靜態變數,父類非靜態程式碼塊,父類建構函式,子類非靜態變數,子類非靜態程式碼塊、子類建構函式。

Java中的作用域有哪些

在Java語言中,作用域是由花括號的位置決定的,它決定了其定義的變數名的可見性與生命週期。

在Java語言中,變數的型別主要有三種:成員變數、靜態變數和區域性變數。

類的成員變數的作用範圍與類的例項化物件的作用範圍相同,當類被例項化時,成員變數就會在記憶體中分配空間並初始化,直到這個被例項化物件的生命週期結束時成員變數的生命週期才結束。

static修飾的成員變數被稱為靜態變數或全域性變數,與成員變數不同的是,靜態變數不依賴於特定的實力,而是被所有例項共享。

區域性變數的作用域與可見性為它所在的花括號內。

成員變數也有4中作用域:

作用域與可見性 當前類 同一 package 子類 其他 package
public
private × × ×
protected ×
default × ×
一個Java程式中是否可以定義多個類

一個Java檔案中可以定義多個類,但是最多隻能有一個類被public修飾,並且這個類的類名與檔名必須一致,若這個類沒有public類,則檔名隨便是一個類的名字即可。

什麼是建構函式

建構函式是一種特殊的函式,用來在物件例項化時初始化物件的成員變數。建構函式具有以下特點:

  • 建構函式必須與類的名字相同,並且不能有返回值
  • 每個類可以有多個建構函式。
  • 建構函式可以有0個,1個活1個以上的引數。
  • 建構函式總是伴隨著new操作一起呼叫,且不能有程式的編寫者直接呼叫,必須由系統呼叫。
  • 建構函式的主要作用是完成物件的初始化工作。
  • 建構函式不能被繼承,因此,它不能被覆蓋,但是建構函式能夠被過載,可以使用不同的引數個數或引數型別來定義多個建構函式。
  • 子類可以通過super關鍵字來顯式的呼叫父類的建構函式,當父類沒有提供無引數的建構函式時,子類的建構函式中必須顯式的呼叫父類的建構函式。當父類提供無引數的建構函式時,子類的建構函式中就可以不顯式的呼叫父類的建構函式,在這種情況下編譯器會預設呼叫父類提供的無引數建構函式。
  • 當父類和子類都沒有定義建構函式時,編譯器會為父類生成一個預設的無引數建構函式,給子類也生成一個無引數的建構函式。
引申:普通方法是否可以與建構函式具有相同的方法名?
為什麼Java中有些介面沒有任何方法?

介面是抽象方法定義的集合,是一種特殊的抽象類。介面中只包含方法的定義,不包含方法的實現。介面中所有方法都是抽象的,介面中的成員的作用域都是public。

Java語言中,沒有任何方法宣告的介面被叫做標識介面,標識介面對實現它的類沒有任何語義上的要求,僅僅充當一個標識的作用,用來表明實現它的類屬於一個特定的型別。

Java中的clone方法有什麼作用?

Java中所有的類都預設繼承自Object類,Object類中提供了一個clone()方法,這個方法的作用是返回一個Object物件的複製。

clone方法的使用步驟:

  1. 首先需要繼承Cloneable介面。
  2. 在類中重寫Object類中的clone方法。
  3. 在clone方法中呼叫super.clone()
  4. 把淺複製的引用指向原型物件的克隆體
什麼是反射機制

反射機制允許程式在執行時進行自我檢查,同時也允許對其內部的成員進行操作。

反射機制提供的功能主要有:得到一個物件所屬的類,獲取一個類的所有成員變數和方法,在執行時建立物件,在執行時呼叫物件。

其實,反射機制最重要的一個作用就是可以在執行時動態的建立類的物件

在反射機制中,Class是一個非常重要的類,怎樣獲取呢

  • Class.forName(“類的路徑”)
  • 類名.Class
  • 例項.getClass()

java中建立物件的方式有4種:

  • 通過new語句例項化一個物件
  • 通過反射機制建立物件
  • 通過clone方法建立一個物件
  • 通過反序列化的方式建立一個物件
package有什麼作用?
  1. 提供多層名稱空間,解決命名衝突,通過使用package,使得處於不同package中的類可以存在相同的名字。
  2. 對類的功能進行分類,使專案的組織更加清晰。
如何實現類似於C語言中函式指標的功能

利用介面與類來實現。

先定義一個介面,然後在介面中宣告要呼叫的方法,接著實現這個介面,最後把這個實現類的 一個物件作為引數傳遞給呼叫程式,呼叫程式通過這個引數來呼叫指定的函式,從而實現回撥函式的功能。