獻給 2018 還在艱苦奮鬥的 Java 程式員,Java 常見面試題及答案!

來源:互聯網
上載者:User

標籤:驗證   全面   需求   prot   轉寄   改變   應用程式   nal   抽象類別   

1.什麼是Java虛擬機器?為什麼Java被稱作是“平台無關的程式設計語言”?

JAVA 虛擬機器是一個可以執行 Java 位元組碼的虛擬機器進程。Java 源檔案被編譯成能被 JAVA 虛擬機器執行的位元組碼檔案。

Java 被設計成允許應用程式可以運行在任意的平台,而不需要程式員為每一個平台單獨重寫或者是重新編譯。

JAVA 虛擬機器讓這個變為可能,因為它知道底層硬體平台的指令長度和其他特性。

2.JDK和JRE的區別是什嗎?

JDK: java開發套件,包含了JRE、編譯器和其它工具(如:javaDOc、java調試器)

JRE: java運行環境,包含java虛擬機器和java程式所需的核心類庫。

如果只是想跑java程式,那麼只需安裝JRE,如果要寫java程式並且運行,那就需要JDK了。

3.”static”關鍵字是什麼意思?Java中是否可以覆蓋一個private或者是static的方法?

如果一個類的變數或者方法前面有static修飾,那麼表明這個方法或者變數屬於這個類,也就是說可以在不建立對象的情況下直接使用

當父類的方法被private修飾時,表明該方法為父類私人,對其他任何類都是不可見的,因此如果子類定了一個與父類一樣的方法,這對於子類來說相當於是一個新的私人方法,且如果要進行向上轉型,然後去調用該“覆蓋方法”,會產生編譯錯誤

