標籤:語言 obj tostring 初始化 獲得 jre 哪些 長度 子類
序言
我是一隻亂飛亂撞的菜鳥,寫的文章目前是以記錄自己學習,和方便以後查看,期待日後不久能通過自己的努力,獲得一點小小的成功,然後寫出我的學習經驗總結性文章來。
---WH
一、什麼是虛擬機器?為什麼Java被稱作是“平台無關的程式設計語言”?
自己解答:
虛擬機器就是用來編譯我們寫的java程式,我們的程式 xxx.java 首先編譯成xxx.class 這個是位元組碼檔案,
虛擬機器通過解析我們的位元組碼檔案,來形成電腦底層所認識的編碼,所以我們不需要知道我們寫的java程式是否能在電腦上運行,因為虛擬機器已經幫我們做了這個工作,在任何平台上,虛擬機器都能這樣做,所以Java被稱為了平台無關的程式設計語言。
參考解答:
Java虛擬機器是一個可以執行Java位元組碼的虛擬機器進程。Java源檔案被編譯成能被Java虛擬機器執行的位元組碼檔案。
Java被設計成允許應用程式可以運行在任意的平台,而不需要程式員為每一個平台單獨重寫或者是重新編譯。Java虛擬機器讓這個變為可能,因為它知道底層硬體平台的指令長度和其他特性。
自我評價:概念模糊,沒講清楚是因為自己腦袋裡面也沒想清楚,
1、虛擬機器並不編譯.java成為.class位元組碼檔案, 這個事是編譯器做的,編譯器有很多種。
2、虛擬機器做的事,將位元組碼檔案解析成機器碼檔案,也就是0101這種,為了讓電腦認識該段代碼的意思,就是因為虛擬機器做了這個事情,所以才能在各個平台上運行。
更好的講解方式:
虛擬機器是能夠識別java源檔案編譯後的位元組碼檔案,並將位元組碼檔案形成機器碼,讓電腦識別,因為虛擬機器知道電腦底層的一些特性,幫我們將位元組碼變成電腦所識別的編碼,所以跟平台無關,我們只關心java源檔案的編寫就行了。
二、JDK 和 JRE 的區別是什嗎?
自己解答:
JDK = JRE + 運行庫;也就是說jdk中包含了jre
jdk就是java啟動並執行環境,java運行,就要依靠jdk的存在,
參考答案:
Java運行時環境(JRE)是將要執行Java程式的Java虛擬機器。它同時也包含了執行applet需要的瀏覽器外掛程式。Java開發套件(JDK)是完整的Java軟體開發包,包含了JRE,編譯器和其他的工具(比如:JavaDoc,Java調試器),可以讓開發人員開發、編譯、執行Java應用程式。
自我評價:概念模糊, 不清除兩者之間的關係。
1、JDK:Java Developer‘s kit Java開發套件,
2、JRE:Java Run Environment Java運行環境,
3、JRE中包括:java運行所依賴的類庫(比如String類、等等好多類,都是屬於JRE中的),JVM(虛擬機器)等一些東西
4、JDK包括:JRE 和 編譯器、其他一些工具(調試器)等。目的是讓開發人員開發、編譯、執行java應用程式。
更好的講解方式:
JDK包括了JRE 和 一些工具(編譯器,調試器) 來使開發人員開發、編譯、和運行java程式, 而JRE中有重要的 JVM(Java虛擬機器)、一些啟動並執行類庫 等東西。
三、”static”關鍵字是什麼意思?Java中是否可以覆蓋(override)一個private或者是static的方法?
自己解答:
static:靜態,能夠作用在屬性、方法上面,
作用在屬性上面,意思是在該類中就只有一份,獨一無二,每個對象都能共用它,並且能直接通過類調用該屬性
作用在方法上面,該方法能被類直接調用,
注意:靜態方法不能調用被static修飾的方法或者屬性, 而非靜態方法沒有限制,
不能說覆蓋private修飾的方法,因為覆蓋的前提就要有繼承關係,private的範圍只供本類可見,自己的子類也對其進行隱藏,能寫成一樣的方法,但那不是覆蓋
也不能重寫static方法,感覺是這樣,理由不知道。
參考答案:
“static”關鍵字表明一個成員變數或者是成員方法可以在沒有所屬的類的執行個體變數的情況下被訪問。
Java中static方法不能被覆蓋,因為方法覆蓋是基於運行時動態綁定的,而static方法是編譯時間靜態繫結的。static方法跟類的任何執行個體都不相關,所以概念上不適用。
自我評價:答對了一半吧。static修飾成員變數和修飾方法答得差不錯,但後面一問就有點疑問了。
1、static修飾成員變數和方法
2、修飾成員變數:整個類的執行個體共用該屬性,可通過類直接調用該屬性
3、修改方法:類可以直接調用該方法,靜態方法只能調用static修飾過的變數和類中的方法。而非靜態方法沒有限制,
4、注意:static修飾過的成員變數或方法,跟著類的載入就載入到了記憶體,所以類可以直接調用這些修飾過的屬性和方法,而靜態方法只能調用static修飾過的屬性和方法也是因為這個原因,靜態屬性和方法先於非靜態屬性和方法載入,所以靜態方法調用屬性時,非靜態還沒載入完呢, 而當非靜態調用靜態時,就沒有這個顧慮。
5、覆蓋,也就是重寫, 前提條件是需要繼承,父類中用private修飾的方法,對子類都不可見,繼承不了,所以沒有所謂的重寫
6、不能重寫static的方法,原因是 static在編譯時間期靜態繫結的, 而方法的重寫是基於運行時動態綁定的,而且static方法跟類的執行個體沒有任何的關係。
7、又拋出了運行時綁定的一些相關問題。只能查詢咯。(*)
運行時綁定又稱動態綁定:前提是有繼承、重寫、父類對象指向子類執行個體, 這樣就產生了多態,在運行時才能知道父類對象指向了哪個子類執行個體。例如:B b = A a();在運行時才能知道b中存放著A執行個體a的地址。
編譯時間綁定成靜態繫結:就是在編譯期間就已經載入到了記憶體,包括private、static、final修飾的變數和方法,還有建構函式,都市靜態繫結
四、是否可以在static環境中訪問非static變數?
自己解答:
答案是肯定的,不能,其實前面一題中就可以知道,因為static是跟著類一起載入呢,那時候非static變數還沒載入進記憶體,那麼static就訪問不了非static變數
參考答案:
static變數在Java中是屬於類的,它在所有的執行個體中的值是一樣的。當類被Java虛擬機器載入的時候,會對static變數進行初始化。如果你的代碼嘗試不用執行個體來訪問非static的變數,編譯器會報錯,因為這些變數還沒有被建立出來,還沒有跟任何執行個體關聯上。
自我評價:
這題應該算是理解了。記住static都跟隨類的載入而載入,優先於非static變數。
五、Java支援的資料類型有哪些?什麼是自動拆裝箱?
自己解答:
引用資料類型和非引用資料類型
非引用資料類型(四類八種):整型:byte、short、int、long、浮點型:float、double、 字元型:char、 布爾型:boolean
引用資料類型:object、String、
自動裝箱:指的是int -- Integer double -- Double 到這裡就說不出個所以然來,不熟悉。
參考答案:
·基礎資料型別 (Elementary Data Type):
整數值型:byte,short,int,long,
字元型:char
浮點類型:float,double
布爾型:boolean
整數預設int型,小數預設是double型。Float和long類型的必須加尾碼。 ·引用資料類型: 首Crowdsourced Security Testing道String是參考型別不是基本類型,參考型別聲明的變數是指該變數在記憶體中實際儲存的是一個引用地址,實體在堆中。參考型別包括類、介面、數組等。String類還是final修飾的。而封裝類就屬於參考型別, ·自動裝箱和拆箱就是基本類型和參考型別之間的轉換,至於為什麼要轉換,因為基本類型轉換為參考型別後,就可以new對象,從而調用封裝類中封裝好的方法進行基本類型之間的轉換或者toString(當然用類名直接調用也可以,便於一眼看出該方法是靜態),還有就是如果集合中想存放基本類型,泛型的限定類型只能是對應的封裝類型。
自我評價:基礎資料型別 (Elementary Data Type)還是知道,參考型別解釋時應該解釋一下本質。在將自動裝箱時,腦袋裡面只聽過這個名詞,隱約記得以前看過,看是說不出來
1、基礎資料型別 (Elementary Data Type):四類八種
2、引用資料類型:實質就是存放的地址在堆中,而在棧中有指向堆中地址的一個變數名,這樣的就是引用資料類型,String、數組、集合等都是。
3、自動裝箱:將int基礎資料型別 (Elementary Data Type)轉換為引用資料類型Integer,int 有封裝類 Integer double 有封裝類 Double boolean -- Boolean 用的最多就前面兩個,在jdk1.5之後就有自動裝箱的功能了,也就是說不需要我們手動進行,在需要的時候將自動轉換為封裝類來使用封裝類中的一些方法,
4、為什麼需要封裝類?例如,int想要轉換為String 直接強制轉換會出現問題,所以需要先將int轉換為Integer,然後再toString。。
5、什麼時候會自動裝箱?例如1:裝箱比如int變Integer,如果某個地方的參數需要填入Integer,你傳int給它,它自動會產生一個Integer傳過去。反之,Integer變int,就是自動拆箱;例如2:Integer i = 100; 這個時候也完成了自動裝箱,100隻是一個int類型的,底層將int自動轉換為了封裝類Integer。
Java常考面試題(一)