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

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

逆向 說明 引用 實現接口 oat 註釋 架構 問題 自己

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支持的基本數據類型有哪些?什麽是自動拆裝箱?

java支持的基本數據類型有以下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 常見面試題及答案!