小猫的java基础知识点汇总(上)
1、一個(gè)".java"源文件中是否可以包括多個(gè)類(不是內(nèi)部類)?有什么限制?
可以有多個(gè)類,但只能有一個(gè)public的類,并且public的類名必須與文件名相一致。
2、short s1= 1; s1= s1+1;?有沒有錯(cuò)?
s1+1運(yùn)算時(shí)會(huì)自動(dòng)提升類型,結(jié)果是int,賦值給s1時(shí),將報(bào)告需要強(qiáng)轉(zhuǎn)類型的錯(cuò)誤。
3、short s1= 1; s1 += 1;有沒有錯(cuò)?
+=是java規(guī)定的運(yùn)算符,編譯器會(huì)對(duì)它進(jìn)行特殊處理,因此可以正確編譯。
4、使用final關(guān)鍵字修飾一個(gè)變量時(shí),引用的內(nèi)容一定不能變?
使用final修飾變量時(shí),是引用變量(也就是地址)不能變,引用變量所指向的對(duì)象中的內(nèi)容還是可以改變的
5、是否可以從static方法內(nèi)對(duì)非static方法調(diào)用?為什么?
????????不可以。因?yàn)榉莝tatic方法是與對(duì)象關(guān)聯(lián)的,必須創(chuàng)建一個(gè)對(duì)象,才可以在該對(duì)象上進(jìn)行方法調(diào)用(對(duì)象.方法)。而static方法調(diào)用時(shí)不需要?jiǎng)?chuàng)建對(duì)象,可以直接調(diào)用。如果從一個(gè)static方法中發(fā)出對(duì)非static方法的調(diào)用,那個(gè)非static方法是關(guān)聯(lián)到哪個(gè)對(duì)象上的呢?這個(gè)邏輯無法成立。
6、Overload和Override的區(qū)別?
重載Overload表示同一個(gè)類中可以有多個(gè)名稱相同的方法,但這些方法的參數(shù)列表各不相同(即參數(shù)個(gè)數(shù)或類型不同)。
重寫Override表示子類中的方法可以與父類中的方法的名稱和參數(shù)完全相同,子類對(duì)象調(diào)用這個(gè)方法時(shí),將調(diào)用子類中的定義方法,這就把父類中的方法覆蓋了,這也是面向?qū)ο缶幊痰亩鄳B(tài)性的一種表現(xiàn)。
7、Overloaded的方法是否可以改變返回值的類型?
如果幾個(gè)重載Overloaded的方法的參數(shù)列表不一樣,它們的返回者類型當(dāng)然也可以不一樣。
如果兩個(gè)方法的參數(shù)列表完全一樣,不管返回值是否相同,都不允許。因?yàn)闊o法確定編程者倒底是想調(diào)用哪個(gè)方法了,因?yàn)樗麄儽徽{(diào)用時(shí)看起來完全相同。
8、接口是否可繼承接口?抽象類是否可實(shí)現(xiàn)(implements)接口?抽象類是否可繼承具體類(concreteclass)?抽象類中是否可以有靜態(tài)的main方法?
????????接口可以繼承接口。抽象類可以實(shí)現(xiàn)(implements)接口,抽象類可以繼承具體類。抽象類中可以有靜態(tài)的main方法。
????????記住抽象類與普通類的唯一區(qū)別就是不能創(chuàng)建實(shí)例對(duì)象和允許有abstract方法。
9、Java中實(shí)現(xiàn)多態(tài)的機(jī)制是什么?
????????靠的是父類(或接口定義)的引用變量可以指向子類(或具體實(shí)現(xiàn)類)的實(shí)例對(duì)象。
而程序調(diào)用的方法在運(yùn)行期才動(dòng)態(tài)綁定,就是引用變量所指向的具體實(shí)例對(duì)象的方法,而不是引用變量的類型中定義的方法。
10、abstractclass和interface有什么區(qū)別?
抽象類可以有構(gòu)造方法,接口中不能有構(gòu)造方法。
抽象類中可以有普通成員變量,接口中沒有普通成員變量
抽象類中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的普通方法。
抽象類中的抽象方法類型可以是public,protected,接口中的抽象方法只能是public類型的,并且默認(rèn)為public abstract。
7. 一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,但只能繼承一個(gè)抽象類。
11、String s = "Hello";s = s + "world!";執(zhí)行后,原始的String對(duì)象中的內(nèi)容變了沒有?
????????沒有。因?yàn)镾tring被設(shè)計(jì)成不可變類,所以它的所有對(duì)象都是不可變對(duì)象。只是s不再指向舊的對(duì)象了。
12、下面這條語句一共創(chuàng)建了多少個(gè)對(duì)象:String s="a"+"b"+"c"+"d";
javac編譯可以對(duì)字符串常量直接相加的表達(dá)式進(jìn)行優(yōu)化直接得出答案,不必要等到運(yùn)行期再去進(jìn)行加法運(yùn)算處理
這行代碼被編譯器在編譯時(shí)優(yōu)化后,相當(dāng)于直接定義了一個(gè)”abcd”的字符串,所以,上面的代碼應(yīng)該只創(chuàng)建了一個(gè)String對(duì)象。
13、final, finally, finalize的區(qū)別。
????????final 用于聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
????????finally是異常處理語句結(jié)構(gòu)的一部分,表示總是執(zhí)行。
????????finalize是Object類的一個(gè)方法,在垃圾收集器執(zhí)行的時(shí)候會(huì)調(diào)用被回收對(duì)象的此方法.
14、error和exception有什么區(qū)別?
????????error 表示恢復(fù)不是不可能但很困難的情況下的一種嚴(yán)重問題。比如說內(nèi)存溢出。不可能指望程序能處理這樣的情況。? ? ? ? ? ? ? ? ? exception表示程序還能夠克服和恢復(fù)的問題
15、Java 中堆和棧區(qū)別?
棧常用于保存方法幀和局部變量,而對(duì)象總是在堆上分配。
棧通常都比堆小,也不會(huì)在多個(gè)線程之間共享,而堆被整個(gè) JVM 的所有線程共享。
????????棧:在函數(shù)中定義的一些基本類型的變量和對(duì)象的引用變量都是在函數(shù)的棧內(nèi)存中分配,當(dāng)在一段代碼塊定義一個(gè)變量時(shí),Java 就在棧中為這個(gè)變量分配內(nèi)存空間,當(dāng)超過變量的作用域后,Java 會(huì)自動(dòng)釋放掉為該變量分配的內(nèi)存空間,該內(nèi)存空間可以立即被另作它用。
????????堆:堆內(nèi)存用來存放由 new 創(chuàng)建的對(duì)象和數(shù)組,在堆中分配的內(nèi)存,由 Java 虛擬機(jī)的自動(dòng)垃圾回收器來管理。
16、能將 int 強(qiáng)制轉(zhuǎn)換為 byte 類型的變量嗎?(引申到所有大類型轉(zhuǎn)小類型)
? ? ? ? 實(shí)際中,我們可以做強(qiáng)制轉(zhuǎn)換,不會(huì)報(bào)錯(cuò)。
但是存在大類型轉(zhuǎn)小類型的通病: int 是 32 位的,而 byte 是 8 位的,如果強(qiáng)制轉(zhuǎn)化,int 類型的高 24 位將會(huì)被丟棄,所以盡量不要這樣做。
17、hashCode有什么用?與 a.equals(b) 有什么關(guān)系?
????????hashCode方法對(duì)應(yīng)對(duì)象的 hash 值。它常用于基于 hash 的集合類,如 Hashtable、HashMap、LinkedHashMap等等。根? ? ? ? ? ? 據(jù) Java 規(guī)范,兩個(gè)使用 equal() 方法來判斷相等的對(duì)象,必須具有相同的 hash code。
18、垃圾回收的優(yōu)點(diǎn)和原理。
????????垃圾回收可以有效的防止內(nèi)存泄露,有效的使用可以使用的內(nèi)存。垃圾回收器通常是作為一個(gè)單獨(dú)的低級(jí)別的線程運(yùn)行,不可預(yù)知的情況下對(duì)內(nèi)存堆中已經(jīng)死亡的或者長時(shí)間沒有使用的對(duì)象進(jìn)行清除和回收,程序員不能實(shí)時(shí)的調(diào)用垃圾回收器對(duì)某個(gè)對(duì)象或所有對(duì)象進(jìn)行垃圾回收。回收機(jī)制有分代復(fù)制垃圾回收和標(biāo)記垃圾回收,增量垃圾回收。
原理:可以給對(duì)象添加一個(gè)被引用的計(jì)數(shù)器,就可以判斷是否已經(jīng)是無引用對(duì)象。但是難以解決循環(huán)引用問題。
如果不下小心直接把 Obj1-reference 和 Obj2-reference 置 null。則在 Java 堆當(dāng)中的兩塊內(nèi)存依然保持著互相引用無法回收。
可達(dá)性分析法:通過一系列的 ‘GC Roots’ 的對(duì)象作為起始點(diǎn),從這些節(jié)點(diǎn)出發(fā)所走過的路徑稱為引用鏈。當(dāng)一個(gè)對(duì)象到 GC Roots 沒有任何引用鏈相連的時(shí)候說明對(duì)象不可用。?
19,java中會(huì)存在內(nèi)存泄漏嗎
內(nèi)存泄漏:指一個(gè)不再被程序使用的對(duì)象或變量一直被占據(jù)在內(nèi)存中。java中有垃圾回收機(jī)制,它可以保證當(dāng)對(duì)象不再被引用的時(shí)候,對(duì)象將自動(dòng)被垃圾回收器從內(nèi)存中清除掉。
????????由于Java使用有向圖的方式進(jìn)行垃圾回收管理,可以消除引用循環(huán)的問題,例如有兩個(gè)對(duì)象,相互引用,只要它們和根進(jìn)程不可達(dá),那么GC也是可以回收它們的。
java中的內(nèi)存泄露的情況:長生命周期的對(duì)象持有短生命周期對(duì)象的引用就很可能發(fā)生內(nèi)存泄露.
盡管短生命周期對(duì)象已經(jīng)不再需要,但是因?yàn)殚L生命周期對(duì)象持有它的引用而導(dǎo)致不能被回收,這就是java中內(nèi)存泄露的發(fā)生場(chǎng)景。通俗地說,就是程序員可能創(chuàng)建了一個(gè)對(duì)象,以后一直不再使用這個(gè)對(duì)象,這個(gè)對(duì)象卻一直被引用,即這個(gè)對(duì)象無用但是卻無法被垃圾回收器回收的,這就是java中可能出現(xiàn)內(nèi)存泄露的情況,例如,緩存系統(tǒng),我們加載了一個(gè)對(duì)象放在緩存中(例如放在一個(gè)全局map對(duì)象中),然后一直不再使用它,這個(gè)對(duì)象一直被緩存引用,但卻不再被使用。
?
總結(jié)
以上是生活随笔為你收集整理的小猫的java基础知识点汇总(上)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode57. 插入区间
- 下一篇: leetcode414. 第三大的数