1.面向?qū)ο缶幊逃心男┨攸c谷扣?
1.抽象:? ?抽象就是忽略一個主題中與當前目標無關(guān)的那些方面,以便更充分地注意與當前目標有關(guān)的方面捎琐。抽象并不打算了解全部問題会涎,而只是選擇其中的一部分,暫時不用部分細節(jié)瑞凑。比如末秃,我們要設(shè)計一個學(xué)生成績管理系統(tǒng),考察學(xué)生這個對象時籽御,我們只關(guān)心他的班級练慕、學(xué)號惰匙、成績等,而不用去關(guān)心他的身高铃将、體重這些信息项鬼。抽象包括兩個方面,一是過程抽象劲阎,二是數(shù)據(jù)抽象绘盟。過程抽象是指任何一個明確定義功能的操作都可被使用者看作單個的實體看待,盡管這個操作實際上可能由一系列更低級的操作來完成哪工。數(shù)據(jù)抽象定義了數(shù)據(jù)類型和施加于該類型對象上的操作奥此,并限定了對象的值只能通過使用這些操作修改和觀察。
2.繼承:? ?繼承是一種聯(lián)結(jié)類的層次模型雁比,并且允許和鼓勵類的重用叛买,它提供了一種明確表述共性的方法性芬。對象的一個新類可以從現(xiàn)有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性惠奸,新類稱為原始類的派生類(子類)飘痛,而原始類稱為新類的基類(父類)宇整。派生類可以從它的基類那里繼承方法和實例變量晌坤,并且類可以修改或增加新的方法使之更適合特殊的需要。這也體現(xiàn)了大自然中一般與特殊的關(guān)系丈牢。繼承性很好的解決了軟件的可重用性問題祭钉。比如說,所有的Windows應(yīng)用程序都有一個窗口己沛,它們可以看作都是從一個窗口類派生出來的慌核。但是有的應(yīng)用程序用于文字處理,有的應(yīng)用程序用于繪圖申尼,這是由于派生出了不同的子類垮卓,各個子類添加了不同的特性。
3.封裝:? ? 封裝是面向?qū)ο蟮奶卣髦皇δ唬菍ο蠛皖惛拍畹闹饕匦?/b>粟按。封裝是把過程和數(shù)據(jù)包圍起來,對數(shù)據(jù)的訪問只能通過已定義的界面霹粥。面向?qū)ο笥嬎闶加谶@個基本概念灭将,即現(xiàn)實世界可以被描繪成一系列完全自治、封裝的對象后控,這些對象通過一個受保護的接口訪問其他對象宗侦。一旦定義了一個對象的特性,則有必要決定這些特性的可見性忆蚀,即哪些特性對外部世界是可見的矾利,哪些特性用于表示內(nèi)部狀態(tài)。在這個階段定義對象的接口馋袜。通常男旗,應(yīng)禁止直接訪問一個對象的實際表示,而應(yīng)通過操作接口訪問對象欣鳖,這稱為信息隱藏察皇。事實上,信息隱藏是用戶對封裝性的認識泽台,封裝則為信息隱藏提供支持什荣。封裝保證了模塊具有較好的獨立性,使得程序維護修改較為容易怀酷。對應(yīng)用程序的修改僅限于類的內(nèi)部稻爬,因而可以將應(yīng)用程序修改帶來的影響減少到最低限度。
4. 多態(tài):? ?多態(tài)性是指允許不同類的對象對同一消息作出響應(yīng)蜕依。比如同樣的加法桅锄,把兩個時間加在一起和把兩個整數(shù)加在一起肯定完全不同。又比如样眠,同樣的選擇編輯-粘貼操作友瘤,在字處理程序和繪圖程序中有不同的效果。多態(tài)性包括參數(shù)化多態(tài)性和包含多態(tài)性檐束。多態(tài)性語言具有靈活辫秧、抽象、行為共享被丧、代碼共享的優(yōu)勢盟戏,很好的解決了應(yīng)用程序函數(shù)同名問題。
面向?qū)ο蟪绦蛟O(shè)計具有許多優(yōu)點:
1晚碾、開發(fā)時間短抓半,效率高,可靠性高格嘁,所開發(fā)的程序更強壯笛求。由于面向?qū)ο缶幊痰目芍赜眯裕梢栽趹?yīng)用程序中大量采用成熟的類庫糕簿,從而縮短了開發(fā)時間探入。
2、應(yīng)用程序更易于維護懂诗、更新和升級蜂嗽。繼承和封裝使得應(yīng)用程序的修改帶來的影響更加局部化。
2.String和StringBuffer殃恒、StringBuilder的區(qū)別植旧?
1.String:是對象不是原始類型.為不可變對象,一旦被創(chuàng)建,就不能修改它的值.對于已經(jīng)存在的String對象的修改都是重新創(chuàng)建一個新的對象,然后把新的值保存進去.String 是final類,即不能被繼承
2.StringBuffer:是一個可變對象,當對他進行修改的時候不會像String那樣重新建立對象辱揭。它只能通過構(gòu)造函數(shù)來建立對象被建立以后,在內(nèi)存中就會分配內(nèi)存空間,并初始保存一個null.向StringBuffer中付值的時候可以通過它的append方法.線程安全,執(zhí)行速度慢病附。
3.StringBuilder:是一個可變對象问窃。線程不安全,執(zhí)行速度快完沪。
3.Int和Interger有什么區(qū)別域庇?
Java 提供兩種不同的類型:引用類型和原始類型(或內(nèi)置類型);
int 是java 的原始數(shù)據(jù)類型覆积,Integer 是java 為int 提供的封裝類听皿。
Java 為每個原始類型提供了封裝類:
原始類型: boolean,char,byte,short,int,long,float,double
封裝類型:Boolean,Character宽档,Byte尉姨,Short,Integer雌贱,Long啊送,F(xiàn)loat,Double引用類型和原始類型的行為完全不同欣孤,并且它們具有不同的語義馋没。引用類型和原始類型具有不同的特征和用法,它們包括:大小和速度問題降传,這種類型以哪種類型的數(shù)據(jù)結(jié)構(gòu)存儲篷朵,當引用類型和原始類型用作某個類的實例數(shù)據(jù)時所指定的缺省值。對象引用實例變量的缺省值為null婆排,而原始類型實例變量的缺省值與它們的類型有關(guān)声旺。
4.String類能否被繼承?
不能
String類方法頭部是:Public final class String extends Object,之所以不能被繼承是因為有修飾關(guān)鍵字final
final可以修飾類段只、變量和方法腮猖。
final修飾類的時候,這個類就不能被繼承了赞枕,類中的所有方法也就被隱式的變?yōu)榱薴inal方法澈缺;
final修飾變量的時候,相當于常量炕婶,只能被賦值一次姐赡,賦值以后就不能改變,這就表示了final修飾的變量必須初始化柠掂,初始化可以在聲明變量的時候项滑,也可以在構(gòu)造函數(shù)中初始化;
final修飾方法的類可以被繼承涯贞,但是final修飾的方法無法被覆寫枪狂。
5.棧與堆的概念及區(qū)別危喉。
?棧內(nèi)存:棧內(nèi)存首先是一片內(nèi)存區(qū)域,存儲的都是局部變量摘完,凡是定義在方法中的都是局部變量(方法外的是全局變量)姥饰,for循環(huán)內(nèi)部定義的也是局部變量,是先加載函數(shù)才能進行局部變量的定義孝治,所以方法先進棧,然后再定義變量审磁,變量有自己的作用域谈飒,一旦離開作用域,變量就會被釋放态蒂。棧內(nèi)存的更新速度很快杭措,因為局部變量的生命周期都很短。
? ? ?? 堆內(nèi)存:存儲的是數(shù)組和對象(其實數(shù)組就是對象)钾恢,凡是new建立的都是在堆中手素,堆中存放的都是實體(對象),實體用于封裝數(shù)據(jù)瘩蚪,而且是封裝多個(實體的多個屬性)泉懦,如果一個數(shù)據(jù)消失,這個實體也沒有消失疹瘦,還可以用崩哩,所以堆是不會隨時釋放的,但是棧不一樣言沐,棧里存放的都是單個變量邓嘹,變量被釋放了,那就沒有了险胰。堆里的實體雖然不會被釋放汹押,但是會被當成垃圾,Java有垃圾回收機制不定時的收取起便。
6.&與&&的區(qū)別棚贾?
&是位運算符,表示按位與運算缨睡,&&是邏輯運算符鸟悴,表示邏輯與(and)。
7.語句float f=1.3奖年;編譯能否通過细诸?
不能,應(yīng)該用強制類型轉(zhuǎn)換陋守,如下所示:float f=(float)1.3
8.short s1 = 1; s1 = s1 + 1;有什么錯?short s1 = 1; s1 += 1;有什么錯?
第一句有錯震贵,s1=s1+1需要進行強制轉(zhuǎn)換利赋,寫成s1=(short)(s1+1);
第二句沒有錯;
java規(guī)范有這樣的規(guī)則:高位轉(zhuǎn)低位需要強制轉(zhuǎn)換猩系;低位轉(zhuǎn)高位自動轉(zhuǎn)換媚送。
9.java語言中,有沒有g(shù)oto關(guān)鍵字寇甸?
goto是java語言中的保留字塘偎,目前還沒有在java中使用。
其實goto這個詞是C語言中的拿霉,goto語句通常與條件語句配合使用吟秩,可用來實現(xiàn)條件轉(zhuǎn)移, 構(gòu)成循環(huán)绽淘,跳出循環(huán)體等功能涵防。而在結(jié)構(gòu)化程序語言中一般不主張使用goto語句, 以免造成程序流程的混亂沪铭,使理解和調(diào)試程序都產(chǎn)生困難壮池。但是在java語言中,goto這個詞只是作為了保留字杀怠,還沒有使用椰憋。那是因為java語言講究簡單,方便驮肉。
10.數(shù)組有沒有l(wèi)ength()這個方法熏矿?String有沒有l(wèi)ength()這個方法?
數(shù)組沒有l(wèi)ength()這個方法离钝,但有l(wèi)ength這個屬性票编,用來表示數(shù)組的長度;String有l(wèi)ength()這個方法,用來得到字符串的長度卵渴,沒有l(wèi)ength這個屬性慧域。
11.接口與繼承的區(qū)別?
理論上:類只能單繼承浪读,接口可以多繼承(接口應(yīng)該叫實現(xiàn))昔榴;
區(qū)別1:不同的修飾符修飾(interface),(extends)
區(qū)別2:在面向?qū)ο缶幊讨锌梢杂卸嗬^承!但是只支持接口的多繼承,不支持’繼承’的多繼承哦
? ? ? ? ? ?而繼承在java中具有單根性,子類只能繼承一個父類
區(qū)別3:在接口中只能定義全局常量,和抽象方法
? ????????而在繼承中可以定義屬性方法,變量,常量等…
區(qū)別4:某個接口被類實現(xiàn)時,在類中一定要實現(xiàn)接口中的抽象方法
? ? ? ? ? 而繼承想調(diào)用那個方法就調(diào)用那個方法,毫無壓力
你可以有多個干爹(接口),但只能有一個親爹( 繼承)
12.Math.round(11.5)等於多少? Math.round(-11.5)等於多少碘橘?
Math.round(11.5)==12;Math.round(-11.5)==-11;round方法返回與參數(shù)最接近的長整數(shù)互订,參數(shù)加1/2后求其floor。
13.Static Nested Class 和 Inner Class的不同
Nested Class (一般是C++的說法)痘拆,Inner Class (一般是JAVA的說法)仰禽。Java內(nèi)部類與C++嵌套類最大的不同就在于是否有指向外部的引用上。
注: 靜態(tài)內(nèi)部類(Inner Class)意味著
1.創(chuàng)建一個static內(nèi)部類的對象,不需要一個外部類對象吐葵,
2.不能從一個static內(nèi)部類的一個對象訪問一個外部類對象规揪。
14.error和exception有什么區(qū)別?
error 表示恢復(fù)不是不可能但很困難的情況下的一種嚴重問題温峭。比如說內(nèi)存溢出猛铅。不可能指望程序能處理這樣的情況 ;
exception 表示一種設(shè)計或?qū)崿F(xiàn)問題凤藏。也就是說奸忽,它表示如果程序運行正常,從不會發(fā)生的情況揖庄。
15.List, Set, Map是否繼承自Collection接口
List月杉,Set是,Map不是抠艾。
16.接口是否可繼承接口? 抽象類是否可實現(xiàn)(implements)接口? 抽象類是否可繼承實體類(concrete class)
接口可以繼承接口;抽象類可以實現(xiàn)(implements)接口桨昙;抽象類是否可繼承實體類检号,但前提是實體類必須有明確的構(gòu)造函數(shù)。
17.用最有效率的方法算出2乘以8等於幾蛙酪?
2 << 3
表示 2向左移 3位:2 * 2^3(2的3次方) = 2 * 8齐苛;因為一個數(shù)左移 n位,就相當于 2的 n次方桂塞,那么一個數(shù)乘以 8只要將其左移 3位即可凹蜂,而為運算符的效率最高,所以 2乘以 8等于幾的最有效方法是 2<<3阁危。
18.GC是什么? 為什么要有GC玛痊?
GC是垃圾收集的意思(Gabage Collection),內(nèi)存處理是編程人員容易出現(xiàn)問題的地方,忘記或者錯誤的內(nèi)存回收會導(dǎo)致程序或系統(tǒng)的不穩(wěn)定甚至崩潰狂打,Java提供的GC功能可以自動監(jiān)測對象是否超過作用域從而達到自動回收內(nèi)存的目的擂煞,Java語言沒有提供釋放已分配內(nèi)存的顯示操作方法。
19.HashMap與Hashtable區(qū)別趴乡。
1对省、Hashtable比HashMap多提供了elments() 和contains() 兩個方法。HashMap是繼承自AbstractMap類晾捏,而HashTable是繼承自Dictionary類蒿涎。不過它們都實現(xiàn)了同時實現(xiàn)了map、Cloneable(可復(fù)制)惦辛、Serializable(可序列化)這三個接口
2劳秋、Hashtable是線程安全的,它的每個方法中都加入了Synchronize方法。在多線程并發(fā)的環(huán)境下俗批,可以直接使用Hashtable俗或,不需要自己為它的方法實現(xiàn)同步。
3岁忘、HashMap不是線程安全的辛慰,在多線程并發(fā)的環(huán)境下,可能會產(chǎn)生死鎖等問題干像。
雖然HashMap不是線程安全的帅腌,但是它的效率會比Hashtable要好很多。這樣設(shè)計是合理的麻汰。在我們的日常使用當中速客,大部分時間是單線程操作的。HashMap把這部分操作解放出來了五鲫。當需要多線程操作的時候可以使用線程安全的ConcurrentHashMap溺职。ConcurrentHashMap雖然也是線程安全的,但是它的效率比Hashtable要高好多倍位喂。因為ConcurrentHashMap使用了分段鎖浪耘,并不對整個數(shù)據(jù)進行鎖定。
20.ArrayList與LinkList比較塑崖。
ArrayList數(shù)據(jù)結(jié)構(gòu)(數(shù)組結(jié)構(gòu))
LinkList數(shù)據(jù)結(jié)構(gòu)(雙向循環(huán)鏈表結(jié)構(gòu))
結(jié)論:LinkList在增七冲、刪數(shù)據(jù)效率方面要優(yōu)于ArrayList,而ArrayList在改和查方面效率要遠超LinkList
還要說的是规婆,雖然綜合比較之下LinkList的優(yōu)勢要比ArrayList要好澜躺,但是在java中,我們用的比較多的確實ArrayList抒蚜,因為我們的業(yè)務(wù)通常是對數(shù)據(jù)的改和查用的比較多
21.Java中的基本類型和包裝類型區(qū)別掘鄙。
1、包裝類型可以為 null削锰,而基本類型不可以
2通铲、包裝類型可用于泛型,而基本類型不可以
泛型不能使用基本類型器贩,因為使用基本類型時會編譯出錯颅夺。
List list =newArrayList<>();// 提示 Syntax error, insert "Dimensions" to complete ReferenceTypeList list =newArrayList<>(); //這里就不會提示出錯
為什么呢?因為泛型在編譯時會進行類型擦除蛹稍,最后只保留原始類型吧黄,而原始類型只能是 Object 類及其子類——基本類型是個特例。
3唆姐、基本類型比包裝類型更高效
基本類型在棧中直接存儲的具體數(shù)值拗慨,而包裝類型則存儲的是堆中的引用。
4、兩個包裝類型的值可以相同赵抢,但卻不相等
兩個包裝類型的值可以相同剧蹂,但卻不相等——這句話怎么理解呢?來看一段代碼就明明白白了烦却。
Integer chenmo =newInteger(10);
Integer wanger =newInteger(10);
System.out.println(chenmo == wanger);//false
System.out.println(chenmo.equals(wanger ));// true
兩個包裝類型在使用“==”進行判斷的時候宠叼,判斷的是其指向的地址是否相等。chenmo 和 wanger 兩個變量使用了 new 關(guān)鍵字其爵,導(dǎo)致它們在“==”的時候輸出了 false冒冬。
而?chenmo.equals(wanger)?的輸出結(jié)果為 true,是因為 equals 方法內(nèi)部比較的是兩個 int 值是否相等摩渺。
5简烤、自動裝箱和自動拆箱
既然有了基本類型和包裝類型,肯定有些時候要在它們之間進行轉(zhuǎn)換摇幻。把基本類型轉(zhuǎn)換成包裝類型的過程叫做裝箱(boxing)横侦。反之,把包裝類型轉(zhuǎn)換成基本類型的過程叫做拆箱(unboxing)绰姻。
Java SE5 為了減少開發(fā)人員的工作丈咐,提供了自動裝箱與自動拆箱的功能。
Integer chenmo? = 10;// 自動裝箱
int wanger = chenmo;// 自動拆箱
22. == 與 equals 區(qū)別龙宏。
==操作比較的是兩個變量的值是否相等,對于引用型變量表示的是比較兩個變量在棧中存儲的地址是否相同伤疙。而equals操作表示兩個變量是否是對同一個對象的引用银酗,即堆中的內(nèi)容是否相同。簡單說就是徒像,==比較的是棧內(nèi)容(地址是否相同)黍特,equals比較的是堆內(nèi)容(值是否相同)。因此锯蛀,當equals為真時灭衷,==不一定為真。
Integer c =5;
Integer d =5;
Integer e =new Integer(5);
System.out.println(c==d);? ? //true
System.out.println(c.equals(d));? ? ?//true
System.out.println(c==e);? ?//false
System.out.println(c.equals(e));?? ?//true