Java面試知識點(一)

                    Java面試知識點(一)

1.Java語言有哪些優點?

1)Java爲純面向對象的語言
2)平臺無關性 一次編譯,到處運行 Java爲解釋性語言
3)Java提供了很多內置的類庫,可以簡化開發人員的程序設計工作,縮短項目開發時間
4)提供了對Web應用開發的支持 Applet,servlet,JSP開發Web應用程序;Socket,RMI開發分佈式應用程序
5)具有較好的安全性和健壯性 安全性:Java提供了一個防止惡意代碼攻擊的安全機制 健壯性:Java的強類型機制、垃圾回收器、異常處理、安全機制檢查
6)去除了C++中難以理解的特性 頭文件、指針、結構、虛擬基礎類、多重繼承等

2. Java與C/C++有什麼異同?

1)Java爲解釋性語言,而C/C++爲編譯性語言 可展開講
2)Java爲純面嚮對象語言,所有代碼都在類中實現,除基本數據類型外,其他都是類。Java中不存在全局變量或全局函數,而C/C++存在
3)Java中沒有指針
4)與C++相比雖無多重繼承,但可以利用多個接口實現
5)在C++中,需要開發人員管理內存的分配,而Java提供了垃圾回收器來實現垃圾的自動回收。
在C++中,通常把釋放資源的代碼放到析構函數中,而Java中可以利用finalize()方法,當垃圾回收器將要釋放無用對象的內存時,會首先調用該對象的finalize()方法
C++支持運算符重載,而Java不支持。
C++支持預處理,而Java沒有預處理器(雖不支持,但它的import機制與其類似)
C/C++支持goto,而Java不提供。
C/C++支持自動強制類型轉換,而Java不支持,必須顯式操作
C/C++結構和聯合的所有成員均爲公有,而Java將所有內容封裝到類中
Java具有平臺無關性,即每種數據類型都分配固定長度;而C/C++同一個數據類型在不同平臺上分配不同字節數
Java提供對註釋文檔的內建支持
Java包含一些標準庫,用於完成特定任務,同時這些庫簡單易用,能夠大大縮短開發週期;而C++則依靠一些非標準的、由其他廠商提供的庫

3. 爲什麼需要public static void main(String []args)這個方法?

public static void main(String []args)爲Java程序的入口方法,JVM在運行程序時,會首先查找main()方法。
public表明任何類或對象都可以訪問這個方法
static表明main()方法是一個靜態方法,即方法中的代碼是存儲在靜態存儲區的,只要類加載後,就可以使用該方法而不需要通過實例化對象來訪問,可以直接通過類名.main()直接訪問,JVM在啓動時就是按照上述方法的簽名(必須有public與static修飾,返回值爲void,方法的參數爲字符串數組)來查找方法的入口地址,若能找到,就執行;找不到,則會報錯
void表明方法沒有返回值
main是JVM識別的特殊方法名,是程序的入口方法
字符串數組參數args爲開發人員在命令行狀態下與程序交互提供了一種手段

通常來講,要執行一個類的方法,必須先實例化一個類對象,然後通過類對象來調用這個方法。但main()是入口方法,此時還沒有實例化對象。

(1)main()方法的其他定義格式:
a.public與static無順序關係 static public void (String []args)
b.public static final void main(String []args)
c.public static synchronized void main(String []ars)
不管哪種定義方式,都必須保證main()的返回值爲void,並用static與public修飾。同時main()爲入口方法,不能用abstract修飾
(2)同一個.java文件是否可以有多個main()方法
雖然每個類中都可以定義main()方法,但是隻要與文件名相同的用public修飾的類的main()方法才能作爲整個程序的入口方法

4. 如何實現main()方法執行前輸出“Hello world”?

在Java中,由於靜態塊在類被加載時就會被調用,因此可以在main()方法執行前,利用靜態塊實現輸出“Hello world”的功能

public class Test{
    public static void main(String []args){
        System.out.println("Hello world2");
    }
    static{
        System.out.println("Hello world1");
    }
}

靜態塊不管順序如何都會在main()方法執行之前執行

5. Java程序初始化的順序是什麼?

在Java中,當實例化對象時,對象所在類的所有成員變量首先要進行初始化,只有當所有類成員完成初始化後,纔會調用對象所在類的構造函數構造對象。
Java程序初始化遵循三原則:a.靜態對象(變量)優先於非靜態對象(變量)初始化
b.父類優先於子類進行初始化
c.按照成員變量的定義順序進行初始化
父類靜態變量>父類靜態代碼塊>子類靜態變量>子類靜態代碼塊>父類非靜態變量>父類非靜態代碼庫塊>父類構造函數>子類非靜態變量>子類非靜態代碼塊>子類構造函數

6. Java中的作用域有哪些?

在Java語言中,變量的類型主要有:成員變量、靜態變量、局部變量。
成員變量的作用範圍與類的實例化對象的作用範圍相同,當類被實例化時,成員變量就會在內存中分配空間並初始化,直到這個被實例化對象的生命週期結束時,成員變量的生命週期才結束。
static修飾的靜態變量不依賴特定的實例,而是被所有實例所共享,即一個類被加載,JVM就會給類的靜態變量分配存儲空間,故可以通過類名和變量名來訪問靜態變量
局部變量作用域爲它所在的花括號內

