abstract:一、什么是虛擬機(jī)?為什么Java被稱作是“平臺(tái)無關(guān)的編程語言”? 自己解答: 虛擬機(jī)就是用來編譯我們寫的java程序,我們的程序 xxx.java 首先編譯成xxx.class 這個(gè)是字節(jié)碼文件, 虛擬機(jī)通過解析我們的字節(jié)碼文件,來形成計(jì)算機(jī)底層所認(rèn)識(shí)的編碼,所以我們不需要知道我們寫的java程序是否能在計(jì)算機(jī)上運(yùn)行,因?yàn)樘摂M機(jī)已經(jīng)幫我們做了這
一、什么是虛擬機(jī)?為什么Java被稱作是“平臺(tái)無關(guān)的編程語言”?
自己解答:
虛擬機(jī)就是用來編譯我們寫的java程序,我們的程序 xxx.java 首先編譯成xxx.class 這個(gè)是字節(jié)碼文件,
虛擬機(jī)通過解析我們的字節(jié)碼文件,來形成計(jì)算機(jī)底層所認(rèn)識(shí)的編碼,所以我們不需要知道我們寫的java程序是否能在計(jì)算機(jī)上運(yùn)行,因?yàn)樘摂M機(jī)已經(jīng)幫我們做了這個(gè)工作,在任何平臺(tái)上,虛擬機(jī)都能這樣做,所以Java被稱為了平臺(tái)無關(guān)的編程語言。
參考解答:
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ú)重寫或者是重新編譯。Java虛擬機(jī)讓這個(gè)變?yōu)榭赡?,因?yàn)樗赖讓佑布脚_(tái)的指令長度和其他特性。
自我評(píng)價(jià):概念模糊,沒講清楚是因?yàn)樽约耗X袋里面也沒想清楚,
1、虛擬機(jī)并不編譯.java成為.class字節(jié)碼文件, 這個(gè)事是編譯器做的,編譯器有很多種。
2、虛擬機(jī)做的事,將字節(jié)碼文件解析成機(jī)器碼文件,也就是0101這種,為了讓計(jì)算機(jī)認(rèn)識(shí)該段代碼的意思,就是因?yàn)樘摂M機(jī)做了這個(gè)事情,所以才能在各個(gè)平臺(tái)上運(yùn)行。
更好的講解方式:
虛擬機(jī)是能夠識(shí)別java源文件編譯后的字節(jié)碼文件,并將字節(jié)碼文件形成機(jī)器碼,讓計(jì)算機(jī)識(shí)別,因?yàn)樘摂M機(jī)知道計(jì)算機(jī)底層的一些特性,幫我們將字節(jié)碼變成計(jì)算機(jī)所識(shí)別的編碼,所以跟平臺(tái)無關(guān),我們只關(guān)心java源文件的編寫就行了。
二、JDK 和 JRE 的區(qū)別是什么?
自己解答:
JDK = JRE + 運(yùn)行庫;也就是說jdk中包含了jre
jdk就是java運(yùn)行的環(huán)境,java運(yùn)行,就要依靠jdk的存在,
參考答案:
Java運(yùn)行時(shí)環(huán)境(JRE)是將要執(zhí)行Java程序的Java虛擬機(jī)。它同時(shí)也包含了執(zhí)行applet需要的瀏覽器插件。Java開發(fā)工具包(JDK)是完整的Java軟件開發(fā)包,包含了JRE,編譯器和其他的工具(比如:JavaDoc,Java調(diào)試器),可以讓開發(fā)者開發(fā)、編譯、執(zhí)行Java應(yīng)用程序。
自我評(píng)價(jià):概念模糊, 不清除兩者之間的關(guān)系。
1、JDK:Java Developer's kit Java開發(fā)工具包,
2、JRE:Java Run Environment Java運(yùn)行環(huán)境,
3、JRE中包括:java運(yùn)行所依賴的類庫(比如String類、等等好多類,都是屬于JRE中的),JVM(虛擬機(jī))等一些東西
4、JDK包括:JRE 和 編譯器、其他一些工具(調(diào)試器)等。目的是讓開發(fā)者開發(fā)、編譯、執(zhí)行java應(yīng)用程序。
更好的講解方式:
JDK包括了JRE 和 一些工具(編譯器,調(diào)試器) 來使開發(fā)者開發(fā)、編譯、和運(yùn)行java程序, 而JRE中有重要的 JVM(Java虛擬機(jī))、一些運(yùn)行的類庫 等東西。
三、”static”關(guān)鍵字是什么意思?Java中是否可以覆蓋(override)一個(gè)private或者是static的方法?
自己解答:
static:靜態(tài)的,能夠作用在屬性、方法上面,
作用在屬性上面,意思是在該類中就只有一份,獨(dú)一無二,每個(gè)對(duì)象都能共享它,并且能直接通過類調(diào)用該屬性
作用在方法上面,該方法能被類直接調(diào)用,
注意:靜態(tài)方法不能調(diào)用被static修飾的方法或者屬性, 而非靜態(tài)方法沒有限制,
不能說覆蓋private修飾的方法,因?yàn)楦采w的前提就要有繼承關(guān)系,private的作用域只供本類可見,自己的子類也對(duì)其進(jìn)行隱藏,能寫成一樣的方法,但那不是覆蓋
也不能重寫static方法,感覺是這樣,理由不知道。
參考答案:
“static”關(guān)鍵字表明一個(gè)成員變量或者是成員方法可以在沒有所屬的類的實(shí)例變量的情況下被訪問。
Java中static方法不能被覆蓋,因?yàn)榉椒ǜ采w是基于運(yùn)行時(shí)動(dòng)態(tài)綁定的,而static方法是編譯時(shí)靜態(tài)綁定的。static方法跟類的任何實(shí)例都不相關(guān),所以概念上不適用。
自我評(píng)價(jià):答對(duì)了一半吧。static修飾成員變量和修飾方法答得差不錯(cuò),但后面一問就有點(diǎn)疑問了。
1、static修飾成員變量和方法
2、修飾成員變量:整個(gè)類的實(shí)例共享該屬性,可通過類直接調(diào)用該屬性
3、修改方法:類可以直接調(diào)用該方法,靜態(tài)方法只能調(diào)用static修飾過的變量和類中的方法。而非靜態(tài)方法沒有限制,
4、注意:static修飾過的成員變量或方法,跟著類的加載就加載到了內(nèi)存,所以類可以直接調(diào)用這些修飾過的屬性和方法,而靜態(tài)方法只能調(diào)用static修飾過的屬性和方法也是因?yàn)檫@個(gè)原因,靜態(tài)屬性和方法先于非靜態(tài)屬性和方法加載,所以靜態(tài)方法調(diào)用屬性時(shí),非靜態(tài)還沒加載完呢, 而當(dāng)非靜態(tài)調(diào)用靜態(tài)時(shí),就沒有這個(gè)顧慮。
5、覆蓋,也就是重寫, 前提條件是需要繼承,父類中用private修飾的方法,對(duì)子類都不可見,繼承不了,所以沒有所謂的重寫
6、不能重寫static的方法,原因是 static在編譯時(shí)期靜態(tài)綁定的, 而方法的重寫是基于運(yùn)行時(shí)動(dòng)態(tài)綁定的,而且static方法跟類的實(shí)例沒有任何的關(guān)系。
7、又拋出了運(yùn)行時(shí)綁定的一些相關(guān)問題。只能查詢咯。(*)
運(yùn)行時(shí)綁定又稱動(dòng)態(tài)綁定:前提是有繼承、重寫、父類對(duì)象指向子類實(shí)例, 這樣就產(chǎn)生了多態(tài),在運(yùn)行時(shí)才能知道父類對(duì)象指向了哪個(gè)子類實(shí)例。例如:B b = A a();在運(yùn)行時(shí)才能知道b中存放著A實(shí)例a的地址。
編譯時(shí)綁定成靜態(tài)綁定:就是在編譯期間就已經(jīng)加載到了內(nèi)存,包括private、static、final修飾的變量和方法,還有構(gòu)造函數(shù),都市靜態(tài)綁定
四、是否可以在static環(huán)境中訪問非static變量?
自己解答:
答案是肯定的,不能,其實(shí)前面一題中就可以知道,因?yàn)閟tatic是跟著類一起加載呢,那時(shí)候非static變量還沒加載進(jìn)內(nèi)存,那么static就訪問不了非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)上。
自我評(píng)價(jià):
這題應(yīng)該算是理解了。記住static都跟隨類的加載而加載,優(yōu)先于非static變量。
五、Java支持的數(shù)據(jù)類型有哪些?什么是自動(dòng)拆裝箱?
自己解答:
引用數(shù)據(jù)類型和非引用數(shù)據(jù)類型
非引用數(shù)據(jù)類型(四類八種):整型:byte、short、int、long、浮點(diǎn)型:float、double、 字符型:char、 布爾型:boolean
引用數(shù)據(jù)類型:object、String、
自動(dòng)裝箱:指的是int -- Integer double -- Double 到這里就說不出個(gè)所以然來,不熟悉。
參考答案:
·基本數(shù)據(jù)類型:
整數(shù)值型:byte,short,int,long,
字符型:char
浮點(diǎn)類型:float,double
布爾型:boolean
整數(shù)默認(rèn)int型,小數(shù)默認(rèn)是double型。Float和long類型的必須加后綴。
·引用數(shù)據(jù)類型:
首先知道String是引用類型不是基本類型,引用類型聲明的變量是指該變量在內(nèi)存中實(shí)際存儲(chǔ)的是一個(gè)引用地址,實(shí)體在堆中。引用類型包括類、接口、數(shù)組等。String類還是final修飾的。而包裝類就屬于引用類型,
·自動(dòng)裝箱和拆箱就是基本類型和引用類型之間的轉(zhuǎn)換,至于為什么要轉(zhuǎn)換,因?yàn)榛绢愋娃D(zhuǎn)換為引用類型后,就可以new對(duì)象,從而調(diào)用包裝類中封裝好的方法進(jìn)行基本類型之間的轉(zhuǎn)換或者toString(當(dāng)然用類名直接調(diào)用也可以,便于一眼看出該方法是靜態(tài)的),還有就是如果集合中想存放基本類型,泛型的限定類型只能是對(duì)應(yīng)的包裝類型。
自我評(píng)價(jià):基本數(shù)據(jù)類型還是知道,引用類型解釋時(shí)應(yīng)該解釋一下本質(zhì)。在將自動(dòng)裝箱時(shí),腦袋里面只聽過這個(gè)名詞,隱約記得以前看過,看是說不出來
1、基本數(shù)據(jù)類型:四類八種
2、引用數(shù)據(jù)類型:實(shí)質(zhì)就是存放的地址在堆中,而在棧中有指向堆中地址的一個(gè)變量名,這樣的就是引用數(shù)據(jù)類型,String、數(shù)組、集合等都是。
3、自動(dòng)裝箱:將int基本數(shù)據(jù)類型轉(zhuǎn)換為引用數(shù)據(jù)類型Integer,int 有包裝類 Integer double 有包裝類 Double boolean -- Boolean 用的最多就前面兩個(gè),在jdk1.5之后就有自動(dòng)裝箱的功能了,也就是說不需要我們手動(dòng)進(jìn)行,在需要的時(shí)候?qū)⒆詣?dòng)轉(zhuǎn)換為包裝類來使用包裝類中的一些方法,
4、為什么需要包裝類?例如,int想要轉(zhuǎn)換為String 直接強(qiáng)制轉(zhuǎn)換會(huì)出現(xiàn)問題,所以需要先將int轉(zhuǎn)換為Integer,然后再toString。。
5、什么時(shí)候會(huì)自動(dòng)裝箱?例如1:裝箱比如int變Integer,如果某個(gè)地方的參數(shù)需要填入Integer,你傳int給它,它自動(dòng)會(huì)生成一個(gè)Integer傳過去。反之,Integer變int,就是自動(dòng)拆箱;例如2:Integer i = 100; 這個(gè)時(shí)候也完成了自動(dòng)裝箱,100只是一個(gè)int類型的,底層將int自動(dòng)轉(zhuǎn)換為了包裝類Integer。