標籤:images 集中 equals main方法 通過 字串常量 png log 情況
1、一個".java"源檔案中是否可以包括多個類(不是內部類)?有什麼限制?可以有多個類,但只能有一個public的類,並且public的類名必須與檔案名稱相一致。 2、說說&和&&的區別。&和&&都可以用作邏輯與的運算子,表示邏輯與(and),當運算子兩邊的運算式的結果都為true時,整個運算結果才為true,否則,只要有一方為false,則結果為false。&&還具有短路的功能,即如果第一個運算式為false,則不再計算第二個運算式,例如,對於if(str != null&& !str.equals(“”))運算式,當str為null時,後面的運算式不會執行,所以不會出現NullPointerException如果將&&改為&,則會拋出NullPointerException異常。If(x==33 &++y>0) y會增長,If(x==33 && ++y>0)不會增長&還可以用作位元運算符,當&操作符兩邊的運算式不是boolean類型時,&表示按位與操作,我們通常使用0x0f來與一個整數進行&運算,來擷取該整數的最低4個bit位,例如,0x31 & 0x0f的結果為0x01。 3、在JAVA中如何跳出當前的多重嵌套迴圈?在Java中,要想跳出多重迴圈,可以在外面的迴圈語句前定義一個標號,然後在裡層迴圈體的代碼中使用帶有標號的break語句,即可跳出外層迴圈。例如:
1 ok:2 for(int i=0;i<10;i++) {3 for(int j=0;j<10;j++) {4 System.out.println(“i=” + i + “,j=” + j);5 if(j == 5) break ok;6 }7 }View Code4、switch語句能否作用在byte上,能否作用在long上,能否作用在String上?在switch(expr1)中,expr1隻能是一個整數運算式或者枚舉常量(更大字型),整數運算式可以是int基本類型或Integer封裝類型,由於byte,short,char都可以隱含轉換為int,所以,這些類型以及這些類型的封裝類型也是可以的。顯然,long和String類型都不符合switch的文法規定,並且不能被隱式轉換成int類型,所以,它們不能作用於swtich語句中。(jdk1.7後string類可以) 5、char型變數中能不能存貯一個中文漢字?為什麼?char型變數是用來儲存Unicode編碼的字元的,unicode編碼字元集中包含了漢字,所以,char型變數中當然可以儲存漢字。不過,如果某個特殊的漢字沒有被包含在unicode編碼字元集中,那麼,這個char型變數中就不能儲存這個特殊漢字。unicode編碼佔用兩個位元組,所以,char類型的變數也是佔用兩個位元組。 6、使用final關鍵字修飾一個變數時,是引用不能變,還是引用的對象不能變?使用final關鍵字修飾一個變數時,是指引用變數不能變,引用變數所指向的對象中的內容還是可以改變的。例如,對於如下語句:final StringBuffer a=new StringBuffer("immutable");執行如下語句將報告編譯期錯誤:a=new StringBuffer("");但是,執行如下語句則可以通過編譯:a.append(" broken!"); 7、靜態變數和執行個體變數的區別?在文法定義上的區別:靜態變數前要加static關鍵字,而執行個體變數前則不加。在程式運行時的區別:執行個體變數屬於某個對象的屬性,必須建立了執行個體對象,其中的執行個體變數才會被分配空間,才能使用這個執行個體變數。靜態變數不屬於某個執行個體對象,而是屬於類,所以也稱為類變數,只要程式載入了類的位元組碼,不用建立任何執行個體對象,靜態變數就會被分配空間,靜態變數就可以被使用了。總之,執行個體變數必須建立對象後才可以通過這個對象來使用,靜態變數則可以直接使用類名來引用。例如,對於下面的程式,無論建立多少個執行個體對象,永遠都只分配了一個staticVar變數,並且每建立一個執行個體對象,這個staticVar就會加1;但是,每建立一個執行個體對象,就會分配一個instanceVar,即可能分配多個instanceVar,並且每個instanceVar的值都只自加了1次。
1 public class VariantTest{2 public static int staticVar = 0;3 public int instanceVar = 0;4 public VariantTest(){5 staticVar++;6 instanceVar++;7 System.out.println(“staticVar=” + staticVar + ”,instanceVar=”+ instanceVar);8 }9 }View Code 8、是否可以從一個static方法內部發出對非static方法的調用?不可以。因為非static方法是要與對象關聯在一起的,必須建立一個對象後,才可以在該對象上進行方法調用,而static方法調用時不需要建立對象,可以直接調用。也就是說,當一個static方法被調用時,可能還沒有建立任何執行個體對象,如果從一個static方法中發出對非static方法的調用,那個非static方法是關聯到哪個對象上的呢?這個邏輯無法成立,所以,一個static方法內部發出對非static方法的調用。 9、Integer與int的區別int是java提供的8種未經處理資料類型之一。Java為每個原始類型提供了封裝類,Integer是java為int提供的封裝類。int的預設值為0,而Integer的預設值為null,即Integer可以區分出未賦值和值為0的區別,int則無法表達出未賦值的情況,例如,要想表達出沒有參加考試和考試成績為0的區別,則只能使用Integer。 10、下面的代碼有什麼不妥之處?if(username.equals(“zxx”){}username可能為NULL,會報null 指標錯誤;改為"zxx".equals(username) 11、介面是否可繼承介面?抽象類別是否可實現(implements)介面?抽象類別是否可繼承具體類(concrete class)?抽象類別中是否可以有靜態main方法?介面可以繼承介面。抽象類別可以實現(implements)介面,抽象類別可以繼承具體類。抽象類別中可以有靜態main方法。 12、寫clone()方法時,通常都有一行代碼,是什嗎?clone 有預設行為,super.clone();因為首先要把父類中的成員複製到位,然後才是複製自己的成員。 13、java中實現多態的機制是什嗎?靠的是父類或介面定義的引用變數可以指向子類或具體實作類別的執行個體對象,而程式調用的方法在運行期才動態綁定,就是引用變數所指向的具體執行個體對象的方法,也就是記憶體裡正在啟動並執行那個對象的方法,而不是引用變數的類型中定義的方法。 14、下面程式的輸出結果是多少?
1 package com.zhang.test; 2 3 import java.util.Date; 4 5 public class Test extends Date{ 6 7 public static void main(String[] args) { 8 new Test().test(); 9 }10 11 public void test(){12 System.out.println(super.getClass().getName());13 System.out.println(super.getClass().getSuperclass().getName());14 }15 }View Code 輸出結果在test方法中,直接調用getClass().getName()方法,返回的是Test類名,由於getClass()在Object類中定義成了final,子類不能覆蓋該方法,所以,在test方法中調用getClass().getName()方法,其實就是在調用從父類繼承的getClass()方法,等效於調用super.getClass().getName()方法,所以,super.getClass().getName()方法返回的也應該是Test。如果想得到父類的名稱,應該用如下代碼:getClass().getSuperClass().getName(); 15、String是最基本的資料類型嗎?基礎資料型別 (Elementary Data Type)包括byte、int、char、long、float、double、boolean和short。java.lang.String類是final類型的,因此不可以繼承這個類、不能修改這個類。為了提高效率節省空間的,我們應該用StringBuffer類 16、String s = "Hello";s = s + " world!";這兩行代碼執行後,原始的String對象中的內容到底變了沒有?沒有。因為String被設計成不可變(immutable)類,所以它的所有對象都是不可變對象。在這段代碼中,s原先指向一個String對象,內容是 "Hello",然後我們對s進行了+操作,那麼s所指向的那個對象是否發生了改變呢?答案是沒有。這時,s不指向原來那個對象了,而指向了另一個 String對象,內容為"Hello world!",原來那個對象還存在於記憶體之中,只是s這個引用變數不再指向它了。通過上面的說明,我們很容易匯出另一個結論,如果經常對字串進行各種各樣的修改,或者說不可預見的修改,那麼使用String來代表字串的話會引起很大的記憶體開銷。因為 String對象建立之後不能再改變,所以對於每一個不同的字串,都需要一個String對象來表示。這時應該考慮使用StringBuffer類,它允許修改,而不是每個不同的字串都要產生一個新的對象。並且,這兩種類的對象轉換十分容易。同時,我們還可以知道,如果要使用內容相同的字串,不必每次都new一個String。例如我們要在構造器中對一個名叫s的String引用變數進行初始化,把它設定為初始值,應當這樣做:public class Demo {private String s;public Demo {s = "Initial Value";}}而非public Demo {s = new String("Initial Value");}後者每次都會調用構造器,產生新對象,效能低下且記憶體開銷大,並且沒有意義,因為String對象不可改變,所以對於內容相同的字串,只要一個String對象來表示就可以了。也就說,多次調用上面的構造器建立多個對象,他們的String類型屬性s都指向同一個對象。上面的結論還基於這樣一個事實:對於字串常量,如果內容相同,Java認為它們代表同一個String對象。而用關鍵字new調用構造器,總是會建立一個新的對象,無論內容是否相同。
Java面試基礎知識(2)