class Parent { private fun() { ... } }class Child extends Parent { private fun() { ... }}class Test { public static void main(String[] args) { Parent c = new Child(); c.fun(); //編譯出錯 }}

static方法時編譯時間靜態繫結的,屬於類,而覆蓋是運行時動態綁定的(動態綁定的多態),因此不能覆蓋.

4.Java支援的基礎資料型別 (Elementary Data Type)有哪些?什麼是自動拆裝箱?

java支援的基礎資料型別 (Elementary Data Type)有以下9種:byte,shot,int,long,float,double,char,boolean,void.

自動拆裝箱是java從jdk1.5引用,目的是將原始類型自動的裝換為相對應的對象,也可以逆向進行,即拆箱。這也體現java中一切皆對象的宗旨。

所謂自動裝箱就是將原始類型自動的轉換為對應的對象,而拆箱就是將物件類型轉換為基本類型。java中的自動拆裝箱通常發生在變數賦值的過程中,如:

Integer object = 3; //自動裝箱 int o = object; //拆箱

在java中,應該注意自動拆裝箱,因為有時可能因為java自動裝箱機制,而導致建立了許多個物件,對於記憶體小的平台會造成壓力。

覆蓋和重載是什麼?

覆蓋也叫重寫,發生在子類與父類之間,表示子類中的方法可以與父類中的某個方法的名稱和參數完全相同,通過子類建立的執行個體對象調用這個方法時,將調用子類中的定義方法,這相當於把父類中定義的那個完全相同的方法給覆蓋了,這也是物件導向編程的多態性的一種表現。

重載是指在一個類中,可以有多個相同名稱的方法,但是他們的參數列表的個數或類型不同,當調用該方法時,根據傳遞的參數類型調用對應參數列表的方法。當參數列表相同但傳回值不同時,將會出現編譯錯誤,這並不是重載,因為jvm無法根據傳回值類型來判斷應該調用哪個方法。

5.Java支援多繼承嗎?如果不支援,如何??

在java中是單繼承的,也就是說一個類只能繼承一個父類。

java中實現多繼承有兩種方式,一是介面,而是內部類.

//實現多個介面 如果兩個介面的變數相同 那麼在調用該變數的時候 編譯出錯interface interface1 { static String field = "dd"; public void fun1(); }interface interface2 {static String field = "dddd"; public void fun2(); }class child implements interface1,interface2 { static String field = "dddd"; @Override public void fun2() { } @Override public void fun1() { } }//內部類 間接多繼承class Child {class Father { private void strong() { System.out.println("父類"); }}class Mother { public void getCute() { System.out.println("母親"); }}public void getStrong() { Father f = new Father(); f.strong(); }public void getCute() { Mother m = new Mother(); m.getCute(); }}

6.什麼是值傳遞和引用傳遞?java中是值傳遞還是引用傳遞,還是都有?

值傳遞 就是在方法調用的時候,實參是將自己的一份拷貝賦給形參,在方法內,對該參數值的修改不影響原來實參,常見的例子就是剛開始學習c語言的時候那個交換方法的例子了。

引用傳遞 是在方法調用的時候,實參將自己的地址傳遞給形參,此時方法內對該參數值的改變,就是對該實參的實際操作。

在java中只有一種傳遞方式,那就是值傳遞.可能比較讓人迷惑的就是java中的對象傳遞時,對形參的改變依然會意向到該對象的內容。

下面這個例子來說明java中是值傳遞.

public class Test { public static void main(String[] args) { StringBuffer sb = new StringBuffer("hello "); getString(sb); System.out.println(sb); } public static void getString(StringBuffer s) { //s = new StringBuffer("ha"); s.append("world"); }}

在上面這個例子中,當前輸出結果為:hello world。這並沒有什麼問題,可能就是大家平常所理解的引用傳遞,那麼當然會改變StringBuffer的內容。但是如果把上面的注釋去掉,那麼就會輸出:hello.此時sb的值並沒有變成ha hello. 假如說是引用傳遞的話,那麼形參的s也就是sb的地址,此時在方法裡new StringBuffer(),並將該對象賦給s,也就是說s現在指向了這個新建立的對象.按照引用傳遞的說法,此時對s的改變就是對sb的操作,也就是說sb應該也指向新建立的對象,那麼輸出的結果應該為ha world.但實際上輸出的僅是hello.這說明sb指向的還是原來的對象,而形參s指向的才是建立的對象,這也就驗證了java中的對象傳遞也是值傳遞。

7.介面和抽象類別的區別是什麼?

不同點在於:

介面中所有的方法隱含的都是抽象的。而抽象類別則可以同時包含抽象和非抽象的方法。

類可以實現很多個介面,但是只能繼承一個抽象類別

類如果要實現一個介面,它必須要實現介面聲明的所有方法。但是,類可以不實現抽象類別聲明的所有方法,當然,在這種情況下,類也必須得聲明成是抽象的。

抽象類別可以在不提供介面方法實現的情況下實現介面。

Java 介面中聲明的變數預設都是 final 的。抽象類別可以包含非 final 的變數。

Java 介面中的成員函數預設是 public 的。抽象類別的成員函數可以是 private,protected 或者是 public 。

介面是絕對抽象的,不可以被執行個體化(java 8已支援在介面中實現預設的方法)。抽象類別也不可以被執行個體化,但是,如果它包含 main 方法的話是可以被調用的。

8.構造器(constructor)是否可被重寫(override)?

構造方法是不能被子類重寫的,但是構造方法可以重載,也就是說一個類可以有多個構造方法。

9.Math.round(11.5) 等於多少? Math.round(-11.5)等於多少?

Math.round(11.5)==12 Math.round(-11.5)==-11 round 方法返回與參數 最接近的長整數,參數加 1/2 後求其 floor.

10. String, StringBuffer StringBuilder的區別。

tring 的長度是不可變的;

StringBuffer的長度是可變的,如果你對字串中的內容經常進行操作,特別是內容要修改時,那麼使用 StringBuffer,如果最後需要 >String,那麼使用 StringBuffer 的 toString() 方法;安全執行緒;

StringBuilder 是從 JDK 5 開始,為StringBuffer該類補充了一個單個線程使用的等價類別;通常應該優先使用 StringBuilder 類,因>為它支援所有相同的操作,但由於它不執行同步,所以速度更快。

使用字串的時候要特別小心,如果對一個字串要經常改變的話,就一定不要用String,否則會建立許多無用的對象出來.

來看一下比較

String s = "hello"+"world"+"i love you";StringBuffer Sb = new StringBuilder("hello").append("world").append("i love you");

這個時候s有多個字串進行拼接,按理來說會有多個對象產生,但是jvm會對此進行一個最佳化,也就是說只建立了一個對象,此時它的執行速度要比StringBuffer拼接快.再看下面這個:

String s2 = "hello"; String s3 = "world"; String s4 = "i love you"; String s1 = s2 + s3 + s4;

上面這種情況,就會多建立出來三個對象,造成了記憶體空間的浪費.

java常見面試題及答案 21-30,請看下篇,歡迎轉寄加關注.

1、具有1-5工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以進群學習。

2、在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以進群學習。

3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發架構掌握熟練的,可以進群學習。

4、覺得自己很牛B,一般需求都能搞定。但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以進群學習。

5.阿里Java進階架構師直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶著大家全面、科學地建立自己的技術體系和技術認知!

群號:685167672

獻給 2018 還在艱苦奮鬥的 Java 程式員,Java 常見面試題及答案!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.