牛客java面试题总结版(一)
1.什么是Java虛擬機(jī)(JVM)?為什么Java被稱作是“平臺(tái)無(wú)關(guān)的編程語(yǔ)言”?
官方版:Java虛擬機(jī)是一個(gè)可以執(zhí)行Java字節(jié)碼的虛擬機(jī)進(jìn)程。Java源文件被編譯成能被Java虛擬機(jī)執(zhí)行的字節(jié)碼文件。
Java被設(shè)計(jì)成允許應(yīng)用程序可以運(yùn)行在任意的平臺(tái),而不需要程序員為每一個(gè)平臺(tái)單獨(dú)重寫(xiě)或者是重新編譯。Java虛擬機(jī)讓這個(gè)變?yōu)榭赡?#xff0c;因?yàn)樗赖讓佑布脚_(tái)的指令長(zhǎng)度和其他特性。
大神版:鏈接:https://www.nowcoder.com/questionTerminal/a90230b35b5f4a7287f779ecdd88841d
java的跨平臺(tái)不是java源程序的跨平臺(tái) ,如果是這樣,那么所以語(yǔ)言都是跨平臺(tái)的, java源程序先經(jīng)過(guò)javac編譯器編譯成二進(jìn)制的.class字節(jié)碼文件(java的跨平臺(tái)指的就是.class字節(jié)碼文件的跨平臺(tái),.class字節(jié)碼文件是與平臺(tái)無(wú)關(guān)的),.class文件再運(yùn)行在jvm上,java解釋器(jvm的一部分)會(huì)將其解釋成對(duì)應(yīng)平臺(tái)的機(jī)器碼執(zhí)行,所以java所謂的跨平臺(tái)就是在不同平臺(tái)上安裝了不同的jvm,而在不同平臺(tái)上生成的.class文件都是一樣的,而.class文件再由對(duì)應(yīng)平臺(tái)的jvm解釋成對(duì)應(yīng)平臺(tái)的機(jī)器碼執(zhí)行。 最后解釋下機(jī)器碼和字節(jié)碼的區(qū)別: 一,機(jī)器碼,完全依附硬件而存在~并且不同硬件由于內(nèi)嵌指令集不同,即使相同的0 1代碼 意思也可能是不同的~換句話說(shuō),根本不存在跨平臺(tái)性~比如~不同型號(hào)的CPU,你給他個(gè)指令10001101,他們可能會(huì)解析為不同的結(jié)果~ 二,我們知道JAVA是跨平臺(tái)的,為什么呢?因?yàn)樗幸粋€(gè)jvm,不論哪種硬件,只要你裝有jvm,那么他就認(rèn)識(shí)這個(gè)JAVA字節(jié)碼~~~~至于底層的機(jī)器碼,咱不用管,有jvm搞定,他會(huì)把字節(jié)碼再翻譯成所在機(jī)器認(rèn)識(shí)的機(jī)器碼~~~
2.JDK和JRE的區(qū)別是什么?
官方版:Java運(yùn)行時(shí)環(huán)境(JRE)。它包括Java虛擬機(jī)、Java核心類庫(kù)和支持文件。它不包含開(kāi)發(fā)工具(JDK)–編譯器、調(diào)試器和其他工具。
Java開(kāi)發(fā)工具包(JDK)是完整的Java軟件開(kāi)發(fā)包,包含了JRE,編譯器和其他的工具(比如:JavaDoc,Java調(diào)試器),可以讓開(kāi)發(fā)者開(kāi)發(fā)、編譯、執(zhí)行Java應(yīng)用程序。
大神版:鏈接:https://www.nowcoder.com/questionTerminal/36bd480a52d542298a8ca2056021f774
JRE: Java Runtime Environment
JDK:Java Development Kit
JRE顧名思義是java運(yùn)行時(shí)環(huán)境,包含了java虛擬機(jī),java基礎(chǔ)類庫(kù)。是使用java語(yǔ)言編寫(xiě)的程序運(yùn)行所需要的軟件環(huán)境,是提供給想運(yùn)行java程序的用戶使用的。
JDK顧名思義是java開(kāi)發(fā)工具包,是程序員使用java語(yǔ)言編寫(xiě)java程序所需的開(kāi)發(fā)工具包,是提供給程序員使用的。JDK包含了JRE,同時(shí)還包含了編譯java源碼的編譯器javac,還包含了很多java程序調(diào)試和分析的工具:jconsole,jvisualvm等工具軟件,還包含了java程序編寫(xiě)所需的文檔和demo例子程序。
如果你需要運(yùn)行java程序,只需安裝JRE就可以了。如果你需要編寫(xiě)java程序,需要安裝JDK。
JRE根據(jù)不同操作系統(tǒng)(如:windows,linux等)和不同JRE提供商(IBM,ORACLE等)有很多版本
3.”static”關(guān)鍵字是什么意思?Java中是否可以覆蓋(override)一個(gè)private或者是static的方法?
官方版:“static”關(guān)鍵字表明一個(gè)成員變量或者是成員方法可以在沒(méi)有所屬的類的實(shí)例變量的情況下被訪問(wèn)。
Java中static方法不能被覆蓋,因?yàn)榉椒ǜ采w是基于運(yùn)行時(shí)動(dòng)態(tài)綁定的,而static方法是編譯時(shí)靜態(tài)綁定的。static方法跟類的任何實(shí)例都不相關(guān),所以概念上不適用。
java中也不可以覆蓋private的方法,因?yàn)閜rivate修飾的變量和方法只能在當(dāng)前類中使用,如果是其他的類繼承當(dāng)前類是不能訪問(wèn)到private變量或方法的,當(dāng)然也不能覆蓋。
大神版:鏈接:https://www.nowcoder.com/questionTerminal/6f66f55a1f844e21b580e73d36223cf7
Static表示靜態(tài)的意思,可用于修飾成員變量和成員函數(shù),被靜態(tài)修飾的成員函數(shù)只能訪問(wèn)靜態(tài)成員,不可以訪問(wèn)非靜態(tài)成員。靜態(tài)是隨著類的加載而加載的,因此可以直接用類進(jìn)行訪問(wèn)。 重寫(xiě)是子類中的方法和子類繼承的父類中的方法一樣(函數(shù)名,參數(shù),參數(shù)類型,反回值類型),但是子類中的訪問(wèn)權(quán)限要不低于父類中的訪問(wèn)權(quán)限。重寫(xiě)的前提是必須要繼承,private修飾不支持繼承,因此被私有的方法不可以被重寫(xiě)。靜態(tài)方法形式上可以被重寫(xiě),即子類中可以重寫(xiě)父類中靜態(tài)的方法。但是實(shí)際上從內(nèi)存的角度上靜態(tài)方法不可以被重寫(xiě)。
附一篇代碼:
class Super{ static String greeting(){ return "Good night"; } String name(){ return "Richard"; } } class Sub extends Super{ static String greeting(){ return "Hello"; } String name(){ return "Dick"; } } class Test{ public static void main(String[] args){ Super s = new Sub(); System.out.println(s.greeting()+","+s.name()); } }運(yùn)行結(jié)果:Good night,Dick
大佬的解釋是:這個(gè)例子說(shuō)明“實(shí)例方法被覆蓋,靜態(tài)方法被隱藏”
這里一直不明白靜態(tài)方法被隱藏是什么意思,直到看到這句話:**子類重寫(xiě)父類的static方法時(shí),編譯的時(shí)候誠(chéng)信子類特性,但運(yùn)行時(shí),確實(shí)用的父類方法,因?yàn)樘摂M機(jī)把子類的static方法隱藏了。**?了解!
4.是否可以在static環(huán)境中直接訪問(wèn)非static變量?
官方版:static變量在Java中是屬于類的,它在所有的實(shí)例中的值是一樣的。當(dāng)類被Java虛擬機(jī)載入的時(shí)候,會(huì)對(duì)static變量進(jìn)行初始化。如果你的代碼嘗試不用實(shí)例來(lái)訪問(wèn)非static的變量,編譯器會(huì)報(bào)錯(cuò),因?yàn)檫@些變量還沒(méi)有被創(chuàng)建出來(lái),還沒(méi)有跟任何實(shí)例關(guān)聯(lián)上。
大神版:因?yàn)殪o態(tài)的成員屬于類,隨著類的加載而加載到靜態(tài)方法區(qū)內(nèi)存,當(dāng)類加載時(shí),此時(shí)不一定有實(shí)例創(chuàng)建,沒(méi)有實(shí)例,就不可以訪問(wèn)非靜態(tài)的成員。
PS:不可以直接訪問(wèn),但可以間接訪問(wèn),在static方法中new一個(gè)類的實(shí)例,然后借用它訪問(wèn)非static變量既ok(比如main()函數(shù))。
5.Java支持的數(shù)據(jù)類型有哪些?什么是自動(dòng)拆裝箱?
Java語(yǔ)言支持的8種基本數(shù)據(jù)類型是:
byte
short
int
long
float
double
boolean
char
自動(dòng)裝箱是Java編譯器在基本數(shù)據(jù)類型和對(duì)應(yīng)的對(duì)象包裝類型之間做的一個(gè)轉(zhuǎn)化。比如:把int轉(zhuǎn)化成Integer,double轉(zhuǎn)化成Double,等等。反之就是自動(dòng)拆箱。
Java支持的數(shù)據(jù)類型包括兩種:一種是基本數(shù)據(jù)類型,包含byte,char,short, boolean ,int , long, float,double;另一種是引用類型:如String等,其實(shí)是對(duì)象的引用,JVM中虛擬棧中存的是對(duì)象的地址,創(chuàng)建的對(duì)象實(shí)質(zhì)在堆中,通過(guò)地址來(lái)找到堆中的對(duì)象的過(guò)程,即為引用類型。自動(dòng)裝箱就是Java編譯器在基本數(shù)據(jù)類型和對(duì)應(yīng)的對(duì)象包裝類型間的轉(zhuǎn)化,即int轉(zhuǎn)化為Integer,自動(dòng)拆箱是Integer調(diào)用其方法將其轉(zhuǎn)化為int的過(guò)程
大神解釋:自動(dòng)裝箱就是編譯器把java基本數(shù)據(jù)類型轉(zhuǎn)換成對(duì)應(yīng)對(duì)象包裝類型的過(guò)程,比如int轉(zhuǎn)換成Integer,double轉(zhuǎn)換成Double,反之就是自動(dòng)拆箱 。
引用類型聲明的變量是指該變量在內(nèi)存中實(shí)際存儲(chǔ)的是一個(gè)引用地址,實(shí)體在堆中。引用類型包括類、數(shù)組、接口等。而包裝類也屬于引用類型,自動(dòng)裝箱、拆箱就是基本類型和引用類型(此處為包裝類型)之間的轉(zhuǎn)化。而轉(zhuǎn)化為引用類型之后,就可以new一個(gè)對(duì)象,從而就可以調(diào)用包裝類型中的封裝好的方法,方便使用。
總結(jié)
以上是生活随笔為你收集整理的牛客java面试题总结版(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一些java面试高频题
- 下一篇: 牛客java面试题总结版(二)