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