更新時間:2019-08-07 15:14:15 來源:動力節點 瀏覽7529次
1、JVM、JRE和JDK的區別?
JVM(Java Virtual Machine):java虛擬機,用于保證java的跨平臺的特性。 java語言是跨平臺,jvm不是跨平臺的。
JRE(Java Runtime Environment):java的運行環境,包括jvm+java的核心類庫。
JDK(Java Development Kit):java的開發工具,包括jre+開發工具
2、環境變量path和classpath的作用是什么?
path是配置Windows可執行文件的搜索路徑,即擴展名為.exe的程序文件所在的目錄,
用于指定DOS窗口命令的路徑。
Classpath是配置class文件所在的目錄,用于指定類搜索路徑,JVM就是通過它來尋找該類的class類文件的。
3、Java語言的特性?
跨平臺性、面向對象、安全性、多線程、簡單易用。
4、變量有什么用?為什么要定義變量?什么時候用?
變量的作用:用來存儲數據。
為什么要定義變量:用來不斷的存放同一類型的常量,并可以重復使用
5、& 和 && 的區別?
&運算符有兩種用法: (1)按位與; (2)邏輯與。
&&運算符是短路與運算。
&&會出現短路,如果可以通過第一個表達式判斷出整個表達式的結果,則不繼續后面表達式的運算;只能操作boolean類型數據
詳細介紹:折疊
&&之所以稱為短路運算是因為,如果&&左邊的表達式的值是 false,右邊的表達式會被直接短路掉,不會進行運算。
很多時候我們可能都需要用&&而不是&,例如在驗證用戶登錄時判定用戶名不是 null 而且不是空字符串,應當寫為 username != null &&!username.equals(""),二者的順序不能交換,更不能用&運算符,因為第一個條件如果不成立,根本不能進行字符串的 equals 比較,否則會產生 NullPointerException 異常。
注意:邏輯或運算符(|)和短路或運算符(||)的差別也是如此。
6、數據類型
(1)基本數據類型(4類8種)(字節數){數據表示范圍}
整數類型:byte(1)、short(2)、int(4)、long(8)
字符類型:char(2)
布爾類型:boolean(1)(ture false)
浮點數類型:float(4)、double(8)
(2)引用數據類型:類、接口、數組
(3)數據類型表
7、類型轉換
(1)精度從高到低 double float long int short(char) byte
自動類型轉換 將一個低精度 → 高精度
強制類型轉換 將一個高精度 → 低精度(精度會下降)
8、String是最基本的數據類型嗎?
基本數據類型包括byte、int、char、long、float、double、boolean和short。取值范圍是 -2^(字節數*8-1) ~ -2^(字節數*8-1) - 1,但Boolean是4個字節,而boolean數組1個字節,這是因為虛擬機用int來代替boolean,保證高效存取。而java.lang.String類是final類型的,因此不能繼承也不能修改String類。String還重寫了hashCode和equals方法。
9、數組和String有length()方法嗎?
數組沒有length()這個方法,有getLength()方法,但有length的屬性。String有length()方法
10、是否可以繼承String?
String 類是 final 類,不可以被繼承。
繼承 String 本身就是一個錯誤的行為,對 String 類型最好的重用方式是關聯關系(Has-A)和依賴關系(UseA)而不是繼承關系(Is-A)
11、new一個字符串“xyz”創建了幾個對象?
兩個或一個,new一個字符串會產生兩個對象,一個在堆上,一個在常量池中,堆上的數據每new一次產生一個新的對象,如果常量池中有需要的對象,就不會創建新的對象,直接拿來用,所以一共創建了一個對象,若常量池中沒有要用的對象,則會創建一個,所以一共創建了兩個對象。
12、float f=3.4;是否正確?
不正確。3.4是雙精度數,將雙精度型(double)賦值給浮點型(float)屬于下轉型(down-casting,也稱為窄化)會造成精度損失,因此需要強制類型轉換float f =(float)3.4; 或者寫成float f =3.4F。
13、int和Integer有什么區別?
int是java的原始數據類型,Integer是java為int提供的封裝類。Integer實例變量的缺省值為 null,而int實例變量的缺省值與它們的類型有關。int與Integer之間可以進行自動拆裝箱的轉換,但Integer的取值范圍是-128-127,若超過這個范圍,就new一個新的對象返回(Valueof方法)
14、“==”和equals方法的區別?
== 和 equals 最大的區別是一個是運算符 一個是方法 。
==:如果比較的對象是基本數據類型,則比較的是數值是否相等;如果比較的是引用數據類型,則比較的是對象的地址值是否相等。
equals():用來比較方法兩個對象的內容是否相等,字符串的比較常用equals方法。
注意: equals方法不能比較基本數據類型,如果沒有對 equals 方法進行重寫,則比較的是引用類型的變量所指向的對象的地址。如果一個類沒有自己定義equals方法,那么它將繼承Object類的equals方法(使用==操作符)
15、函數的定義、特點、兩個明確
(1)定義:函數就是定義在類中的具有特定功能的一段獨立小程序。
(2)特點:
定義函數可以將功能代碼進行封裝,便于對該功能進行復用
函數只有被調用才會被執行
函數的出現提高了代碼的復用性
對于函數沒有具體返回值的情況,返回值類型用關鍵字void表示,那么該函數中的return語句如果在最后一行可以省略不寫。
(3)兩個明確
明確要定義的功能最后的結果是什么?
明確在定義該功能的過程中,是否需要未知內容參與運算
16、重載:
概念:在同一個類中,允許存在一個以上的同名函數,只要它們的參數個數或者參數類型不同即可。
特點:與返回值類型無關,只看參數列表(參數類型以及參數個數)。
好處:方便于閱讀,優化了程序設計。
17、數組:
概念:同一種數據類型的集合。
好處:可以自動給數組中的元素從0開始編號,方便操作這些元素。
18、內存結構:
棧內存:用于存儲局部變量,當數據使用完,所占空間會自動釋放。
堆內存:數組和對象,通過new建立的實例都存放在堆內存中。
方法區:靜態成員、構造函數、常量池、線程池
本地方法區:window系統占用
19、面向對象的概述
面向對象是相對于面向過程而言的,面向過程強調的是功能,面向對象強調的是將功能封裝進對象,強調具備功能的對象;
20、面向對象的思想特點:
是符合人們思考習慣的一種思想;
將復雜的事情簡單化了;
將程序員從執行者變成了指揮者;
比如我要達到某種結果,我就尋找能幫我達到該結果的功能的對象,如我要洗衣服我就買洗衣機,至于怎么洗我不管。
21、面向對象的特性
3 大特性,封裝、繼承、多態
22、面向對象特性的理解
繼承:繼承是從已有類得到繼承信息創建新類的過程。(java中用extends關鍵字表示)
多個類中存在相同屬性和行為時,將這些內容抽取到單獨一個類中,那么多個類無需再定義這些屬性和行為,只要繼承那個類即可
封裝:隱藏對象的屬性和實現細節,僅對外提供公共訪問方式
通常認為封裝是把數據和操作數據的方法綁定起來,對數據的訪問只能通過已定義的接口。面向對象的本質就是將現實世界描繪成一系列完全自治、封閉的對象。我們在類中編寫的方法就是對實現細節的一種封裝;我們編寫一個類就是對數據和數據操作的封裝。可以說,封裝就是隱藏一切可隱藏的東西,只向外界提供最簡單的編程接口。
多態:一個對象在程序不同運行時刻代表的多種狀態,父類或者接口的引用指向子類對象
多態性是指允許不同子類型的對象對同一消息作出不同的響應。簡單的說就是用同樣的對象引用調用同樣的方法但是做了不同的事情。多態性分為編譯時的多態性和運行時的多態性。
如果將對象的方法視為對象向外界提供的服務,那么運行時的多態性可以解釋為:當 A 系統訪問 B 系統提供的服務時, B 系統有多種提供服務的方式,但一切對 A 系統來說都是透明的。
方法重載(overload)實現的是編譯時的多態性(也稱為前綁定),而方法重寫(override)實現的是運行時的多態性(也稱為后綁定)。
運行時的多態是面向對象最精髓的東西,要實現多態需要做兩件事:
1、方法重寫(子類繼承父類并重寫父類中已有的或抽象的方法);
2. 對象造型(用父類型引用引用子類型對象,這樣同樣的引用調用同樣的方法就會根據子類對象的不同而表現出不同的行為)
繼承的特點、好處
繼承的特點:
(1)java中只能單繼承,沒有多繼承。
(2)java可以有多重(層)繼承。
繼承的好處:
(1)繼承的出現提高了代碼的復用性。
(2)繼承的出現讓類與類之間產生了關系,提供了多態的前提。
23、重寫和重載的區別? 重載的方法能否根據返回類型進行區分?
重載:在同一類中。方法名相同,參數列表不同。重載可以改變返回類型。
重寫:在不同類中(子父類中)。方法聲明相同(返回類型,方法名,參數列表均相同)。
方法的重載和重寫都是實現多態的方式,區別在于前者實現的是編譯時的多態性,而后者實現的是運行時的多態性。
重載發生在一個類中,同名的方法如果有不同的參數列表(參數類型不同、參數個數不同或者二者都不同)則視為重載;
重寫發生在子類與父類之間,重寫要求子類被重寫方法與父類被重寫方法有相同的返回類型,比父類被重寫方法更好訪問,不能比父類被重寫方法聲明更多的異常(里氏代換原則)。重載對返回類型沒有特殊的要求。
方法重載的規則:
(1)方法名一致,參數列表中參數的順序,類型,個數不同。
(2)重載與方法的返回值無關,存在于父類和子類, 同類中。
(3)可以拋出不同的異常,可以有不同修飾符
方法重寫的規則:
(1)參數列表必須完全與被重寫方法的一致,返回類型必須完全與被重寫方法的返回類型一致。
(2)構造方法不能被重寫,聲明為 final 的方法不能被重寫,聲明為 static 的方法不能被重寫,但是能夠被再次聲明。
(2)訪問權限不能比父類中被重寫的方法的訪問權限更低。
(4)重寫的方法能夠拋出任何非強制異常(UncheckedException,也叫非運行時異常),無論被重寫的方法是否拋出異常。但是,重寫的方法不能拋出新的強制性異常,或者比被重寫方法聲明的更廣泛的強制性異常,反之則可以。
重寫需要注意:
(1)子類方法的訪問權限要大于等于父類方法的訪問權限。
(2)靜態只能重寫靜態。但是這種情況一般不會出現。
24、final關鍵字
最終的意思,可以用于修飾類,方法,變量。
final修飾的類不能被繼承。
final修飾的方法不能被重寫。
final修飾的變量是一個常量。只能被賦值一次。
內部類只能訪問被final修飾的局部變量。
25、final 、finally 、finalize
final 最終的意思。用于修飾類,成員變量,成員方法。它修飾的類不能被繼承,它修飾的變量時常量,它修飾的方法不能被重寫。
finally 用于異常處理中。表示,必須要執行的代碼塊,除非java虛擬機停止工作,否則一定會執行
finalize() 是Object類中的一個方法。用于java虛擬機的垃圾回收
26、假如catch中有return語句, finally里中的代碼會執行嗎?
會,在return前執行finally里面的代碼。
27、類和對象
類:對現實世界中某類事物的描述,是抽象的,概念上的定義。
對象:事物具體存在的個體。
28、成員變量和局部變量的區別
(1)作用域
成員變量:針對整個類有效。
局部變量:只在某個范圍內有效。(一般指的就是方法,語句體內)
(2)存儲位置
成員變量:隨著對象的創建而存在,隨著對象的消失而消失,存儲在堆內存中。
局部變量:在方法被調用,或者語句被執行的時候存在,存儲在棧內存中。當方法調用完,或者語句結束后,就自動釋放。
(3)初始值
成員變量:有默認初始值。
局部變量:沒有默認初始值,使用前必須賦值。
28、關鍵字private
封裝在代碼中的體現
私有的意思,權限修飾符
用來修飾成員變量和成員函數
用private修飾的成員只在本類中有效
私有是封裝的一種體現
29、構造方法的特點、作用、注意
(1)方法名與類名相同
(2)沒有返回類型
(3)沒有返回值
作用
構造函數是用于創建對象,并對其進行初始化賦值,對象一建立就自動調用相對應的構造函數
注意事項
如果一個自定義類沒有構造方法,系統會默認給出一個無參構造方法。
如果一個自定義類提供了構造方法,那么,系統將不再給出無參構造方法。
這個時候,你可以不使用無參構造方法。如果你想使用,那么,就必須手動給出無參構造方法。
建議:一般情況下,我們的自定義類都要手動給出無參構造方法。
30、構造方法和成員方法的區別
(1)格式區別
構造方法和類名相同,并且沒有返回類型,也沒有返回值。
普通成員方法可以任意起名,必須有返回類型,可以沒有返回值。
(2)作用區別
構造方法用于創建對象,并進行初始化值。
普通成員方法是用于完成特定功能的。
(3)調用區別
構造方法是在創建對象時被調用的,一個對象建立,只調用一次相應構造函數
普通成員方法是由創建好的對象調用,可以調用多次
31、匿名內部類
前提:繼承一個類或者實現一個接口
格式:
什么時候定義匿名內部類?
匿名內部類只是為了簡化書寫,匿名內部類有局限,通常定義匿名內部類時,該類方法不超過3個
匿名內部類的好處和弊端:
好處:
簡化代碼書寫
弊端:
(1)不能直接調用自己的特有方法
(2)不能執行強轉換動作
(3)如果該類里面方法較多,不允許使用匿名內部類
32、為什么函數不能根據返回類型來區分重載?
因為調用時不能指定類型信息,編譯器不知道你要調用哪個函數。
當調用 max(1, 2);時無法確定調用的是哪個,單從這一點上來說,僅返回值類型不同的重載是不應該允許的。
再比如對下面這兩個方法來說,雖然它們有同樣的名字和自變量,但其實是很容易區分的:
若編譯器可根據上下文(語境)明確判斷出含義,比如在 int x=f()中,那么這樣做完全沒有問題。然而,我們也可能調用一個方法,同時忽略返回值;我們通常把這稱為“為它的副作用去調用一個方法” ,因為我們關心的不是返回值,而是方法調用的其他效果。所以假如我們像下面這樣調用方法: f(); Java 怎樣判斷 f()的具體調用方式呢?而且別人如何識別并理解代碼呢?由于存在這一類的問題,所以不能。
函數的返回值只是作為函數運行之后的一個“狀態”,他是保持方法的調用者與被調用者進行通信的關鍵。并不能作為某個方法的“標識”。
33、抽象類和接口的區別
抽象類(abstract class)、接口(interface)
(1)不同:
抽象類:
抽象類中可以定義構造器
可以有抽象方法和具體方法
接口中的成員全都是 public 的
抽象類中可以定義成員變量
有抽象方法的類必須被聲明為抽象類,而抽象類未必要有抽象方法
抽象類中可以包含靜態方法
一個類只能繼承一個抽象類
接口:
接口中不能定義構造器
方法全部都是抽象方法
抽象類中的成員可以是 private、默認、 protected、 public
接口中定義的成員變量實際上都是常量
接口中不能有靜態方法
一個類可以實現多個接口
(2)相同:
不能夠實例化
可以將抽象類和接口類型作為引用類型
一個類如果繼承了某個抽象類或者實現了某個接口都需要對其中的抽象方法全部進行實現,否則該類仍然需要被聲明為抽象類
34、抽象的(abstract)方法是否可....
抽象的(abstract)方法是否可同時是靜態的(static), 是否可同時是本地方法(native),是否可同時被 synchronized
都不能。抽象方法需要子類重寫,而靜態的方法是無法被重寫的,因此二者是矛盾的。本地方法是由本地代碼(如 C 代碼)實現的方法,而抽象方法是沒有實現的,也是矛盾的。 synchronized 和方法的實現細節有關,抽象方法不涉及實現細節,因此也是相互矛盾的。
35、實現多態的機制是什么?
靠的是父類或接口定義的引用變量可以指向子類或具體實現類的實例對象,而程序調用的方法在運行期才動態綁定,就是引用變量所指向的具體實例對象的方法,也就是內存里正在運行的那個對象的方法,而不是引用變量的類型中定義的方法。
36、Person p = new Person();在內存中做了哪些事情?
將Person.class文件加載進內存中。
如果p定義在主方法中,那么,就會在棧空間開辟一個變量空間p。
在堆內存給對象分配空間。
對對象中的成員進行默認初始化。
對對象中的成員進行顯示初始化。
調用構造代碼塊對對象進行初始化。(如果沒有就不執行)
調用構造方法對對象進行初始化。對象初始化完畢。
將對象的內存地址賦值給p變量,讓p變量指向該對象。
37、靜態變量和成員變量的區別
(1)調用方式
靜態變量也稱為類變量,可以直接通過類名調用。也可以通過對象名調用。
這個變量屬于類。
成員變量也稱為實例變量,只能通過對象名調用。這個變量屬于對象。
(2)存儲位置
靜態變量存儲在方法區長中的靜態區。
成員變量存儲在堆內存。
(3)生命周期
靜態變量隨著類的加載而存在,隨著類的消失而消失。生命周期長。
成員變量隨著對象的創建而存在,隨著對象的消失而消失。
(4)與對象的相關性
靜態變量是所有對象共享的數據。
成員變量是每個對象所特有的數據。
38、靜態變量和實例變量的區別?
靜態變量屬于類,實例變量依存于某一實例
靜態變量: 是被 static 修飾符修飾的變量,也稱為類變量,它屬于類,不屬于類的任何一個對象,一個類不管創建多少個對象,靜態變量在內存中有且僅有一個拷貝;
實例變量: 必須依存于某一實例,需要先創建對象然后通過對象才能訪問到它。靜態變量可以實現讓多個對象共享內存。
39、靜態的優點和弊端
優點:
對對象的共享數據進行單獨空間的存儲,節省內存,沒有必要每個對象都存儲一份
可直接被類名調用
弊端:
生命周期過長,隨著類的消失而消失
訪問出現權限,即靜態雖好但只能訪問靜態
40、什么使用使用靜態?
當所有對象共享某個數據的時候,就把這個成員變量定義為靜態修飾的。
當某個方法沒有訪問該類中的非靜態成員,就可以把這個方法定義為靜態修飾。
靜態的生命周期比較長,所以一般不推薦使用。
41、break 和 continue 的區別?
break 和 continue 都是用來控制循環的語句。
break 用于完全結束一個循環,跳出循環體執行循環后面的語句。
continue 用于跳過本次循環,執行下次循環。
42、單例設計模式
(1)設計模式:解決某類問題行之有效的方法,是一種思想,是規律的總結
(2)用來保證某個類在內存中只有一個對象
(3)保證唯一性的思想及步驟
1)為了避免其他程序建立該類對象,先禁止其他程序建立該類對象,即將構造函數私有化
2)為了其他程序訪問到該類對象,須在本類中創建一個該類私有對象
3)為了方便其他程序訪問到該類對象,可對外提供一個公共訪問方式
比如API中的Runtime類就是單例設計模式。
4)單例設計模式的兩種方式
餓漢式 當類加載的時候,就創建對象。
實例:
懶漢式 當使用的時候,才去創建對象。
實例:
餓漢式和懶漢式的區別:
餓漢式是類一加載進內存就創建好了對象;
懶漢式則是類才加載進內存的時候,對象還沒有存在,只有調用了getInstance()方法時,對象才開始創建。
懶漢式是延遲加載,如果多個線程同時操作懶漢式時就有可能出現線程安全問題,可以加同步來解決線程安全問題。但是加了同步之后,每一次都要比較鎖,效率就變慢了,所以可以加雙重判斷來提高程序效率。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習