1.什么是Java虛擬機?為什么Java被稱作是“平臺無關(guān)的編程語言”?
? ??Java虛擬機是一個可以執(zhí)行Java字節(jié)碼的虛擬機進程。Java源文件被編譯成能被Java虛擬機執(zhí)行的字節(jié)碼文件。
Java被設(shè)計成允許應(yīng)用程序可以運行在任意的平臺,而不需要程序員為每一個平臺單獨重寫或者是重新編譯。Java虛擬機讓這個變?yōu)榭赡埽驗樗赖讓佑布脚_的指令長度和其他特性。
java的跨平臺不是java源程序的跨平臺 ,如果是這樣,那么所以語言都是跨平臺的, java源程序先經(jīng)過javac編譯器編譯成二進制的.class字節(jié)碼文件(java的跨平臺指的就是.class字節(jié)碼文件的跨平臺,.class字節(jié)碼文件是與平臺無關(guān)的),.class文件再運行在jvm上,java解釋器(jvm的一部分)會將其解釋成對應(yīng)平臺的機器碼執(zhí)行,所以java所謂的跨平臺就是在不同平臺上安裝了不同的jvm,而在不同平臺上生成的.class文件都是一樣的,而.class文件再由對應(yīng)平臺的jvm解釋成對應(yīng)平臺的機器碼執(zhí)行。 最后解釋下機器碼和字節(jié)碼的區(qū)別: 一,機器碼,完全依附硬件而存在~并且不同硬件由于內(nèi)嵌指令集不同,即使相同的0 1代碼 意思也可能是不同的~換句話說,根本不存在跨平臺性~比如~不同型號的CPU,你給他個指令10001101,他們可能會解析為不同的結(jié)果~ 二,我們知道JAVA是跨平臺的,為什么呢?因為他有一個jvm,不論哪種硬件,只要你裝有jvm,那么他就認識這個JAVA字節(jié)碼~~~~至于底層的機器碼,咱不用管,有jvm搞定,他會把字節(jié)碼再翻譯成所在機器認識的機器碼
2.jre和jdk的區(qū)別
Java運行時環(huán)境(JRE)。它包括Java虛擬機、Java核心類庫和支持文件。它不包含開發(fā)工具(JDK)--編譯器、調(diào)試器和其他工具。
Java開發(fā)工具包(JDK)是完整的Java軟件開發(fā)包,包含了JRE,編譯器和其他的工具(比如:JavaDoc,Java調(diào)試器),可以讓開發(fā)者開發(fā)、編譯、執(zhí)行Java應(yīng)用程序。
JRE: Java Runtime Environment
JDK:Java Development Kit
JRE顧名思義是java運行時環(huán)境,包含了java虛擬機,java基礎(chǔ)類庫。是使用java語言編寫的程序運行所需要的軟件環(huán)境,是提供給想運行java程序的用戶使用的。
JDK顧名思義是java開發(fā)工具包,是程序員使用java語言編寫java程序所需的開發(fā)工具包,是提供給程序員使用的。JDK包含了JRE,同時還包含了編譯java源碼的編譯器javac,還包含了很多java程序調(diào)試和分析的工具:jconsole,jvisualvm等工具軟件,還包含了java程序編寫所需的文檔和demo例子程序。
3.”static”關(guān)鍵字是什么意思?Java中是否可以覆蓋(override)一個private或者是static的方法?
https://www.cnblogs.com/dotgua/p/6354151.html?utm_source=itdadao&utm_medium=referral
首先是static關(guān)鍵字,static原意是“靜態(tài)的”。
①static可以修飾內(nèi)部類,但是不能修飾普通類。靜態(tài)內(nèi)部類的話可以直接調(diào)用靜態(tài)構(gòu)造器(不用對象)。
②static修飾方法,static方法就是沒有this的方法。在static方法內(nèi)部不能調(diào)用非靜態(tài)方法,反過來是可以的。而且可以在沒有創(chuàng)建任何對象的前提下,僅僅通過類本身來調(diào)用static方法。這實際上正是static方法的主要用途。方便在沒有創(chuàng)建對象的情況下來進行調(diào)用(方法/變量)。
? ? 最常見的static方法就是main,因為所有對象都是在該方法里面實例化的,而main是程序入口,所以要通過類名來調(diào)用。還有就是main中需要經(jīng)常訪問隨類加載的成員變量。?
? ③static修飾變量,就變成了靜態(tài)變量,隨類加載一次,可以被多個對象共享。?
? ④static修飾代碼塊,形成靜態(tài)代碼塊,用來優(yōu)化程序性能,將需要加載一次的代碼設(shè)置成隨類加載,靜態(tài)代碼塊可以有多個。?
Java中static方法不能被覆蓋,因為方法覆蓋是基于運行時動態(tài)綁定的,而static方法是編譯時靜態(tài)綁定的。
還有私有的方法不能被繼承,子類就沒有訪問權(quán)限,肯定也是不能別覆蓋的
4.是否可以在static環(huán)境訪問非static成員?
因為靜態(tài)的成員屬于類,隨著類的加載而加載到靜態(tài)方法區(qū)內(nèi)存,當類加載時,此時不一定有實例創(chuàng)建,沒有實例,就不可以訪問非靜態(tài)的成員。
5.Java支持的數(shù)據(jù)類型有哪些?什么是自動拆裝箱?
byte short int float double long??boolean char
自動裝箱是Java編譯器在基本數(shù)據(jù)類型和對應(yīng)的對象包裝類型之間做的一個轉(zhuǎn)化。比如:把int轉(zhuǎn)化成Integer,double轉(zhuǎn)化成Double,等等。反之就是自動拆箱。
Java支持的數(shù)據(jù)類型包括兩種:一種是基本數(shù)據(jù)類型,包含byte,char,short, boolean ,int , long, float,double;另一種是引用類型:如String等,其實是對象的引用,JVM中虛擬棧中存的是對象的地址,創(chuàng)建的對象實質(zhì)在堆中,通過地址來找到堆中的對象的過程,即為引用類型。自動裝箱就是Java編譯器在基本數(shù)據(jù)類型和對應(yīng)的對象包裝類型間的轉(zhuǎn)化,即int轉(zhuǎn)化為Integer,自動拆箱是Integer調(diào)用其方法將其轉(zhuǎn)化為int的過程
6.方法重寫override和重載overload
方法重寫的原則:
重寫方法的方法名稱、參數(shù)列表必須與原方法的相同,返回類型可以相同也可以是原類型的子類型(從Java SE5開始支持)。
重寫方法不能比原方法訪問性差(即訪問權(quán)限不允許縮小)。
重寫方法不能比原方法拋出更多的異常。
被重寫的方法不能是final類型,因為final修飾的方法是無法重寫的。
被重寫的方法不能為private,否則在其子類中只是新定義了一個方法,并沒有對其進行重寫。
被重寫的方法不能為static。如果父類中的方法為靜態(tài)的,而子類中的方法不是靜態(tài)的,但是兩個方法除了這一點外其他都滿足重寫條件,那么會發(fā)生編譯錯誤;反之亦然。即使父類和子類中的方法都是靜態(tài)的,并且滿足重寫條件,但是仍然不會發(fā)生重寫,因為靜態(tài)方法是在編譯的時候把靜態(tài)方法和類的引用類型進行匹配。
重寫是發(fā)生在運行時的,因為編譯期編譯器不知道并且沒辦法確定該去調(diào)用哪個方法,JVM會在代碼運行的時候作出決定。
方法重載的原則:
方法名稱必須相同。
參數(shù)列表必須不同(個數(shù)不同、或類型不同、參數(shù)類型排列順序不同等)。
方法的返回類型可以相同也可以不相同。
僅僅返回類型不同不足以成為方法的重載。
重載是發(fā)生在編譯時的,因為編譯器可以根據(jù)參數(shù)的類型來選擇使用哪個方法。
重寫和重載的不同:
方法重寫要求參數(shù)列表必須一致,而方法重載要求參數(shù)列表必須不一致。
方法重寫要求返回類型必須一致(或為其子類型),方法重載對此沒有要求。
方法重寫只能用于子類重寫父類的方法,方法重載用于同一個類中的所有方法。
方法重寫對方法的訪問權(quán)限和拋出的異常有特殊的要求,而方法重載在這方面沒有任何限制。
父類的一個方法只能被子類重寫一次,而一個方法可以在所有的類中可以被重載多次。
重載是編譯時多態(tài),重寫是運行時多態(tài)。
7.Java中,什么是構(gòu)造方法?什么是構(gòu)造方法重載?什么是復制構(gòu)造方法?
當新對象被創(chuàng)建的時候,構(gòu)造方法會被調(diào)用。每一個類都有構(gòu)造方法。在程序員沒有給類提供構(gòu)造方法的情況下,Java編譯器會為這個類創(chuàng)建一個默認的構(gòu)造方法。
Java中構(gòu)造方法重載和方法重載很相似。可以為一個類創(chuàng)建多個構(gòu)造方法。每一個構(gòu)造方法必須有它自己唯一的參數(shù)列表。
Java不支持像C++中那樣的復制構(gòu)造方法,這個不同點是因為如果你不自己寫構(gòu)造方法的情況下,Java不會創(chuàng)建默認的復制構(gòu)造方法。
關(guān)于復制構(gòu)造函數(shù):C++中的復制構(gòu)造函數(shù)通常有三種作用
? 1.對象作為函數(shù)參數(shù)
? 2.對象作為函數(shù)返回值
? 3.使用一個對象對另一個對象初始化。
? C++語法允許用戶定義自己的復制構(gòu)造函數(shù)以實現(xiàn)自定義的復制,比如說進行深復制。Java并不支持這樣的復制構(gòu)造函數(shù)。但是這并不代表Java中沒有這種機制,在Java中Object類的clone()方法就是這種機制的體現(xiàn)。而且通過以上三種方式對Java對象進行的操作都是對引用的操作,不像C++里面是對原對象的操作,因此Java中也不需要考慮需要使用復制構(gòu)造函數(shù)這種問題。
關(guān)于clone??https://www.cnblogs.com/acode/p/6306887.html? ?連體嬰
8.java支持多繼承嗎?
Java中類不支持多繼承,只支持單繼承(即一個類只有一個父類)。 但是java中的接口支持多繼承,,即一個子接口可以有多個父接口。(接口的作用是用來擴展對象的功能,一個子接口繼承多個父接口,說明子接口擴展了多個功能,當類實現(xiàn)接口時,類就擴展了相應(yīng)的功能)
為什么不支持? http://blog.csdn.net/allen_zhao_2012/article/details/46316401
9.接口和抽象類的區(qū)別
Java提供和支持創(chuàng)建抽象類和接口。它們的實現(xiàn)有共同點,不同點在于:
接口中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。
類可以實現(xiàn)很多個接口,但是只能繼承一個抽象類
類可以不實現(xiàn)抽象類和接口聲明的所有方法,當然,在這種情況下,類也必須得聲明成是抽象的。
抽象類可以在不提供接口方法實現(xiàn)的情況下實現(xiàn)接口。
Java接口中聲明的變量默認都是final的。抽象類可以包含非final的變量。
Java接口中的成員函數(shù)默認是public的。抽象類的成員函數(shù)可以是private,protected或者是public。
接口是絕對抽象的,不可以被實例化。抽象類也不可以被實例化,但是,如果它包含main方法的話是可以被調(diào)用的。
也可以參考JDK8中抽象類和接口的區(qū)別
10 什么是值傳遞和引用傳遞?
值傳遞是對基本型變量而言的,傳遞的是該變量的一個副本,改變副本不影響原變量.
引用傳遞一般是對于對象型變量而言的,傳遞的是該對象地址的一個副本,?并不是原對象本身?。
一般認為,java內(nèi)的傳遞都是值傳遞.?java中實例對象的傳遞是引用傳遞??
值傳遞,顧名思義傳遞的是其值,也可以理解為副本給你,任意修改,原本不變。 引用傳遞,顧名思義傳遞本身,或者說傳遞的是地址,修改的是本身或者是原本地址里的內(nèi)容。 值傳遞,原本不改變,引用傳遞,原本改變
https://www.nowcoder.com/questionTerminal/b296e9e1c40542ec8677c1e452b6b576