JAVA面试常考系列一
轉(zhuǎn)載自?JAVA面試常考系列一
題目一
什么是Java虛擬機(jī)?為什么Java被稱為平臺(tái)無關(guān)的編程語言?
java虛擬機(jī)是一個(gè)可以執(zhí)行字節(jié)碼文件(.class)的虛擬機(jī)進(jìn)程。
為什么java與平臺(tái)無關(guān)呢?因?yàn)?/span>java源程序(.java)首先被編譯器編譯成字節(jié)碼文件(.class),然后java虛擬機(jī)將字節(jié)碼文件解釋成機(jī)器碼。而不同的操作平臺(tái),裝有不同的java虛擬機(jī)(JVM),能夠?qū)⑾嗤淖止?jié)碼文件(.class)解釋為對(duì)應(yīng)平臺(tái)所需要的機(jī)器碼。所以,java是一種與平臺(tái)無關(guān)的編程語言。
JDK和JRE的區(qū)別是什么?
JDK是完整的Java軟件開發(fā)包,包括編譯器、Java運(yùn)行時(shí)環(huán)境和其它的工具(比如:JavaDoc,Java調(diào)試器),可以讓開發(fā)者開發(fā)、編譯、執(zhí)行Java應(yīng)用程序。
JRE是Java運(yùn)行時(shí)環(huán)境,它是JDK的一個(gè)組成部分,只包括Java虛擬機(jī)、Java核心類庫和支持文件。?
可否在static環(huán)境中訪問非static變量?
static變量在Java中是屬于類的,它在所有的實(shí)例中的值是一樣的。當(dāng)類被Java虛擬機(jī)載入的時(shí)候,會(huì)對(duì)static變量進(jìn)行初始化。如果代碼嘗試不用實(shí)例來訪問非static的變量,編譯器會(huì)報(bào)錯(cuò),因?yàn)檫@些變量還沒有被創(chuàng)建出來,還沒有跟任何實(shí)例關(guān)聯(lián)上。?
Java支持的數(shù)據(jù)類型有哪些?什么是自動(dòng)拆裝箱?
支持類型
Java支持8種基本數(shù)據(jù)類型:
其中整數(shù)值型有四種:byte,short,int,long,
字符型一種:char
浮點(diǎn)類型兩種:float,double
布爾型一種:boolean
整數(shù)默認(rèn)int型,小數(shù)默認(rèn)是double型。Float和long類型的必須加后綴。
Java還支持引用數(shù)據(jù)類型,引用類型包括類、接口、數(shù)組等。引用類型聲明的變量是指該變量在內(nèi)存中實(shí)際存儲(chǔ)的是一個(gè)引用地址,實(shí)體在堆中。而包裝類就屬于引用類型。
自動(dòng)拆裝箱
自動(dòng)裝箱和拆箱就是基本類型和引用類型之間的轉(zhuǎn)換,轉(zhuǎn)換的目的是因?yàn)榛绢愋娃D(zhuǎn)換為引用類型后,就可以new對(duì)象,從而調(diào)用包裝類中封裝好的方法進(jìn)行基本類型之間的轉(zhuǎn)換或者toString,還有就是如果集合中想存放基本類型,泛型的限定類型只能是對(duì)應(yīng)的包裝類型。
“static”關(guān)鍵字是什么意思?Java中是否可以覆蓋(override)一個(gè)private或者是static的方法?
“static”關(guān)鍵字表明一個(gè)成員變量或者是成員方法可以在沒有所屬類的實(shí)例變量的情況下被訪問。
Java中static方法不能被覆蓋,因?yàn)閟tatic方法是編譯時(shí)靜態(tài)綁定的,而方法覆蓋是基于運(yùn)行時(shí)動(dòng)態(tài)綁定的。static方法跟類的任何實(shí)例都不相關(guān),所以概念上不適用。
java中也不可以覆蓋private的方法,因?yàn)閜rivate修飾的變量和方法只能在當(dāng)前類中使用,如果是其他的類繼承當(dāng)前類是不能訪問到private變量或方法的,當(dāng)然也不能覆蓋。
Java中的方法覆蓋(Overriding)和方法重載(Overloading)是什么意思?
方法覆蓋
Java中方法覆蓋(Overriding)是指子類重新定義了父類的方法。方法覆蓋必須有相同的方法名,參數(shù)列表和返回類型。覆蓋者可能不會(huì)限制它所覆蓋的方法的訪問。重寫方法不能為private,運(yùn)用中最典型的就是對(duì)接口方法的覆蓋。
方法重載
Java中方法重載(Overloading)就是具有相同函數(shù)名,返回類型可以不同,參數(shù)個(gè)數(shù)、順序、類型不同的函數(shù)。Overloading發(fā)生在同一個(gè)類里面具有兩個(gè)或者是更多的函數(shù)具有相同名字的情況下。
Java中,什么是構(gòu)造函數(shù)?什么是構(gòu)造函數(shù)重載?什么是復(fù)制構(gòu)造函數(shù)?
構(gòu)造函數(shù)是對(duì)象被創(chuàng)建時(shí)初始化對(duì)象的成員方法,它具有和它所在的類完全一樣的名字。構(gòu)造函數(shù)只能有入口參數(shù),沒有返回類型,因?yàn)橐粋€(gè)類的構(gòu)造方法的返回類就是類本身。構(gòu)造函數(shù)定義后,創(chuàng)建對(duì)象時(shí)就會(huì)自動(dòng)調(diào)用它,對(duì)新創(chuàng)建的對(duì)象分配內(nèi)存空間和初始化。每一個(gè)類都有構(gòu)造函數(shù)。在程序員沒有給類提供構(gòu)造函數(shù)的情況下,Java編譯器會(huì)為這個(gè)類創(chuàng)建一個(gè)默認(rèn)的構(gòu)造函數(shù)。
方法名稱相同,參數(shù)項(xiàng)不相同。那么認(rèn)為一個(gè)方法是另一個(gè)方法的重載方法。重載只跟參數(shù)有關(guān),與返回類型無關(guān)。方法名和參數(shù)相同而返回類型不相同,不能說是重載。
構(gòu)造方法重載是方法重載的一個(gè)典型的特例。參數(shù)列表不同。
Java為什么不支持多繼承?
Java中類不支持多繼承,因?yàn)閮蓚€(gè)繼承于中一個(gè)父類的子類,被同一個(gè)子類繼承時(shí),會(huì)出現(xiàn)方法的引用歧義,所以Java中只支持單繼承,即一個(gè)類只有一個(gè)父類。
java中的接口支持多繼承,即一個(gè)子接口可以有多個(gè)父接口。接口的作用是用來擴(kuò)展對(duì)象的功能,一個(gè)子接口繼承多個(gè)父接口,說明子接口擴(kuò)展了多個(gè)功能,當(dāng)類實(shí)現(xiàn)接口時(shí),類就擴(kuò)展了相應(yīng)的功能。
什么是值傳遞和引用傳遞?
值傳遞
值傳遞:(形式參數(shù)類型是基本數(shù)據(jù)類型):方法調(diào)用時(shí),實(shí)際參數(shù)把它的值傳遞給對(duì)應(yīng)的形式參數(shù),形式參數(shù)只是用實(shí)際參數(shù)的值初始化自己的存儲(chǔ)單元內(nèi)容,是兩個(gè)不同的存儲(chǔ)單元,所以方法執(zhí)行中形式參數(shù)值的改變不影響實(shí)際參數(shù)的值。
引用傳遞
引用傳遞:(形式參數(shù)類型是引用數(shù)據(jù)類型參數(shù)):也稱為傳地址。方法調(diào)用時(shí),實(shí)際參數(shù)是對(duì)象(或數(shù)組),這時(shí)實(shí)際參數(shù)與形式參數(shù)指向同一個(gè)地址,在方法執(zhí)行中,對(duì)形式參數(shù)的操作實(shí)際上就是對(duì)實(shí)際參數(shù)的操作,這個(gè)結(jié)果在方法結(jié)束后被保留了下來,所以方法執(zhí)行中形式參數(shù)的改變將會(huì)影響實(shí)際參數(shù)。?
接口和抽象類的區(qū)別是什么?
接口是對(duì)動(dòng)作的抽象,抽象類是對(duì)根源的抽象。
抽象類表示的是,這個(gè)對(duì)象是什么。接口表示的是,這個(gè)對(duì)象能做什么。比如,大貓,小貓,來定義兩個(gè)類,他們的抽象類是貓。說明,他們都是貓。貓可以奔跑,狗也可以奔跑,把“奔跑”定義成一個(gè)接口,然后讓這些類去實(shí)現(xiàn)它。
所以,在高級(jí)語言上,一個(gè)類只能繼承一個(gè)類(抽象類)(正如貓不可能同時(shí)是動(dòng)物和植物),但是可以實(shí)現(xiàn)多個(gè)接口(吃奔跑口、跳躍接口)。
區(qū)別如下:
1、抽象類和接口都不能直接實(shí)例化,如果要實(shí)例化,抽象類變量必須指向?qū)崿F(xiàn)所有抽象方法的子類對(duì)象,接口變量必須指向?qū)崿F(xiàn)所有接口方法的類對(duì)象。
2、抽象類要被子類繼承,接口要被類實(shí)現(xiàn)。
3、接口只能做方法申明,抽象類中可以做方法申明,也可以做方法實(shí)現(xiàn)。
4、接口里定義的變量只能是公共的靜態(tài)的常量,抽象類中的變量是普通變量。
5、抽象類里的抽象方法必須全部被子類所實(shí)現(xiàn),如果子類不能全部實(shí)現(xiàn)父類抽象方法,那么該子類只能是抽象類。同樣,一個(gè)實(shí)現(xiàn)接口的時(shí)候,如不能全部實(shí)現(xiàn)接口方法,那么該類也只能為抽象類。
6、抽象方法只能申明,不能實(shí)現(xiàn),接口是設(shè)計(jì)的結(jié)果 ,抽象類是重構(gòu)的結(jié)果。
7、抽象類里可以沒有抽象方法。
8、如果一個(gè)類里有抽象方法,那么這個(gè)類只能是抽象類。
9、抽象方法要被實(shí)現(xiàn),所以不能是靜態(tài)的,也不能是私有的。
10、接口可繼承接口,并可多繼承接口,但類只能單根繼承。
總結(jié)
以上是生活随笔為你收集整理的JAVA面试常考系列一的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cad3d绘图电脑配置推荐?
- 下一篇: JAVA面试常考系列二