成員變量的中作用域:
public 所有類或對象都可以直接訪問
protected 該類自身,與它在同一個包的其他類,在其他包中的子類
default 該類自身與位於同一包中的類
private 只有該類具有訪問權限

注:這些只能修飾成員變量,不能修飾局部變量。
private與protected不能用來修飾類(只有public、default、abstract、final能修飾類)

7. 一個Java中的是否可以定義多個類?

可以定義多個類,但最多隻能有一個類被public修飾,並且這個類名與文件名必須相同。
若這個文件中沒有public類,則文件名隨便是一個類名字即可。

8. 什麼是構造函數?

構造函數是一種特殊的函數,用來在對象實例化時初始化對象的成員變量。
構造函數特點:
1)必須與類的名字相同,並且不能有返回值(返回值也不能爲void)
2)每個類可以有多個構造函數(若未自己構造,編譯器會提供一個無參構造)
3)構造函數可以有0、1或1個以上的參數
4)構造函數總是伴隨着new操作一起調用,且不能由程序的編寫者直接調用,必須由系統調用(構造函數在對象實例化時會被自動調用,且只運行一次)
5)構造函數的主要作用是完成對象的初始化操作
6)構造函數不能被繼承,故也不能被覆蓋,但可以被重載
7)子類可以通過super來顯式調用父類的構造函數,當父類沒有提供無參數的構造函數時,子類的構造函數必須顯式調用父類的構造函數。若父類提供了無參數的構造函數,子類的構造函數可以不顯示地調用(編譯器會默認調用父類提供的無參構造函數)。當有父類時,在實例化對象時會先執行父類的構造函數,再執行子類的構造函數
8)當父類和子類都沒有定義構造函數時,編譯器會爲父類生成一個默認的無參構造函數。此外,默認構造器的修飾符只跟當前類的修飾符有關。

普通方法是否可以與構造函數有相同的函數名?
可以。(可編寫程序測試一下)

9. 爲什麼Java文件中有些接口沒有任何方法?

標識接口:在接口內部沒有聲明任何方法。
標識接口對實現它的類沒有任何語義要求,它僅僅充當一個標識的作用,用來表明實現它的類屬於一個特定的類型。
Java類庫中已存在的標識接口有Cloneable和Serializable等。在使用時會用instanceof來判斷實例對象的類型是否實現了一個給定的標識接口。

關於接口的一些理解:接口是抽象方法定義的集合(接口中可以定義一些常量值),是一種特殊的抽象類。接口只包含方法的定義,沒有方法的實現。接口中所有方法都是抽象的。接口中成員的作用域修飾符都是public,接口中的常量值默認使用public static final修飾。可利用一個類實現多個接口來達到多重繼承。

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

Java在處理基本數據類型時,都是採用值傳遞(傳遞的是輸入參數的複製)的方式執行,除此之外的其他類型都是引用傳遞(傳遞的是一個對象的引用)的方式執行。對象除了在函數調用時是引用傳遞,在使用“=”賦值也採用引用傳遞。
Java中的所有類默認都繼承自Object類,而Object類中提供了一個clone()方法。這個方法作用是返回一個Object對象的複製。這個複製函數返回的是一個新的對象而不是一個引用。
淺複製與深複製有什麼區別?
淺複製:被複制對象的所有變量都含有與原來對象相同的值,而所有其他對象的引用仍然指向原來的對象。換言之,淺複製僅僅複製所考慮的對象,而不復制其他引用的對象。
深複製:被複制對象的所有變量都含有與原來對象相同的值,除去那些引用其他對象的變量。那些引用其他對象的變量將指向被複制的新對象,而不再是原有的那些被引用的對象。換言之,深複製把複製的對象所引用的對象都複製了一遍。

11. 什麼是反射機制?

反射機制提供的功能主要有:
得到一個對象所屬的類;獲取一個類的所有成員變量和方法;在運行時創建對象;在運行時調用對象的方法。
在反射機制中,class是一個非常重要的類,如何獲取class類?
①class.forName(“類的路徑”);②類名.class;③實例.getClass();

Java創建對象有哪幾種方式?
①通過new語句實例化一個對象;
②通過反射機制創建對象;
③通過clone()方法創建一個對象;
④通過反序列化的方式創建對象。

12. package有什麼作用?

package是.java文件、.class文件以及其他resource文件有條理地進行一個組織,以供使用。
package主要有以下作用:
①提供多層命名空間,解決命名衝突,通過使用package,使得處於不同package中的類可以存在相同的名字。
②對類功能進行分類,使項目組織更加清晰。

13. 如何實現類似於C語言中函數指針的功能?

C語言中的函數指針,重要功能是實現回調函數。
什麼是回調函數?指函數先在某處註冊,而它將在稍後某個需要的時候被調用。
回調函數一般用於截獲消息、獲取系統信息或處理異步事件。
在Java中如何實現類似函數指針的功能?
利用接口與類來實現同樣的效果。先定義一個接口,然後在接口中聲明要調用的方法,接着實現這個接口,最後把這個實現類的一個對象作爲參數傳遞給調用程序,調用程序通過這個參數來調用指定的函數,從而實現回調函數的功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章