Java基礎常見問題總結 阿新 • • 發佈:2019-01-29 二、Java基礎部分 1、java中有哪些基本型別? bbyte、short、int、long、float、double、char、boolean 2、java為什麼能夠跨平臺執行? 因為Java程式編譯之後的程式碼不是能被硬體系統直接執行的程式碼,而是一種“中間碼”——位元組碼。然後不同的硬體平臺上安裝有不同的Java虛擬機器(JVM),由JVM來把位元組碼再“翻譯”成所對應的硬體平臺能夠執行的程式碼。因此對於Java程式設計者來說,不需要考慮硬體平臺是什麼。所以Java可以跨平臺。 3、String是基本資料型別嗎?我可不可以寫個類繼承於String? 不是,Strng是引用型別;String是final的類,是不可以被繼承的。 4、談談&和&&的區別? &和&&都可以用作邏輯與的運算子,表示邏輯與(and),當運算子兩邊的表示式的結果都為true時,整個運算結果才為true,否則,只要有一方為false,則結果為false。 &&還具有短路的功能,即如果第一個表示式為false,則不再計算第二個表示式。 &還可以用作位運算子,當&操作符兩邊的表示式不是boolean型別時,&表示按位與操作.。 5、Switch語句裡面的條件可不可以是byte、long、String?使用時候還應注意什麼? switch裡面的條件必須是能隱式的轉化成為Int的故long和String不行,byte可以;使用Switch時候還應注意它的穿透,即每個case後要跟break; 6、short s1=1;s1=s1+1;有什麼錯?short s1 = 1;s1+=1 有什麼錯? 對於short s1 = 1; s1 = s1 + 1; 由於s1+1運算時會自動提升表示式的型別,所以結果是int型,再賦值給short型別s1時,編譯器將報告需要強制轉換型別的錯誤。 對於short s1 = 1; s1 += 1;由於 += 是java語言規定的運算子,java編譯器會對它進行特殊處理,因此可以正確編譯。 7、char為什麼能存貯一個漢字? char型變數是用來儲存Unicode編碼的字元的,unicode編碼字符集中包含了全世界所 有的字型。 8、用最效率的辦法算出2乘以8等於幾 2<<3 位移運算是最底層的運算,他直接操作的是二進位制,故效率最快。 9、final修飾變數時,該變數是物件時,物件的值可不可以改變? final修飾的變數指的是引用不可變,物件的值是可以改變的。 10、靜態變數和例項變數的區別? 靜態變數也稱為類變數,歸全類共有,它不依賴於某個物件,可通過類名直接訪問;而例項變數必須依存於某一例項,只能通過物件才能訪問到它。 11、面向物件的基本特徵是什麼? 1)抽象:抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象並不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面,一是過程抽象,二是資料抽象。 2)繼承:子類擁有父類一切非私有的屬性和方法。 3)封裝:封裝是把過程和資料包圍封裝起來,對資料的訪問只能通過已定義的介面。面向物件計算始於這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝 的物件,這些物件通過一個受保護的介面訪問其他物件。 4)多型性:同一種事物的不同種表現形式。 什麼是類,什麼是物件? 類:基於相同屬性和行為一系列的事物 是物件的模板 物件 :客觀存在 類的具體例項 12、作用域public,private,protected,以及不寫時的區別? 作用域 當前類 同包 子孫類 其他 public √ √ √ √ protected √ √ √ × default √ √ × × private √ × × × 不寫時預設為default。 13、Overload和Override的區別。 (Overload)過載:發生在同一個類之中,方法名相同、引數列表不同,與返回值無關、與final無關、與修飾符無關、與異常無關。 (Override)重寫:發生在子類和父類之間,方法名相同、引數列表相同、返回值相同、不能是final的方法、重寫的方法不能有比父類方法更為嚴格的修飾符許可權、重寫的方法所丟擲的異常不能比父類的更大。 如果父類私有的方法,子類擁有方法簽名相同的方法,子類不屬於重寫父類的方法,該方法屬於子類的新方法。 14、構造器可不可以被過載或重寫? 構造器不能被繼承,故不能被重寫、但可以被過載。 15、Java中有沒有多繼承? java中沒有多繼承,但是可以多實現,即一個類實現多個介面。 雖然沒有多繼承,但是java中介面可以近似的實現多繼承,那就是介面;介面和介面之間可以進行多繼承。 16、抽象類和介面的區別? 1)抽象類繼承與object,介面不繼承object. 2)抽象類有構造器,介面中沒有構造器。 3)抽象類中可以有普通成員變數和常量,介面中只能有常量,而且只能是public static final 不寫預設。 4)抽象類中可以有抽象方法,也可以由普通的方法,介面中只能有抽象的方法而且修飾符只能是public abstract 不寫預設。 5)抽象類中可以有final的方法,介面中不能有final的方法。 6)抽象類只能是單繼承,多實現,介面是可以多繼承其他介面,但是不能實現介面,和不能繼承其他類。 7)抽象類中可以有靜態的方法,介面中不可以。 17、java中實現多型的機制是什麼? 重寫、過載、父類的宣告指向子類的物件。 18、int和integer的區別? int是java的基本資料型別,integer是1.4版本後提供的基本型別包裝類,當兩者作為成員變數時,初始值分別為;int是0;integer是null;其中integer提供了一些對整數操作的方法,還定義了integer型數值的最值,其他基本型別也有對應的包裝類,基本型別包裝類的出現,使得java完全面向物件. 19、String和StringBuffer的區別?StringBuffer和StringBuilder區別? String是不可變的,對String類的任何改變都會返回一個新的String 物件。 StringBuffer是可變的,對StringBuffer中的內容修改都是當前這個物件。 String重寫了equals方法和hashCode方法,StringBuffer沒有重寫equals方法。String是final的類。StringBuffer不是。 String建立的字串是在常量池中,建立的變數初始化一次,如果再對該字串改變會產生新的字串地址值,StringBuffer是在堆中建立物件,當對字串改變時不會產生新的字串地址值,如果對字串進行頻繁修改的話建議使用StringBuffer,以節省記憶體。 StringBuffer和StringBuilder,StringBuffer是執行緒安全的,StringBulider是執行緒不安全的。當不考慮併發問題時候,請使用StringBulider。 20、String s=new String(“xyz”);建立了幾個String Object? 兩個物件,一個是"xyx",一個是指向"xyx"的引用物件s。 21、陣列中有沒有length()方法,String中有沒有length()方法? 陣列中沒有length()方法,但是有length屬性,String中有length()方法 22、try {}裡有一個return語句,那麼緊跟在這個try後的finally {}裡的code會不會被執行,什麼時候被執行,在return前還是後? 這道題很有爭議,我是通過debug模式分為兩種情況進行測試的. 1)finally中沒有return時候: 會先執行try裡面的,return會執行但是沒有真正的return此時去執行了finally裡面的,然後再返回來執行return. 2)finally中有return時候(其實這種情況不符合程式設計規範,會報黃線警告): 會先執行try裡面的,return會執行但是沒有真正的return此時去執行了finally裡面的,然後執行finally裡面的return,直接返回。 23、final, finally, finalize的區別。 final 用於宣告屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。 內部類要訪問區域性變數,區域性變數必須定義成final型別。 finally是異常處理語句結構的一部分,表示總是執行。 finalize是Object類的一個方法,在垃圾收集器執行的時候會呼叫被回收物件的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉檔案等。JVM不保證此方法總被呼叫 24、‘==’和equals的區別? 需要分情況,基本資料型別和引用型別 ‘==’比較的是兩個變數的內容和在記憶體中的地址值是否全部相等,如果要比較兩個基本資料型別那必須用’==’ equals如果沒有重寫,則和’==’的意義一樣,如果重寫了,則會會按照重寫的內容進行比較,javaBean規定當重寫equals時候必須重寫hashCode,如果不重寫會出現物件相同但是hashCode不同,這樣會出現問題,eg:HashSet儲存元素時候是按照hashCode,如果重寫equals不重寫hashCode會導致同一個物件,儲存了兩次。 25、error和exception有什麼區別? 異常與錯誤的區別 異常是程式設計師設計和實現 程式時出現的問題,是可以避免的,可以被程式設計師捕獲,錯誤是硬體等方面的問題,無法被捕獲的 26、heap和stack有什麼區別。 java的記憶體分為兩類,一類是棧記憶體,一類是堆記憶體。棧記憶體是指程式進入一個方法時,會為這個方法單獨分配一塊私屬儲存空間,用於儲存這個方法內部的區域性變數,當這個方法結束時,分配給這個方法的棧會釋放,這個棧中的變數也將隨之釋放。 堆是與棧作用不同的記憶體,一般用於存放不放在當前方法棧中的那些資料,例如,使用new建立的物件都放在堆裡,所以,它不會隨方法的結束而消失。方法中的區域性變數使用final修飾後,放在堆中,而不是棧中。 27、GC是什麼? 為什麼要有GC? GC是垃圾收集的意思(Gabage Collection),記憶體處理是程式設計人員容易出現問題的地方,忘記或者錯誤的記憶體回收會導致程式或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測物件是否超過作用域從而達到自動回收記憶體的目的,Java語言沒有提供釋放已分配記憶體的顯示操作方法。 28、什麼是內部類?分為哪幾種? 內部類是指在一個外部類的內部再定義一個類。內部類作為外部類的一個成員,並且依附於外部類而存在的。內部類可為靜態,可用protected和private修飾(而外部類只能使用public和預設的包訪問許可權)。 內部類主要有以下幾類:成員內部類、區域性內部類、靜態內部類、匿名內部類。 29、為什麼需要內部類? 典型的情況是,內部類繼承自某個類或實現某個介面,內部類的程式碼操作建立其的外圍類的物件。所以你可以認為內部類提供了某種進入其外圍類的視窗。 使用內部類最吸引人的原因是:每個內部類都能獨立地繼承自一個(介面的)實現,所以無論外圍類是否已經繼承了某個(介面的)實現,對於內部類都沒有影響。如果沒有內部類提供的可以繼承多個具體的或抽象的類的能力,一些設計與程式設計問題就很難解決。從這個角度看,內部類使得多重繼承的解決方案變得完整。介面解決了部分問題,而內部類有效地實現了“多重繼承”。 30、內部類可以引用它的包含類的成員嗎?有沒有什麼限制? 完全可以。如果不是靜態內部類,那沒有什麼限制!fd 如果你把靜態巢狀類當作內部類的一種特例,那在這種情況下不可以訪問外部類的普通成員變數,而只能訪問外部類中的靜態成員,例如,下面的程式碼: class Outer { static int x; static class Inner { void test() { syso(x); } } } 答題時,也要能察言觀色,揣摩提問者的心思,顯然人家希望你說的是靜態內部類不能訪問外部類的成員,但你一上來就頂牛,這不好,要先順著人家,讓人家滿意,然後再說特殊情況,讓人家吃驚。 31、Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(介面)? 可以繼承其他類或實現其他介面。不僅是可以,而是必須! 32、使用java命令檢視java虛擬機器版本 java –version 33、數字轉字元有多少種方式,分別是什麼 1)String.valueOf() 2)"" + 數字 3)Integer.toString() 34、Java建立物件有幾種方式 1)new關鍵字 2)反射 3)克隆 4)反序列化 35、寫一個反序列化例項 2.序列化與反序列化 物件流 讀寫物件的 序列化 反序列化 ObjectInputStream 反序列化 ObjectOutputStream 序列化 序列化 ->就是把物件寫入到檔案中去儲存 反序列化->就是把檔案中的物件讀取到記憶體中去 java.io.Serializable 介面 可序化介面 一個物件要實現 序列化與反序列化這個物件的類就必須實現Serializable 介面 序列化只能對類的成員屬性,不能對類的static成員進行 eg:將person物件寫入到檔案中,然後從檔案中讀取物件到記憶體中去 public static void main(String[] args) { try { Person p = new Person(1, "張三丰", "男"); ObjectOutputStream objOut = new ObjectOutputStream( new FileOutputStream(new File("E:\\培訓\\java\\object.txt"))); objOut.writeObject(p); objOut.flush(); objOut.close(); } catch (Exception e) { e.printStackTrace(); } try { ObjectInputStream inObj = new ObjectInputStream( new FileInputStream(new File("E:\\培訓\\java\\object.txt"))); Person person = (Person) inObj.readObject(); System.out.println(person); System.out.println(person.num);// } catch (Exception e) { e.printStackTrace(); }