第一部分 Java的類 1.請解釋Java語言的跨平臺特性。 解析:雖然不知道什么是跨平臺也可以使用Java語言進行編程,但是對于一個Java編程員來說,理解跨平臺特性能夠更深入掌握Java語言,所以企業(yè)中往往要求應(yīng)聘者至少理解這個特性。 參考答案:Java的跨平臺特性也被稱為可移植性、平臺無關(guān)性,或者一次編寫處處運行。他的意思就是如果用Java語言編寫一個應(yīng)用,那么就可以在不同平臺上運行,而不需要為不同平臺單獨運行開發(fā)。之所以能實現(xiàn)跨平臺的特性。主要得益于Java虛擬機(JVM),JVM解釋器在運行Java應(yīng)用時根據(jù)當(dāng)前平臺進行解釋,解釋成符合當(dāng)前平臺規(guī)范的機器碼,所以可以實現(xiàn)同樣的應(yīng)用在不同平臺上都能運行。 2.請列舉JAVA語言的主要特點 解析:了解一門語言,往往從熟悉該語言的主要特點開始入手,所以企業(yè)也常常通過應(yīng)聘者對JAVA語言特點的掌握程度而判斷其語言基礎(chǔ)是否扎實。 參考答案:JAVA語言有很多特點,主要包括①跨平臺性:一個應(yīng)用可以不經(jīng)過修改直接運行到不同的平臺上。②面向?qū)ο螅篔AVA語言是一門面向?qū)γ娴恼Z言,可以使用對象的屬性和行為,可以使用面向?qū)ο蟮乃枷脒M行分析設(shè)計,并實現(xiàn)整個應(yīng)用。③解釋執(zhí)行JAVA應(yīng)用時,JVM中的解釋器將解釋類文件,生成符合當(dāng)前平臺的字節(jié)碼。④自動回收:JAVA應(yīng)用中的垃圾回收是自動進行的,JVM中的后臺線程將監(jiān)視內(nèi)存中數(shù)據(jù)的使用,當(dāng)內(nèi)存中的數(shù)據(jù)不再被引用時,將被作為垃圾回收,而不需要程序員動手回收。 3.請說明一個JAVA類中主要包含哪幾個元素?并說明每種元素的作用。 解析:無論簡單還是復(fù)雜的JAVA應(yīng)用,都是由若干個類組成,所以類是JAVA應(yīng)用的組成單位。了解一個類中包含的主要元素能夠?qū)︻愑幸粋€清晰的認識。一個類中往往會有五種元素,即屬性、方法、構(gòu)造方法、塊以及內(nèi)部類、其實塊和內(nèi)部類比較少見。 參考答案:JAVA類中主要包含屬性、方法、構(gòu)造方法、塊以及內(nèi)部類。屬性用來定義對象的數(shù)據(jù);方法用來定義對象的行為;構(gòu)造方法可以用來創(chuàng)建對象;塊能夠用來在類加載時執(zhí)行操作或者在每次實例化前執(zhí)行通用操作;內(nèi)部類作為類的一個成員存在,能夠訪問外部類的屬性和方法。 4、請說明構(gòu)造方法的作用和特征 解析:類是對象的模板,使用類往往都需要首先對類進行實例化,即創(chuàng)建對象。要創(chuàng)建對象必須使用new關(guān)鍵字調(diào)用構(gòu)造方法(constructor)才能完成,構(gòu)造方法中往往對屬性進行實例化,也可以實現(xiàn)其他必要的功能,如讀取屬性文件等。構(gòu)造方法有獨特的特征:名字必須與類名相同且大小寫敏感,而且構(gòu)造方法不能聲明返回值,這兩個特征缺一不可。使用Eclipse工具時,可以使用菜單Generate Constructor自動生成不同的構(gòu)造方法。 參考答案:構(gòu)造方法的作用是用來創(chuàng)建對象,使用new關(guān)鍵字調(diào)用。構(gòu)造方法的名字必須與類的名字相同,并且大小寫敏感,同時構(gòu)造方法不能聲明返回值類型,可以使用任意一種訪問修飾符,但是不能使用其他修飾符進行修飾,如static、final、abstract等修飾符都可以修飾構(gòu)造方法。 5、什么事方法重載(overload)? 解析:如果一個類的某個行為,會有不同的算法和邏輯,例如,Math類的計算絕對值的方法,既可以計算int類型數(shù)值的絕對值,也可以計算double類型數(shù)值的絕對值。這種情況下,每種類型都定義一個不同的方法名,如abInt、absDouble,那么類的可讀性就較差,使用時,必須熟悉處理每種類型參數(shù)所對應(yīng)的方法名。然而,如果使用同一個方法名,而使用不同的形式參數(shù)來區(qū)別這些方法,那么就具有很好的可讀性,如abs(int i)、abs(double d)等??勺x性強的代碼是企業(yè)對開發(fā)人員的基本要求,方法重載能夠使得代碼有很好的可讀性。 參考答案:方法重載指的是在一個類中可以聲明多個相同名字的方法,而方法的形式參數(shù)有區(qū)別。調(diào)用這些同名的方法時,JVM會根據(jù)實際參數(shù)的不同綁定到不同的方法。 6、請列舉Java語言中的權(quán)限訪問修飾符,并說明每種權(quán)限的含義。 解析:正確使用權(quán)限訪問修飾符,能夠有效控制類以及類成員的安全性,Java語言中有四種訪問修飾符,包括public、同包、protected以及private,一般情況下,應(yīng)用中的類多是public權(quán)限,屬性多是private權(quán)限,方法多是public權(quán)限。 參考答案:Java語言中有四種權(quán)限訪問修飾符,即public、protected、同包以及private,public表示公共權(quán)限,即任何包中都可以訪問:protected表示受保護權(quán)限,即同包中可以訪問,同包中的子類可以訪問:同包權(quán)限是默認權(quán)限,即不顯示指明權(quán)限修飾符的時候就是同包權(quán)限,表示只有同包中可以訪問:private是私有權(quán)限,表示只能在本類中訪問。 7、請列舉Java語言中的八種基本數(shù)據(jù)類型,并說明每種數(shù)據(jù)類型的含義及長度。 解析:數(shù)據(jù)類型在任何一門編程語言中都是很重要的知識點,屬性、方法參數(shù)、方法返回值要指定各自的數(shù)據(jù)類型。Java語言雖然是一門面向?qū)ο蟮恼Z言。但是也定義了基本數(shù)據(jù)類型,基本數(shù)據(jù)類型可以直接賦值,不需要使用new關(guān)鍵字創(chuàng)建,可以直接使用運算符進行運算,編程中經(jīng)常被使用,而且Java語言中的基本數(shù)據(jù)類型的長度固定,不會隨著平臺的不同而不同。 參考答案:Java語言的八種基本數(shù)據(jù)類型有:byte字節(jié)型,8位長度:short短整型,16位長度,int整型,32位長度:long長整型,64位長度:float單精度浮點型。32位長度:double雙精度浮點型,64位長度:char字符型,16位長度:boolean型,表示邏輯值,有true和false兩個值,分別表示真和假 8.什么叫引用類型,引用類型和基本數(shù)據(jù)類型有什么區(qū)別? 解析:很多初級程序員都能夠理解int i=20;中的int是一種類型,稱為整型。而對于類似Employee e=new Employee();這樣表達式中的Employee卻感覺無所適從。其實,任何一個類都是一種類型,如Employee就是一種類型,可以說變量e的類型就是Employee。Java語言中將類的類型稱為引用類型,即reference type??梢哉f,除了八種基本數(shù)據(jù)類型之外的類型都是引用類型,包括API中所有的類、自定義的所有類,也包括數(shù)組。引用類型和基本數(shù)據(jù)類型的直觀區(qū)別就是引用類型的變量需要使用new調(diào)用構(gòu)造方法來賦值,而基本數(shù)據(jù)類型可以直接使用“=”號賦值。但是,引用類型中的String比較特殊,既可以使用new關(guān)鍵字賦值,也可以直接使用“=”賦值,一般情況下都使用“=”直接賦值。 參考答案:Java語言中除了基本數(shù)據(jù)類型之外的類型,都稱為引用類型。引用類型就是類的類型,所有的對象都是引用類型,包括數(shù)組對象。引用類型必須使用new調(diào)用構(gòu)造方法進行賦值,引用類型的變量擁有自己的屬性和方法,可以使用圓點調(diào)用自己的屬性和方法。基本數(shù)據(jù)類型直接使用=號進行賦值,且沒有自己的屬性和方法,往往都在聲明屬性或方法時使用。 9.對于String對象,可以使用“=”賦值,也可以使用new關(guān)鍵字賦值,兩種方式有什么區(qū)別? 解析:String類型是實際工作中經(jīng)常使用到的類型,從數(shù)據(jù)類型上劃分,String是一個引用類型,是API中定義的一個類。所以String類型的對象可以使用new創(chuàng)建,例如String name=new String(“ETC”);為變量name進行賦值,值為“ETC”。然而,String類比起其他類 有些特殊,可以使用“=”直接賦值,如String name=“ETC”,也是為變量name進行賦值,值為“ETC”。這兩種賦值方式是有差別的,使用new賦值,永遠都是創(chuàng)建一個新對象,在新的內(nèi)存空間初始化了字符串的值;而使用“=”賦值,不會每次都初始化新的字符串,而是從一個“字符串實例池”中去查找有沒有要賦值的字符串,如有則直接引用;如不存在,則初始化一個字符串,并放入“字符串實例池”。在實際編程中,往往使用“=”好對String類型變量進行賦值。 參考答案:使用“=”賦值不一定每次都創(chuàng)建一個新的字符串,而是從“字符串實例池”中查找字符串。使用new進行賦值,則每次都創(chuàng)建一個新的字符串。 10.String類是一個“不可變類”,請解釋“不可變類”的含義。 解析:String類是一個不可變類,即immutable類。所謂不可變,意思是當(dāng)一個字符串被初始化后,它的值就不會被改變。例如,String s=new String(“hello”)為將初始化一個值為hello的字符串,如果調(diào)用 s.toUpperCase()看起來是把hello變?yōu)榇髮懙腍ELLO,然而事實上并不會把已有的hello變?yōu)镠ELLO,而是在新的空間初始化一個HELLO字符串。也正因為有這種不可變性,所以才能支持“字符串實例池”的使用。 參考答案:所謂的不可變類,就是當(dāng)字符串初始化后,就不能夠被改變。 11.String類和StringBuffer類有什么區(qū)別? 解析:String類是不可變類,字符串一旦初始化后,就不能被改變。而StringBuffer類是可變類,字符串值可以唄改變。常常在實際應(yīng)用中看到累死這樣的代碼:String s=new(“hello”);s+=”world”,這兩句代碼首先創(chuàng)建一個字符hello,然后將world追加到hello結(jié)尾并重新賦值給變量s。然后,這個過程實際上是這樣的:首先創(chuàng)建一個StringBuffer對象,然后用StringBuffer類的append方法追加字符串,最后對StringBuffer對象調(diào)用toString方法合成字符串返回??梢姡褂?號連接字符串時,本質(zhì)上是使用了可變的StringBuffer類,經(jīng)變動肯定性能效率受到影響,所以建議需要追加字符串時,可以考慮直接使用StringBuffer類。參考答案:String類是不可變類,即字符串值一旦初始化后就不可能改變。StringBuffer是可變字符串類,類似String的緩沖區(qū),可以修改字符串的值。 12.StringBuffer和StringBuilder類有什么區(qū)別? 解析: StringBuffer是JDK5中增加的一個新類,在以前版本中不存在這個類。StringBuilder中的方法和StringBuffer中的方法基本相同,但是StringBuffer是線程安全的,而StringBuilder不是線程安全的,因此在不考慮同步的情況下,StringBuilder有更好的性能。 參考答案:StringBuffer是線程安全的字符串緩沖,而StringBuilder不是線程安全的。 13.包裝器類型包括哪些類,有什么作用? 解析:初級程序員常常對float和Float或者double和Double感到混淆。在Java語言中,有八中基本數(shù)據(jù)類型,即byte、int、long、float、double、char、boolean。對應(yīng)這八種基本數(shù)據(jù)類型,API中定義了八個類,能把這些基本類型轉(zhuǎn)換成引用類型,分別是Byte、Short、Int、Long、Double、Character、Boolean。這八個類被統(tǒng)稱為包裝器類。JDK5之后,包裝器類和基本數(shù)據(jù)類型之間可以直接轉(zhuǎn)換,稱為自動的裝箱拆箱(boxing/unboxing)。例如integer it=3;it++;雖然寫法上可以像使用基本數(shù)據(jù)類型一樣使用包裝器類型,但是本質(zhì)上依**行了類似 it= new Integer(3)的轉(zhuǎn)換,因此,不要輕易使用包裝器類的自動裝箱拆箱,以優(yōu)化的性能。能夠使用基本類型就使用基本類型。 參考答案:包裝類器包括Byte、Short、Integer、Long、Float、Double、Character、Boolean等類,主要用來對byte、short、integer、long、float、double、character、boolean這八種基本數(shù)據(jù)類型進行包裝,使其稱為引用類型。 14.請說明Java語言中的值傳遞規(guī)則。 解析:值傳遞時編寫應(yīng)用時不可避免的操作。例如某方法聲明形式是public void f(int x){},寫方法是,必須為其傳遞一個int類型的實際參數(shù),如f(10)。又如public void g(Employee)。那么使用該方法時,必須為其傳遞一個Employee類型的實際參數(shù),例如g(new Employee())。所以,對于初級程序員來說,了解Java語言的值傳遞規(guī)則非常重要。Java語言是本類型傳遞的值,例如f(10),僅僅把10復(fù)制給形式參數(shù)x,是值的拷貝。而引用類的傳遞時引用,即虛地址,例如g(new Employee())是把實際參數(shù)的虛地址傳遞給形式參數(shù)e,也就是說實際參數(shù)和形式參數(shù)的虛地址相同,物理上是同一個對象。 參考答案:基本數(shù)據(jù)類型傳遞的是值,引用類型傳遞的是引用,即虛地址。 15.使用static修飾屬性或方法后,屬性和方法有什么特征? 解析:static修飾符是一個非常常見并重要的修飾符,稱為靜態(tài)。靜態(tài)不是指值不能改變,很多初級程序員容易容易望文生義的地方。Static常常用來修飾類的屬性或者方法。當(dāng)一個屬性或者方法和對象沒有關(guān)系,或者說是任何對象共享的時候,那么就應(yīng)該用static進行修飾。列如某類中的計數(shù)器,用來計算實例的個數(shù)。那么這個計數(shù)器屬性就是所有對象共享的屬性,就應(yīng)該用static修飾。又例如Math類中的abs(int)方法,用來返回參數(shù)的絕對值,這個方法和Math類的對象沒有關(guān)系,Math類對象可以共享這個方法,那么這個方法就可以用static修飾。程序員必須深入理解static修飾符的使用。 參考答案:static修飾屬性或方法后,屬性和方法不在屬于某個特定的對象,而是所有共享,也可以說是static成員不依賴某個對象,在類加載時就被初始化。Static修飾的屬性或方法,可以直接使用類名調(diào)用,而不用先實例化對象再調(diào)用。 16.使用final修飾屬性后,屬性有什么特征? 解析:屬性可以是變量也可以是常量,如果是常量,就需要使用final修飾。如果使用final修飾了某個屬性,那么該屬性值一旦被賦值,就不能被修改,實際中常常有這個樣的碼:private static final int ERROR=0;也就是說,常常會生命靜態(tài)的常量。靜態(tài)常量的命名規(guī)范非常特殊,往往都是用大寫字母,如果包含多個單詞,每個單詞之間使用下劃線連接。靜態(tài)常量的意思是,該類所有的對象都擁有一個不變的常量ERROR,作為0.API中很多類都定義了很多的靜態(tài)常量,使用時直接使用類名調(diào)用即可。 參考答案:fianl修飾屬性后,屬性就成為一個常量。常量只要被賦值,就不能被改變。 17.請說明操作符==的作用。 解析:實際編程中,==是非常常用的操作符。很多初級程序員會使用這樣的代碼if(s==”save”0{},結(jié)果會發(fā)現(xiàn),即使當(dāng)字符串s的值為save時,if條件依然不能被執(zhí)行。是==在比較引用類型時,比較的是兩個對象的虛地址,而不是內(nèi)容。要比較兩個對象的內(nèi)容是否相同,往往需要使用equal方法,例如if(s.equals(“save”)){}。==比較基本類型時,將比值的二進制是否相等,例如(x==0.5){}。值得注意的是,與空指針null值進行比較,往往用==進行,例如if(s==null||s.equals(“”)),表示如果字符串是空指針或者空串。 參考答案:==可以用來比較基本類型或者引用類型。比較基本類型時,==用來比較二進制的值,比較引用類型時,用來比較對象的虛地址。 18請說明&&與&的區(qū)別和聯(lián)系 解析:實際編程中,常常需要使用“與”或者“或”的邏輯。其中&&和&存在一定區(qū)別&&可能發(fā)生各路問題,例如if(s!=null&&s.length()==6)中,如果要的值為null,那么第一表達式的值為false,返回值肯定是false,不會計算第二個表達式的值,這就是短路。然而使用&,例如if(s!=null&s.length()==6),假設(shè)s的值為,null,返回值肯定是false,但是會判斷第二個表達式的值,將發(fā)生空指針異常。實際工作中,經(jīng)常使用&&操作符。 參考答案:&&會發(fā)生短路問題,當(dāng)?shù)谝粋€表達式的值為false時,將直接返回結(jié)果為false而不會判斷第二個表達式的值。而&不會發(fā)生短路問題,即使第一個表達式的值是false,會判斷第二個表達式的值。 19. break語句能在什么場景使用。 解析:break語句表示中斷,不能夠隨便使用,只能在循環(huán)語句中或者switch語句中使用。初級工程師往往容易將break和return混淆。Return是可以再方法體中任意位置使用,可以帶值返回頁可以不帶值返回,執(zhí)行return語句后,該方法將返回,也就是方法執(zhí)行結(jié)束。而break只能在循環(huán)體中或者switch的case語句中使用,不能隨意使用。 參考答案:break語句可以再循環(huán)體中使用,也可以在switch的case語句中使用。 20.for循環(huán)中的break語句和continue語句的使用。 解析:很多時候,循環(huán)是為了查找某些符合條件的數(shù)據(jù),只要找到就沒有必要繼續(xù)下去,稱為中斷循環(huán),break語句就可以用來中斷循環(huán)。而continue語句恰恰相反,是用來繼續(xù)下一次循環(huán)。值得注意的是,java語言中可以再循環(huán)前面加標(biāo)號,即label,然后可以使用break或continue中斷或繼續(xù)標(biāo)號的循環(huán)。 參考答案:break可以用來中斷循環(huán),continue可以用來繼續(xù)下一次循環(huán)。 21請說明一個JAVA類中主要包含哪幾個元素并說明每種元素的作用。 解析:無論簡單還是復(fù)雜的JAVA應(yīng)用,都是由若干個類組成,所以類是JAVA應(yīng)用的組成單位。了解一個類中包含的主要元素能夠?qū)︻愑幸粋€清晰的認識。一個類中往往會有五種元素,即屬性、方法、構(gòu)造方法、塊以及內(nèi)部類、其實塊和內(nèi)部類比較少見。 參考答案:JAVA類中主要包含屬性、方法、構(gòu)造方法、塊以及內(nèi)部類。屬性用來定義對象的數(shù)據(jù)方法用來定義對象的行為構(gòu)造方法可以用來創(chuàng)建對象塊能夠用來在類加載時執(zhí)行操作或者在每次實例化前執(zhí)行通用操作內(nèi)部類作為類的一個成員存在,能夠訪問外部類的屬性和方法 第二部分 類之間的關(guān)系 1.用代碼表示A類關(guān)聯(lián)B類的情況。 解析:一個Java應(yīng)用中不可能只有一個類,所以了解類之間的關(guān)系對程序員來說非常重要。關(guān)聯(lián)關(guān)系是最常用的一種關(guān)系,如果說A關(guān)聯(lián)B,那么就是B作為A的屬性存在。關(guān)聯(lián)關(guān)系是一種復(fù)用的策略,即A關(guān)聯(lián)B的時候,A可以復(fù)用B的行為。 參考答案: Class A{ Private B b; Public void setB(B b){ This.b=b; } } 2.請說明Java語言中數(shù)組的基本概念,數(shù)組的作用,以及數(shù)組的聲明創(chuàng)建方式。 解析:數(shù)組時任何一門語言里都常用的類型,Java語言也不例外。程序員了解數(shù)組,不能僅僅從語法上了解,而應(yīng)該深入理解數(shù)組的作用。數(shù)組可以用來存儲類型相同的元素,作為一種數(shù)據(jù)容器使用。和數(shù)組類似的概念是集合,也能作為數(shù)據(jù)容器使用。 參考答案:數(shù)組時相同元素的集合,作為數(shù)據(jù)容器使用。聲明創(chuàng)建一個int型數(shù)組,如下所示:int[]x=new int[3];其中3是數(shù)組的長度,該數(shù)組能夠存儲3個int型變量。 3.使用代碼,創(chuàng)建一個長度為5的String型數(shù)組,并使用增強for循環(huán)迭代數(shù)組打印出數(shù)組中的元素。 解析:增強for循環(huán)是JDK5增加的特性,可以方便地遍歷數(shù)組或集合。程序員需要了解的是,如果JDK版本低于5.0,則不支持這個功能。另外,并不是說有了增強for循環(huán)后,傳統(tǒng)的for循環(huán)就不被使用,增強for循環(huán)只能用來方便地遍歷數(shù)組和集合,其他情況下還要使用傳統(tǒng)的for循環(huán)。 參考答案: String[] sArray = new String[5]; For(String s:sArray){ System.out.println(s); } 4.說明Arrays類的作用。 解析:在實際工作中,常常需要對數(shù)組中的元素進行處理,例如排序等。初級程序員往往選擇自己編寫算法實現(xiàn)。實際上APV中提供了Arrays類,該類中定義了很多和數(shù)組有關(guān)的工具方法,能夠方便地處理數(shù)組,是程序員必須掌握的類。 參考答案:Arrays類是java.util包中的一個類,類中所有的方法都是static方法,這些方法都是數(shù)組對象的工具方法,能夠?qū)?shù)組進行處理,如sort方法可以對數(shù)組元素進行排序 5.請使用簡單代碼展示A類依賴B類的含義。 解析:對于程序員來說,了解類和類之間的關(guān)系非常必要。依賴關(guān)系指的是一種瞬間的關(guān)系。如果A依賴B,一般指的是A類的某個行為,需要B類對象作為參數(shù)。 參考答案: Class A{ Public void f(B b) } 6.請說明依賴關(guān)系和關(guān)聯(lián)關(guān)系的區(qū)別。 解析:關(guān)聯(lián)關(guān)系和依賴關(guān)系是非常常見的兩種關(guān)系,二者的區(qū)別也很明顯,程序員了解二者的區(qū)別能夠更深入的理解面向?qū)ο蟮乃枷搿?/p> 參考答案:依賴關(guān)系是一種瞬時關(guān)系,A依賴B,指的是A的某個行為的參數(shù)是B的類型,也就是說,A要想實現(xiàn)這個行為,必須依賴B的實例,A關(guān)聯(lián)B,是一種長久的關(guān)系。關(guān)聯(lián)關(guān)系的是B作為A的屬性存在,只要實例化一個A的對象,就會為這個A的對象實例化一個B的對象,作為它的屬性使用,可以在A中任何需要使用B的地方使用B。 7.繼承有什么作用,Java語言中的繼承有什么特點? 解析:繼承是面向?qū)ο笳Z言的一大特征,主要作用是重復(fù)使用,子類通過繼承父類,能夠重復(fù)使用父類的屬性和方法。指的注意的是,有兩個策略都可使實現(xiàn)重復(fù)使用,一個是關(guān)聯(lián),一個是繼承,實際編程中,關(guān)聯(lián)用的更多。因為子類繼承父類后,相當(dāng)于父類中的細節(jié)將暴露給子類。初級程序員一定不要隨意使用繼承,避免濫用繼承。 參考答案:繼承主要為了能夠重復(fù)使用父類中的成員。Java語言中的繼承是單繼承,也就是說一個類最多只能繼承一個父類。 8、什么是方法覆蓋(override)?并說明方法覆蓋與方法重載(overioad)的區(qū)別。 解析:方法覆蓋是一個非常重要的概念,是多態(tài)性的一個體現(xiàn)。方法覆蓋發(fā)生再去愛繼承關(guān)系中,當(dāng)子類需要修改從父類繼承到某個方法的方法體時,就可以聲明一個父類同名同參數(shù)同返回值的方法,這樣就對父類中的那個方法進行了覆蓋,子類對象調(diào)用該方法時將自動綁定到子類中的方法。API中很多類中都進行了方法覆蓋,如String類中的toString方法,就覆蓋了父類Object中的toString方法。 參考答案:覆蓋是發(fā)生在繼承關(guān)系的子類中,當(dāng)子類要修改從父類繼承的某個方法的方法體時,就可以在子類中聲明一個與父類同名、同參數(shù)并且同返回值類型的方法,這就是方法覆蓋。而重載與繼承沒有關(guān)系,指的是在一個類中可以同時聲明多個同名但不同參數(shù)的方法,稱為重載。 9、請說明什么是抽象類?抽象類有什么作用? 解析:初級程序員往往不需要自己創(chuàng)建抽象類,但是必須了解抽象類的概念,并且會使用抽象類。抽象類往往是設(shè)計階段的概念,用來定義多個子類的模板,一些具體的實現(xiàn)可以在子類中進行。初級程序員往往需要會創(chuàng)建子類繼承抽象類,實現(xiàn)抽象類中的方法。在API中,抽象類比比皆是。 參考答案:抽象類是不能實例化的類,使用abstract修飾。抽象類往往用來做父類使用,定義一些子類的共同屬性或行為。 10、請說明抽象方法的含義,并說明抽象類與抽象方法的關(guān)系。 解析:抽象方法都是在抽象類中定義的,是用來定義子類what to do的策略,而具體的how to do都在子類中實現(xiàn)。 參考答案:抽象方法是沒有辦法體的方法,使用abstract修飾。抽象類中不一定有抽象方法,但是有抽象方法的類一定是抽象類。 11、super關(guān)鍵字的兩種用法。 解析:使用一些IDE生成代碼時,常常會在構(gòu)造方法中見到super這個關(guān)鍵字。顧名思義,super是和父類有關(guān)的一個關(guān)鍵字,熟悉super的用法對熟練掌握繼承很有必要。 參考答案:如super():表示調(diào)用父類中的每一參考的構(gòu)造方法:又如super(10);表示調(diào)用父類中的具有一個整型參數(shù)的構(gòu)造方法。第二種用法是在子類中調(diào)用父類中的成員,如super.f();意思是調(diào)用父類中的f()方法。 12、final類與final方法有什么作用? 解析:final修飾符是一個用途非常廣泛的修飾符,可以修飾類,方法,以及屬性。 參考答案:final類是不能夠被繼承的類,稱為終極類,如String類就是final類,不能有子類。final修飾方法后,是終極方法,不能被子類覆蓋,但是可以被子類繼承使用。 13.什么是多態(tài)函數(shù)?多態(tài)函數(shù)有什么用? 解析:多態(tài)性是面向?qū)ο笳Z言的的一大特征,重載,覆蓋,多態(tài)參數(shù)是多態(tài)性的一種表現(xiàn)形式。多態(tài)參數(shù)處處可見,例如某方法f(Object o),這個方法的參數(shù)類型是Object,使用該方法時,只要傳遞給f的單數(shù)類型是Object即可。也就是說,Object類的任意參數(shù)可以傳遞給f方法。這就是多態(tài)參數(shù)。意思是對外形式都一樣,都是Object,具體實現(xiàn)可以是這個類型的任意子類,這就使得該方法比較靈活,Object類即使有了新的子類,卻不需要修改,就能直接作用到那個子類。了解多態(tài)參數(shù)的含義和使用,對于Java的使用特別關(guān)鍵。 參考答案:多態(tài)函數(shù)就是參數(shù)的類型是某個父類類型,具體為這個參數(shù)賦值的不同以使用該父類的任意子類的對象。使用多態(tài)參數(shù),可以使程序的擴展性更好,即使%%%%的子類方法不需要任何修改,就能接受子類類型進行處理。 14.Object類有什么特點? 解析:Object類是一個非常重要的類,是所有類的父類,包括數(shù)組在內(nèi),也就是對一個Java類,不管是API中定義的,還是自定義的類,都直接或間接的繼承了Object類。所以,如果有一個方法f(Object o),那么可以傳遞給這個方法任意一個類的對象,包括%%%%。因為所有對象都可以說是Object類型。 參考答案:Object類是多有類的直接或間接的父類。 15.Object類中的toString方法有什么用? 解析:Object類是所有類的父類,所以O(shè)bject類中的方法是所有類都默認具備的。類中的toString 方法可以將任意一個對象作為字符串返回, API中很多類已經(jīng)覆蓋了這個方法,將其返回值的格式進行了自定義,如String類中的方法已經(jīng)覆蓋為返回字符串的字符序列。toString 方法在很多場合被自動調(diào)用,例如打印一個對象時,就自動調(diào)用該對象的toString 方法。 參考答案:toString方法可以把對象作為字符串返回。 16.Object類中的equals方法和hashCode方法。 解析:在Object類中,equals方法比較對象的引用值,也就是只有物理上是同一對象的兩個引用,在使用equals方法返回true。hashCode方法返回一個對象的內(nèi)在地址的十六進制值。由于Object類是所有類的父類,所以任意類中都擁有這兩個方法,并都可以進行覆蓋。尤其是操作Set,Map對象時集合元素類的equals方法和hashCode方法非常必要。 參考答案:Oject類中的equals方法用來比較兩個引用值,hashCode用來返回引用的內(nèi)陸址的十六進制數(shù)值。在Set以及Map集合中,判斷兩個元素是否重復(fù)時,往往需要使用這兩個方法。這兩個方法往往被子類覆蓋,覆蓋的規(guī)則是:如果存在x和y兩個對象,調(diào)用x.equals(y)返回true時,那么調(diào)用hashCode方法的返回值也該相同;如果x.equals(y)返回false時,那么調(diào)用hashCode方法返回的值可能相同,也可能不同。 17.接口有什么特點,與抽象類有什么區(qū)別? 解析:接口的概念是一個設(shè)計層面的概念,初級程序員往往不會自己定義接口,但是會使用接口,理解接口的概念非常必要。接口定義了實現(xiàn)類的規(guī)范,即what to do的部分,所有實現(xiàn)類必須按照這個規(guī)范進行實現(xiàn)。 參考答案:接口的特點是不能定義變量,而且所有方法都是抽象方法。而抽象類中可以有變量,也不強制必須有抽象方法。 18.類繼承父類與類實現(xiàn)接口,有什么區(qū)別? 解析:類繼承父類與類實現(xiàn)接口,本質(zhì)上其實是一樣的。都是將父類或者接口作為模板,在這個模板上進行擴展或者重寫。程序員在實際編程中,常常需要繼承父類或者實現(xiàn)接口。 參考答案:類繼承父類只是單繼承,也就是一個子類最多只有一個父類;而類實現(xiàn)接口可以多實現(xiàn),就是一個子類可以同時實現(xiàn)多個接口,并覆蓋所有接口中的所有抽象方法。 19.Comparable接口有什么作用 解析:comparable接口是在實際編程中常常使用的接口,該接口定義了comareTo(Object o)方法,用來定義對象的比較邏輯。這個接口常常在其他API中會強制使用,例如Arrays類的sort(Object[])方法,就強制數(shù)組元素必須實現(xiàn)Comparable接口,與這個接口類似的 另外一個接口是Comparator。 參考答案:Comparable接口定義了compareTo(Object o)方法,可以用來實現(xiàn)對象的比較邏輯,這個接口常常在其他API中強制使用,用來規(guī)范對象的比較邏輯 第三部分 異常處理 1 .什么是異常?異常和錯誤有什么區(qū)別? 解析:異常處理是面向?qū)ο笳Z言比起過程式語言的一大改進。對于Java程序員來說,必須了解異常處理,才能順利編程。 參考答案:異常是一些不正常的事件,能夠中斷程序的正常執(zhí)行例如才除0計算就是異常。和錯誤不同,異常是可以被處理的,而錯誤往往是不能夠處理的,如內(nèi)存溢出錯誤。 2 .nullPointException是什么異常?什么情況發(fā)生該異常? 解析:程序員必須能夠了解常見的異常的發(fā)生原因,并能夠處理。NullPointerException就是特別常見的運行期異常。 參考答案:NullPointerExcepiton是空指針異常,當(dāng)一個引用沒喲被賦值,就是一null值如 果這種情況下, 使用該引用調(diào)用其屬性或者方法, 就會發(fā)生NullPointerException異常。 3.說明try/catch/finally語句塊的作用 解析:編寫Java程序,避免不了需要處理異常。Java中處理異常使用try/catch/finally來實現(xiàn)。尤其其中的finally語句非常值得程序員關(guān)注,可以用來執(zhí)行必須實現(xiàn)的功能,例如數(shù)據(jù)庫的鏈接等操作。 參考答案:try語句塊用來包含可能發(fā)生異常的語句,catch塊用來捕獲異常,finally用來包含必須執(zhí)行的語句。 4.如何使用語句拋出異常,拋出異常后如何處理? 解析:某些業(yè)務(wù)邏輯的非正常事件流,可以使用拋出異常來標(biāo)記。拋出的異常必須是有意義的異常類型,建議不要使用API中的標(biāo)準(zhǔn)異常類,避免混淆。 參考答案:使用throw語句就可以拋出異常,如throw new XXXException()。拋出異常時一般情況下會在聲明方法處使用throws聲明該類型的異常,調(diào)用該方法是編譯器將提示異常。 5. throws 關(guān)鍵字和 throw 關(guān)鍵字有什么區(qū)別和聯(lián)系? 解析:throws和throw是異常處理時兩個常見的關(guān)鍵字,初級程序員常常容易正確理解throw和throws的作用和區(qū)別,說明已經(jīng)能比較深入理解異常處理。Throw用來拋出異常,如果執(zhí)行了throw語句,程序?qū)l(fā)生異常,進入到異常處理機制。Throws用來聲明異常,說明這個方法可能會發(fā)生某些類型的異常,那么編譯器將強制在調(diào)用這個方法的時候處理異常。API中的很多方法都使用了throws聲明了異常,所以使用這些方法時編譯器會提示需要處理異常。 參考答案:throw用來在方法體內(nèi)拋出異常,而throws用來在方法聲明處聲明異常。這兩個關(guān)鍵字有著一定的聯(lián)系。如果一個方法中使用了throw關(guān)鍵字拋出了異常,那么要么立即用try/catch語句進行捕獲,要么就是用throws進行聲明,否則將出現(xiàn)編譯錯誤。然而, 并不是只有使用了throw關(guān)鍵字之后才能使用throws關(guān)鍵字,語法上來說,任何一個方法都可以直接使用throws關(guān)鍵字,抽象方法也可以使用。 6. 什么是自定義異常類?為什么要自定義異常類? 解析:企業(yè)應(yīng)用中,往往會自定義一系列的異常類,標(biāo)記一些非正常的事件流。然而,這些自定義異常類不會讓每個程序員都自定義,而是會由專人定義,分發(fā)給程序員使用。 參考答案:自定義異常類區(qū)別于API中的標(biāo)準(zhǔn)異常類,指的是開發(fā)人員自己創(chuàng)建的異常類。只要繼承API中某個異常類就可以自定義一個異常類,常常集成Exception類。自定義異常類主要是為了標(biāo)記業(yè)務(wù)邏輯中非正常事件流,避免與API中的標(biāo)準(zhǔn)異?;煜?/p> 第四部分 核心API 1.請畫出Java集合框架的主要接口和類的繼承關(guān)系。 解析:集合石非常重要的類型, 也是企業(yè)考察員工編程能力時常常關(guān)注的知識點。程序員應(yīng)該熟悉Java集合框架的主要繼承關(guān)系, 掌握常用集合類的用法和特點 2. Collection接口和Map接口分別定義了什么集合類型?有什么區(qū)別? 解析:Collection和Map是Java集合框架中兩個基本集合類型,要區(qū)別不同的集合首先要從Collection和Map開始。 參考答案:Collection接口是傳統(tǒng)的集合接口,可以把單個對象存儲進來。而Map接口是映射接口,存儲的是鍵值對。 3.用簡單代碼演示創(chuàng)建一個泛型類為Customer類的List對象,并使用增強for循環(huán)迭代集合。 解析:JDK5以后,集合框架中的接口和類都是泛型類及泛型接口,并可以使用增強for循環(huán)迭代集合。程序員需要確認開發(fā)平臺的JDK版本,如果低于5.0則不能使用這些功能。 參考答案: ArrayList For(Customer c : list){ } 4.List和Set集合有什么區(qū)別? 解析:List和Set是Collection接口的兩個子接口,也是使用最多的兩種集合類型。程序員應(yīng)該熟悉這兩個接口的基本特征,能夠更準(zhǔn)確地選擇正確的集合類型。 參考答案:List實現(xiàn)了列表類型的集合,List中的元素是有序(ordered)的,每個元素根據(jù)放入集合的順序而對應(yīng)一個索引值, 可以根據(jù)這個索引值返回集合原宿。而Set實現(xiàn)了不重復(fù)元素集合,即Set中的元素不能夠重復(fù),重復(fù)的元素將無法添加到集合中。 5. List接口有哪幾個實現(xiàn)類?分別說明其特征 解析:List是用的較多的集合類型,List是一個接口,具體使用List集合類型時,需要使用時實現(xiàn)類。List接口的每個實現(xiàn)類也都實現(xiàn)了不同的數(shù)據(jù)結(jié)構(gòu),各自具有不同的特征,其中最常用的是List實現(xiàn)類。 參考答案:List接口中有以下幾個常用實現(xiàn)1 ArrayList:實現(xiàn)了動態(tài)數(shù)組的特征。 2 LinkedList: 實現(xiàn)了鏈表的數(shù)據(jù)結(jié)構(gòu),LinkedList也可以用作棧或者隊列。3 Vector:向量。4 ArrayList Vector類的功能 ArrayList都可以實現(xiàn),區(qū)別在于Vector是現(xiàn)行同步的。 6. Collectioin 和Collections有什么區(qū)別? 解析:很多初級程序員對Collectioni和Collections容易混淆,二者的名字非常類似,本義卻大大不同,Collections類與Arrays類非常類似,都是工具類,程序員應(yīng)該熟悉掌握。 參考答案:Collection是一個接口的名字,定義了集合類型的共同特征。而Collections是一個類的名字,是集合類型的工具類,類中定義了大量的靜態(tài)方法,能夠操作及和對象。 7.如何將一個Collection轉(zhuǎn)換成數(shù)組? 解析:集合和數(shù)組有很多共同的地方,二者都是作為數(shù)據(jù)容器使用, 用來持有數(shù)據(jù)。數(shù)組的長度是固定的,集合的長度卻可以動態(tài)擴展,數(shù)組由于可以直接通過索引操作其元素,所以性能和效率較高。實際應(yīng)用中,可能使用及合作為臨時變量持有數(shù)據(jù),卻將處理結(jié)果轉(zhuǎn)換成數(shù)組返回。 參考答案:Collection接口中定義了toArray(T[] a)方法來將集合轉(zhuǎn)換為數(shù)組,其中T是泛型類型。 8集合的作用? 集合是可以存儲一批類型不同的對象, 針對集合的實現(xiàn)類有很多, 作用都是一樣的,即存儲、傳輸數(shù)據(jù),但存儲的數(shù)據(jù)結(jié)構(gòu)不一樣,其速度、安全性也 不一樣。 9HashMap和TreeMap在性能上有什么樣的差別呢?你比較傾向于使用哪一個? 一個平衡樹的性能是O(logn)。Java里的TreeMap用一個紅黑樹來保證key/value的排序。紅黑樹是平衡二叉樹。保證二叉樹的平衡性,使得插入,刪除和查找都比較快,時間復(fù)雜度都是O(log n)。不過它沒有HashMap快,HashMap的時間復(fù)雜度是O(1),但是TreeMap的優(yōu)點在于它里面鍵值是排過序的,這樣就提供了一些其他的很有用的功能。 10什么是Iterator 一些集合類提供了內(nèi)容遍歷的功能,通過java.util.Iterator接口。這些接口允許遍歷對象的集合。依次操作每個元素對象。當(dāng)使用Iterators時,在獲得Iterator的時候包含一個集合快照。通常在遍歷一個Iterator的時候不建議修改集合本省。 11什么是HaspMap和Map? Map是接口,Java 集合框架中一部分,用于存儲鍵值對,HashMap是用哈希算法實現(xiàn)Map的類 12Java集合框架都有哪些最佳實踐呢? 根據(jù)實際的使用情況選擇合適的數(shù)據(jù)結(jié)構(gòu),例如固定大小的還是需要增加大小的,有重復(fù)元素的還是沒有的,需要保持有序還是不需要,遍歷是正向的還是雙向的,插入是在末尾的還是任意位置的,更多的插入還是更多的讀取,是否需要并行訪問,是否允許修改,元素類型是相同的還是不同的,等等。另外,還需要盡早考慮多線程,原子性,內(nèi)存使用量以及性能等因素。 不要假設(shè)你的集合里元素的數(shù)量一直會保持較小,它也有可能隨著時間增長。所以,你的集合最好能夠給定一個合適的大小。 針對接口編程優(yōu)于針對實現(xiàn)編程。例如,可能在某些情況下,LinkedList是最佳的選擇,但是后來ArrayList可能因為性能的原因變得更加合適 在取得列表的時候,如果返回的結(jié)果是空的話,最好返回一個長度為0的集合或者數(shù)組,而不要返回null。因為,返回null的話可能能會導(dǎo)致程序錯誤。調(diào)用你的方法的開發(fā)人員可能會忘記對返回為null的情況進行處理。 封裝好集合:一般來說,集合都是不可變的對象。所以盡量不要把集合的成員變量暴露給調(diào)用者。因為他們的操作一般都不會進行必要的校驗。 13ArrayList和Vector的區(qū)別。 同步性:Vector是線程安全的,也就是說是同步的,而ArrayList是線程序不安全的,不是同步的 .數(shù)據(jù)增長:當(dāng)需要增長時,Vector默認增長為原來一培,而ArrayList卻是原來的一半 14ArrayList、Vector、LinkedList的區(qū)別? ArrayList、Vector:以線性表的方式存儲,查、改快,增刪慢 Vector:是線程安全,方法是同步方法 。 ArrayList:是線程不安全,方法是非同步方法 。 LinkedList:單鏈表,查、改慢,增刪快 15Map的接口和特點?: 鍵名+鍵值,鍵名不可以重復(fù),鍵值可以重復(fù),通過鍵名取鍵值 HashMap:線程不安全 Hasttable:線程安全 jsp中的作用域?qū)ο?session、request、application、page)屬于map這個體系 16Collection及Collections的區(qū)別? Collection是集合的根 Collections是算法,提供了靜態(tài)方法,可以對集合進行操作 17 假設(shè)存在文本文件etc.doc,請用代碼展示將文件按行讀出,并打印輸出到控制臺。 解析:能夠使用java.io包進行文件的輸入輸出操作是一個程序員必備的技能,使用io中類操作的步驟都基本類似,都需要經(jīng)歷IO選擇、創(chuàng)建流對象、進行讀寫操作、關(guān)閉流對象的過程,程序員應(yīng)該熟悉常用的IO流, 能夠根據(jù)需要選擇適當(dāng)?shù)腎O類。 參考答案: File file = new File(“etc.doc”); try{ FileReader fr = new FileReader(File); BufferedReader br = new BufferedReader(fr); String line = br.readLine(); while(line == null){ System.out.println(line); Line = br.readLine(); } }catch(FileNotFoundException e){ e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); }; 18.使用java語言如何創(chuàng)建線程對象?請列出常用的兩種方法。 解析:Java 語言能夠支持多線程編程,將線程封裝成Thread類型的對象,只要創(chuàng)建Thread類型的對象,就能夠便捷地啟動線程、執(zhí)行線程體。程序員首先必須掌握創(chuàng)建線程的常用方法。 參考答案:Java語言中經(jīng)常使用兩種方法創(chuàng)建線程。①創(chuàng)建Thread類的子類,在子類中覆蓋Thread類的run方法,實現(xiàn)線程的運行體,只要創(chuàng)建該子類對象就是線程對象。②創(chuàng)建Runable接口的實現(xiàn)類,在實現(xiàn)類中覆蓋接口中的run方法,實現(xiàn)線程的運行體。使用Thread(Runable)構(gòu)造方法可以創(chuàng)建線程對象,參數(shù)是Runable接口實現(xiàn)類的實例。 19.關(guān)鍵字synchronized有什么作用?用簡單代碼展示synchronized的方法。 解析:線程可以共享數(shù)據(jù),而共享數(shù)據(jù)時,可能會因為多個線程并發(fā)處理共享數(shù)據(jù)而導(dǎo)致數(shù)據(jù)不一致。這種時候,線程同步就費城關(guān)鍵。程序員必須掌握同步的用法,尤其不能隨意將代碼進行同步,因為同步將降低性能,所以一定不能把不需要同步的代碼進行同步,而是只把必須同步的代碼進行同步。 參考答案:synchronized可以將某個代碼塊或者某個方法進行線程同步,被同步的代碼塊在一個時刻只能被一個線程訪問,只有當(dāng)前線程處理結(jié)束后,方能被其他線程訪問。例如: public void run(){ for(int i=0;i<50;i++){ synchronized(this){ System,out,println(Thread.currentThread().getName()+”:x=”+x); X++; }}} 20.線程之間通信的方法有哪幾個?分別起到什么作用? 解析:如果多個線程共享了某些數(shù)據(jù),同時線程之間有存在一定的“依賴”關(guān)系,即執(zhí)行某類線程必須依賴另一類的執(zhí)行結(jié)果,如消費者必須等待生產(chǎn)者生產(chǎn)了商品才能消費。這種情況下,線程之間就需要通信。必須在同步代碼塊中調(diào)用線程通信的方法。 參考答案:線程通信的方法有三個,在Object類中定義。①wait方法:使得線程進入等待狀態(tài)。②notify 方法:隨意通知等待池中的某一個線程。③notifyAll 方法:通知等待池中所有線程。 第五部分其他特性 1.什么是泛型?泛型有什么作用? 解析:泛型是JDK5中增加的特性,API中有大量的泛型接口、泛型類及泛型方法等。程序員需要了解泛型的作用,尤其在使用集合框架時,往往需要使用到泛型。 參考答案:泛型的本質(zhì)就是參數(shù)化類型,也就是說把數(shù)據(jù)類型指定為一個參數(shù)。在需要聲明數(shù)據(jù)類型的地方,就可以不指定具體的某個類型,而是使用這個參數(shù)。這樣一來,就能夠在具體使用時再指定具體類型,實現(xiàn)了參數(shù)的“任意化”。泛型的好處是在編譯的時候能夠檢查類型安全,并且所有的強制轉(zhuǎn)換都是自動和隱式的,提高代碼的重用率。 2.請聲明一個簡單的泛型類,說明泛型的作用 解析:泛型可以用在很多地方,可以聲明泛型類、泛型接口、泛型方法等。其中泛型類的使用時程序員必須掌握的知識點。 參考答案: public class GenClass private E attr; public GenClass(E attr){ this.attr=attr; } public E getAttr(){ return attr; } public void setAttr(E attr){ this.attr=attr; } public static void main(String[] args){ GenClass System.out.println(g1.getAttr()); GenClass System.out.println(g2.getAttr()); }} 上面的類GenClass就是一個泛型類,其中E是代表類型的一個參數(shù),E不是一個具體的類,可以使用任意字母代替。在類中聲明屬性、方法的時候,都使用E這個參數(shù)表示類型,達到了類型任意化的效果??梢?,使用該類時,可以根據(jù)需要將E替換為任意具體類型。 3.下述代碼是否有編譯錯誤,如果有,請指出錯誤。 List List 解析:Object類是Java中的頂級類,是所有類直接或間接的父類。然而,繼承關(guān)系在使用泛型集合時,卻非常容易出錯,程序員必須謹慎使用。例如,雖然String類型是Object類型的子類型,然而一個泛型類型為String的List并不是一個泛型類型為Object的List的子類型。 參考答案:代碼有編譯錯誤,在第二行出錯。一個泛型類型為String的List并不是一個泛型類型為Object的List的子類型。 4.請使用簡單代碼聲明一個枚舉類型,并說明枚舉的作用。 解析:枚舉是JDK5版本增加的新類型,在這之前,只有類和接口兩種類型。枚舉類型主要能夠解決靜態(tài)常量的類型不安全問題。例如,某類中有一系列int型的靜態(tài)常量,并都賦予了特定的值。然而在使用這些常量時,完全可以用任意一個int型的值代替,編譯器不會發(fā)現(xiàn)錯誤。而枚舉作為一種類型存在,編譯器將在編譯期檢查類型,不能隨意使用其他值代替,當(dāng)應(yīng)用中需要一系列預(yù)定義的常量值時,程序員就應(yīng)該考慮是否使用枚舉實現(xiàn)。 參考答案:枚舉使用enum關(guān)鍵字聲明,如下所示: public enum StudentGrade{ A,B,C; } 使用枚舉的時候,可以通過枚舉的名字StudentGrade進行引用,如下所示: public void setGrade(StudentGrade grade){ this.grade = grade; } 在使用setGrade 方法時,實際參數(shù)值只能是枚舉 StudentGrade 中的預(yù)定義值,否則將出現(xiàn)編譯錯誤。 5.假設(shè)有一個枚舉類型是Grade,使用代碼展示遍歷該枚舉的方法。 解析:枚舉中往往定義了一系列的數(shù)據(jù)點,在某些場合下可能需要遍歷這些值。程序員應(yīng)該掌握遍歷枚舉的方法。 參考答案:遍歷枚舉需要使用values()方法,如下所示: Grade[]grades = Grade.values(); for(Grade g : grades){ System.out.println(g); } 6.增強for循環(huán)再什么場合使用?用簡單代碼展現(xiàn)其使用方法。 解析:增強for循環(huán)式JDK5版本增加的特性,只能在遍歷數(shù)組或集合時使用。遍歷集合時,最好使用泛型集合,否則將比較復(fù)雜。增強for循環(huán)并不能完全替代傳統(tǒng)循環(huán),如果不是遍歷數(shù)組或集合,還是只能使用傳統(tǒng)的for循環(huán)。 參考答案:增強for循環(huán)可是用來遍歷數(shù)組或集合,如下所示: for(String s:sArray){ System.out.println(s); } 上述代碼中的sArray是一個String類型的數(shù)組。 7.什么是自動裝箱/拆箱?使用該特征有哪些注意事項? 解析:自動裝箱/拆箱指的是八個包裝器類與八個基本類型的轉(zhuǎn)換問題。然而。這個特征卻需要謹慎使用,因為雖然表面上看起來非常方便,而實質(zhì)上依然需要創(chuàng)建對象、進行轉(zhuǎn)換等操作,使用不恰當(dāng)會降低性能。 參考答案:自動裝箱指的是可以直接將基本數(shù)據(jù)類型轉(zhuǎn)換為包裝器類型,自動拆箱指的是可以直接將包裝器類型轉(zhuǎn)換為基本數(shù)據(jù)類型,如下代碼所示: int m=100; Integer im=m; int n=im; 上訴代碼中,直接將m賦值給包裝器對象im,這就是自動裝箱,然后直接將im賦值給基本數(shù)據(jù)類型n,這就是自動拆箱。雖然表面上看代碼簡潔方便,然而本質(zhì)上裝箱時候依然使用new創(chuàng)建了對象,而拆箱時也依然調(diào)用了方法進行運算。因此,不要在沒有必要的時候,頻繁使用裝箱拆箱,會降低性能。 8.什么是可變參數(shù)?用簡單代碼展示可變參數(shù)的使用。 解析:如果一個類中的某個方法,要接受某個類型的參數(shù),而參數(shù)個數(shù)卻不確定,這種情況下,可以將這個參數(shù)使用數(shù)組類型或者集合類型封裝,然而使用該方法時就比較麻煩,必須先把參數(shù)先封裝成數(shù)組或者集合??勺儏?shù)就能夠解決這個問題。 參考答案:可變參數(shù)是指參數(shù)個數(shù)不確定的參數(shù),如下所示: public static int add(int..args){ ………… } 上述方法的args就是可變參數(shù),使用add方法時,形式參數(shù)可以是任意多個int型數(shù)值。 1、作用域public,private,protected,以及不寫時的區(qū)別 答:區(qū)別如下: 作用域 當(dāng)前類 同一package 子孫類 其他 package public √ √ √ √ protected √ √ √ × friendly √ √ × × private √ × × × 不寫時默認為friendly2、 Anonymous Inner Class (匿名內(nèi)部類) 是否可以extends(繼承)其它類, 是否可以implements(實現(xiàn))interface(接口) 答:匿名的內(nèi)部類是沒有名字的內(nèi)部類。不能extends(繼承) 其它類,但一個內(nèi)部類可以作 為一個接口,由另一個內(nèi)部類 實現(xiàn) 2、&和&&的區(qū)別 答:&是位運算符,表示按位與運算,&&是邏輯運算符,表示邏輯與(and) 5、Collection 和 Collections的區(qū)別 答:Collection是集合類的上級接口,繼承與他的接口主要有 Set 和List. Collections是針對集合類的一個幫助類,他提供一系列靜態(tài)方法實現(xiàn)對各種集合的搜索、排序、線程安全化等操作 6、什么時候用assert 答: assertion(斷言)在軟件開發(fā)中是一種常用的調(diào)試方式,很多開發(fā)語言中都支持這種機制。在實現(xiàn)中,assertion就是在程序中的一條語句,它對一個 boolean 表達式進行檢查,一個正確程序必須保證這個boolean表達式的值為 true;如果該值為false,說明程序已經(jīng)處于不正確的狀態(tài)下,系統(tǒng)將給出警告或退出。一般來說, assertion用于保證程序最基本、關(guān)鍵的正確性。assertion 檢查通常在開發(fā)和測試時開啟。為了提高性能,在軟件發(fā)布后,assertion檢查通常是關(guān)閉的 7、String s = new String('xyz');創(chuàng)建了幾個String Object 答:兩個,一個字符對象,一個字符對象引用對象 8、Math.round(11.5)等於多少? Math.round(-11.5)等於多少 答: Math.round(11.5)==12;Math.round(-11.5)==-11;round方法返回與參數(shù)最接近的長整數(shù) 10、Java有沒有g(shù)oto 答:java中的保留字,現(xiàn)在沒有在java中使用 11、數(shù)組有沒有l(wèi)ength()這個方法? String有沒有l(wèi)ength()這個方法 答:數(shù)組沒有l(wèi)ength()這個方法,有 length的屬性。String有有 length()這個方法 12、Overload和Override的區(qū)別。Overloaded 的方法是否可以改變返回值的類型 答:方法的重寫 Overriding 和重載 Overloading 是 Java 多態(tài)性的不同表現(xiàn)。重寫 Overriding是父類與子類之間多態(tài)性的一種表現(xiàn),重載 Overloading 是一個類中多態(tài)性的一種表現(xiàn)。如果在子類中定義某方法與其父類有相同的名稱和參數(shù),我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調(diào)用子類中的定義,對它而言,父類中的定義如同被'屏蔽' 了。如果在一個類中定義了多個同名的方法,它們或有不同的參數(shù)個數(shù)或有不同的參數(shù)類型, 則稱為方法的重載 (Overloading)。Overloaded的方法是可以改變返回值的類型 13、Set 里的元素是不能重復(fù)的,那么用什么方法來區(qū)分重復(fù)與否呢? 是用==還是 equals()? 它們有何區(qū)別 答:Set里的元素是不能重復(fù)的,那么用iterator()方法來區(qū)分重復(fù)與否。equals()是判讀兩個Set是否相等 equals()和==方法決定引用值是否指向同一對象 equals()在類中被覆蓋,為的是當(dāng)兩個分離的對象的內(nèi)容和類型相配的話,返回真值 14、給我一個你最常見到的 runtime exception 答 : 常 見 的 運 行 時 異 常 有 如 下 這 些 ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException,ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException,NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException 15、error和exception有什么區(qū)別 答:error 表示恢復(fù)不是不可能但很困難的情況下的一種嚴重問題。比如說內(nèi)存溢出。不可能指望程序能處理這樣的情況 exception 表示一種設(shè)計或?qū)崿F(xiàn)問題。也就是說,它表示如果程序運行正常,從不會發(fā)生的情況 16、List, Set, Map是否繼承自 Collection接口 答: List,Set是,Map不是 17、abstract class和interface 有什么區(qū)別 答:聲明方法的存在而不去實現(xiàn)它的類被叫做抽象類(abstract class),它用于要創(chuàng)建一個體現(xiàn)某些基本行為的類,并為該類聲明方法,但不能在該類中實現(xiàn)該類的情況。不能創(chuàng)建abstract 類的實例。然而可以創(chuàng)建一個變量,其類型是一個抽象類,并讓它指向具體子類的一個實例。不能有抽象構(gòu)造函數(shù)或抽象靜態(tài)方法。 Abstract 類的子類為它們父類中的所有抽象方法提供實現(xiàn),否則它們也是抽象類為。取而代之,在子類中實現(xiàn)該方法。知道其行為的其它類可以在類中實現(xiàn)這些方法 接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過實現(xiàn)這樣的接口而獲得。接口中的所有方法都是抽象的,沒有一個有程序體。接口只可以定義 static final成員變量。接口的實現(xiàn)與子類相似,除了該實現(xiàn)類不能從接口定義中繼承行為。當(dāng)類實現(xiàn)特殊接口時,它定義(即將程序體給予)所有這種接口的方法。然后,它可以在實現(xiàn)了該接口的類的任何對象上調(diào)用接口的方法。由于有抽象類,它允許使用接口名作為引用變量的類型。通常的動態(tài)聯(lián)編將生效。引用可以轉(zhuǎn)換到接口類型或從接口類型轉(zhuǎn)換,instanceof 運算符可以用來決定某對象的類是否實現(xiàn)了接口 18、 abstract的method 是否可同時是static,是否可同時是 native,是否可同時是synchronized 答:都不能 19、接口是否可繼承接口? 抽象類是否可實現(xiàn)(implements)接口? 抽象類是否可繼承實體類(concrete class) 答:接口可以繼承接口。抽象類可以實現(xiàn)(implements)接口,抽象類是否可繼承實體類,但前提是實體類必須有明確的構(gòu)造函數(shù) 20、構(gòu)造器Constructor 是否可被override 答:構(gòu)造器Constructor 不能被繼承,因此不能重寫Overriding,但可以被重載Overloading 21、是否可以繼承String類 答:String類是final類故不可以繼承 22、try {}里有一個return語句,那么緊跟在這個try后的 finally {}里的 code會不會被執(zhí)行,什么時候被執(zhí)行,在return 前還是后 答:會執(zhí)行,在return前執(zhí)行 23、用最有效率的方法算出 2乘以8 答:2 << 3 24、兩個對象值相同(x.equals(y) == true),但卻可有不同的 hash code,這句話對不對 答:不對,有相同的hash code 25、當(dāng)一個對象被當(dāng)作參數(shù)傳遞到一個方法后,此方法可改變這個對象的屬性,并可返回變化后的結(jié)果,那么這里到底是值傳遞還是引用傳遞 答:是值傳遞。Java 編程語言只有值傳遞參數(shù)。當(dāng)一個對象實例作為一個參數(shù)被傳遞到方法中時,參數(shù)的值就是對該對象的引用。對象的內(nèi)容可以在被調(diào)用的方法中改變,但對象的引用是永遠不會改變的 26、switch是否能作用在byte 上,是否能作用在long上,是否能作用在String上 答:低版本jdk中witch(expr1)中,expr1 是一個整數(shù)表達式。因此傳遞給 switch 和 case 語句的參數(shù)應(yīng)該是 int、 short、 char 或者 byte。long,string 都不能作用于 swtich。在高版本jdk中,String類型也可以用在switch中。 27、ArrayList 和 Vector 的區(qū)別,HashMap 和Hashtable的區(qū)別 答:就ArrayList與Vector主要從二方面來說. 一.同步性:Vector 是線程安全的,也就是說是同步的,而 ArrayList 是線程序不安全的,不是同步的 二.數(shù)據(jù)增長:當(dāng)需要增長時,Vector默認增長為原來一培,而 ArrayList卻是原來的一半 就HashMap與 HashTable主要從三方面來說。 一.歷史原因:Hashtable 是基于陳舊的Dictionary 類的,HashMap是Java 1.2引進的 Map接口的一個實現(xiàn) 二.同步性:Hashtable 是線程安全的,也就是說是同步的,而 HashMap 是線程序不安全的, 不是同步的 三.值:只有HashMap可以讓你將空值作為一個表的條目的key或value 28、char 型變量中能不能存貯一個中文漢字?為什么? 答:是能夠定義成為一個中文的,因為 java中以 unicode 編碼,一個char 占16 個字節(jié),所 以放一個中文是沒問題的 29、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)存的顯示操作方法。 30、float型float f=3.4是否正確? 答:不正確。精度不準(zhǔn)確,應(yīng)該用強制類型轉(zhuǎn)換,如下所示:float f=(float)3.4 31、介紹JAVA 中的Collection FrameWork(包括如何寫自己的數(shù)據(jù)結(jié)構(gòu))? 答:Collection FrameWork如下: Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └WeakHashMapCollection 是最基本的集合接口,一個 Collection 代表一組 Object,即Collection的元素(Elements) Map提供key到value的映射 32、抽象類與接口? 答:抽象類與接口都用于抽象,但是抽象類(JAVA中)可以有自己的部分實現(xiàn),而接口則完全是一個標(biāo)識(同時有多重繼承的功能)。 33、STRING與STRINGBUFFER 的區(qū)別。 答:STRING 的長度是不可變的,STRINGBUFFER 的長度是可變的。如果你對字符串中的內(nèi)容經(jīng)常進行操作,特別是內(nèi)容要修改時,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的 toString()方法 34、談?wù)刦inal, finally, finalize 的區(qū)別 答:final—修飾符(關(guān)鍵字)如果一個類被聲明為 final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此 一個類不能既被聲明為 abstract 的,又被聲明為 final 的。將變量或方法聲明為 final,可以保證它們在使用中不被改變。被聲明為 final 的變量必須在聲明時給定初值,而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能 使用,不能重載 finally—再異常處理時提供 finally 塊來執(zhí)行任何清除操作。如果拋出一個異常,那么相匹配的 catch 子句就會執(zhí)行,然后控制就會進入 finally 塊(如果有的話)finalize—方法名。Java 技術(shù)允許使用 finalize() 方法在垃圾收集器將對象從內(nèi)存中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調(diào)用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作。finalize() 方法是在垃圾收集器刪除對象 之前對這個對象調(diào)用的 35、面向?qū)ο蟮奶卣饔心男┓矫?/strong> 答:主要有以下四方面: 1.抽象: 抽象就是忽略一個主題中與當(dāng)前目標(biāo)無關(guān)的那些方面,以便更充分地注意與當(dāng)前目標(biāo)有關(guān)的方面。抽象并不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節(jié)。抽象包括兩個方面,一是過程抽象,二是數(shù)據(jù)抽象。 2.繼承: 繼承是一種聯(lián)結(jié)類的層次模型,并且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。對象的一個新類可以從現(xiàn) 有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類 的基類(父類)。派生類可以從它的基類那里繼承方法和實例變量,并且類可以修改或增加新的方法使之更適合特殊的需 要。 3.封裝: 封裝是把過程和數(shù)據(jù)包圍起來,對數(shù)據(jù)的訪問只能通過已定義的界面。面向?qū)ο笥嬎闶加谶@個基本概念,即現(xiàn)實世界可以 被描繪成一系列完全自治、封裝的對象,這些對象通過一個受保護的接口訪問其他對象。 4. 多態(tài)性: 多態(tài)性是指允許不同類的對象對同一消息作出響應(yīng)。多態(tài)性包括參數(shù)化多態(tài)性和包含多態(tài)性。多態(tài)性語言具有靈活、抽 象、行為共享、代碼共享的優(yōu)勢,很好的解決了應(yīng)用程序函數(shù)同名問題。 36、String是最基本的數(shù)據(jù)類型嗎 答:基本數(shù)據(jù)類型包括byte、int、char、long、float、double、boolean和short。 java.lang.String類是final類型的,因此不可以繼承這個類、不能修改這個類。為了提高效率節(jié)省空間,我們應(yīng)該用 StringBuffer 類 37、int 和 Integer 有什么區(qū)別 答:Java 提供兩種不同的類型:引用類型和原始類型(或內(nèi)置類型)。Int 是 java 的原始數(shù)據(jù)類型,Integer是java 為int 提供的封裝類。Java為每個原始類型提供了封裝類。 原始類型封裝類 , booleanBoolean,charCharacter,byteByte,shortShort,intInteger,longLong,floatFloat,doubleDouble引用類型和原始類型的行為完全不同,并且它們具有不同的語義。引用類型和原始類型具有不同的特征和用法,它們包括:大小和速度問題,這種類型以哪種類型的數(shù)據(jù)結(jié)構(gòu)存儲,當(dāng)引用類型和原始類型用作某個類的實例數(shù)據(jù)時所指定的缺 省值。對象引用實例變量的缺省值為 null,而原始類型實例變量的缺省值與它們的類型有關(guān) 38、運行時異常與一般異常有何異同 答:異常表示程序運行過程中可能出現(xiàn)的非正常狀態(tài),運行時異常表示虛擬機的通常操作中 可能遇到的異常,是一種常見運行錯誤。java編譯器要求方法必須聲明拋出可能發(fā)生的非運行時異常,但是并不要求必須聲明拋出未被捕獲的運行時異常。 39、說出ArrayList,Vector, LinkedList的存儲性能和特性 答:ArrayList和Vector 都是使用數(shù)組方式存儲數(shù)據(jù),此數(shù)組元素數(shù)大于實際存儲的數(shù)據(jù)以便增加和插入元素,它們都允許 直接按序號索引元素,但是插入元素要涉及數(shù)組元素移動等內(nèi)存操作,所以索引數(shù)據(jù)快而插入數(shù)據(jù)慢,Vector 由于使用了 synchronized方法(線程安全),通常性能上較 ArrayList差,而LinkedList使用雙向鏈表實現(xiàn)存儲,按序號索引數(shù)據(jù)需要 進行前向或后向遍歷,但是插入數(shù)據(jù)時只需要記錄本項的前后項即可,所以插入速度較快。 40、HashMap和Hashtable 的區(qū)別 答:HashMap是Hashtable的輕量級實現(xiàn)(非線程安全的實現(xiàn)),他們都完成了 Map接口, 主要區(qū)別在于HashMap允許空(null)鍵值(key),由于非線程安全,效率上可能高于 ashtable。 HashMap允許將null作為一個entry 的key 或者value,而Hashtable不允許。 HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因為contains方法容易讓人引起誤解。 Hashtable繼承自Dictionary 類,而HashMap是 Java1.2 引進的Map interface 的一個實現(xiàn)。 最大的不同是,Hashtable 的方法是 Synchronize 的,而 HashMap 不是,在多個線程訪問Hashtable時,不需要自己為它的方 法實現(xiàn)同步,而HashMap 就必須為之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概一樣,所以性能不會有很大的差異。 41、heap和stack有什么區(qū)別 答:棧是一種線形集合,其添加和刪除元素的操作應(yīng)在同一段完成。棧按照后進先出的方式進行處理。堆是棧的一個組成 元素 42、Java中的異常處理機制的簡單原理和應(yīng)用 答:當(dāng) JAVA 程序違反了 JAVA 的語義規(guī)則時,JAVA 虛擬機就會將發(fā)生的錯誤表示為一個異常。違反語義規(guī)則包括2種情況。一 種是JAVA 類庫內(nèi)置的語義檢查。例如數(shù)組下標(biāo)越界,會引發(fā)IndexOutOfBoundsException;訪問null的對象時會引發(fā) NullPointerException。另一種情況就是 JAVA允許程序員擴展這種語義檢查,程序員可以創(chuàng)建自己的異常,并自由選擇在何時用throw 關(guān)鍵字引發(fā)異常。所有的異常都是 java.lang.Thowable 的子類。 43、垃圾回收的優(yōu)點和原理。并考慮 2種回收機制 答:Java語言中一個顯著的特點就是引入了垃圾回收機制,使 c++程序員最頭疼的內(nèi)存管理的問題迎刃而解,它使得 Java程序員在編寫程序的時候不再需要考慮內(nèi)存管理。由于有個垃圾回收機制,Java中的對象不再有'作用域'的概念,只有對象的引用才有'作用域'。垃圾回收可以有效的防止內(nèi)存泄露,有效的使用可以使用的內(nèi)存。垃圾回收器通常是作為一個單獨 的低級別的線程運行,不可預(yù)知的情況下對內(nèi)存堆中已經(jīng)死亡的或者長時間沒有使用的對象進行清楚和回收,程序員不能 實時的調(diào)用垃圾回收器對某個對象或所有對象進行垃圾回收?;厥諜C制有分代復(fù)制垃圾回收和標(biāo)記垃圾回收,增量垃圾回收。 44、你所知道的集合類都有哪些?主要方法? 答:最常用的集合類是 List 和 Map。 List 的具體實現(xiàn)包括 ArrayList 和 Vector,它們是可變大小的列表,比較適合構(gòu)建、存儲和操作任何類型對象的元素列表。 List 適用于按數(shù)值索引訪問元素的情形。Map 提供了一個更通用的元素存儲方法。 Map 集合類用于存儲元素對(稱作'鍵'和'值'),其中每個鍵映射到一個值。 45、描述一下JVM加載 class文件的原理機制? 答:JVM 中類的裝載是由 ClassLoader 和它的子類來實現(xiàn)的,Java ClassLoader 是一個重要的Java運行時系統(tǒng)組件。它負責(zé)在運行時查找和裝入類文件的類。 46、排序都有哪幾種方法?請列舉 答: 排序的方法有:插入排序(直接插入排序、希爾排序),交換排序(冒泡排序、快速排序),選擇排序(直接選擇排序、堆排序),歸并排序,分配排序(箱排序、基數(shù)排序) 47、JAVA 語言如何進行異常處理,關(guān)鍵字: throws,throw,try,catch,finally 分別代表什么意義?在 try 塊中可以拋出異常 嗎? 答:Java通過面向?qū)ο蟮姆椒ㄟM行異常處理,把各種不同的異常進行分類,并提供了良好的接口。在Java中,每個異常都 是一個對象,它是Throwable 類或其它子類的實例。當(dāng)一個方法出現(xiàn)異常后便拋出一個異常對象,該對象中包含有異常信息,調(diào)用這個對象的方法可以捕獲到這個異常并進行處理。Java的異常處理是通過 5個關(guān)鍵詞來實現(xiàn)的:try、catch、throw、throws和finally。一般情況下是用try 來執(zhí)行一段程序,如果出現(xiàn)異常,系統(tǒng)會拋出(throws)一個異常,這時候 你可以通過它的類型來捕捉(catch)它,或最后(finally)由缺省處理器來處理。用try 來指定一塊預(yù)防所有'異常'的程序。緊跟在try程序后面,應(yīng)包含一個catch子句來指定你想要捕捉的'異常'的類型。throw語句用來明確地拋出一個'異常'。 throws用來標(biāo)明一個成員函數(shù)可能拋出的各種'異常'。Finally為確保一段代碼不管發(fā)生什么'異常'都被執(zhí)行一段代碼??梢栽谝粋€成員函數(shù)調(diào)用的外面寫一個 try 語句,在這個成員函數(shù)內(nèi)部寫另一個 try 語句保護其他代碼。每當(dāng)遇到一個 try 語 句,'異常'的框架就放到堆棧上面,直到所有的 try 語句都完成。如果下一級的 try 語句沒有對某種'異常'進行處理,堆棧 就會展開,直到遇到有處理這種'異常'的try語句。 48、一個'.java'源文件中是否可以包括多個類(不是內(nèi)部類)?有什么限制? 答:可以。必須只有一個類名與文件名相同。 49、java中有幾種類型的流?JDK 為每種類型的流提供了一些抽象類以供繼承,請說出他們分別是哪些類? 答:字節(jié)流,字符流。字節(jié)流繼承于 InputStream OutputStream,字符流繼承于InputStreamReader OutputStreamWriter 。在java.io包中還有許多其他的流,主要是為了提高性能和使用方便。 50、java中會存在內(nèi)存泄漏嗎,請簡單描述。 答:會。自己實現(xiàn)堆載的數(shù)據(jù)結(jié)構(gòu)時有可能會出現(xiàn)內(nèi)存泄露,可參看effective java. 51、java中實現(xiàn)多態(tài)的機制是什么? 答:方法的重寫 Overriding 和重載 Overloading 是 Java 多態(tài)性的不同表現(xiàn)。重寫 Overriding是父類與子類之間多態(tài)性的一種 表現(xiàn),重載Overloading是一個類中多態(tài)性的一種表現(xiàn)。 52、垃圾回收器的基本原理是什么?垃圾回收器可以馬上回收內(nèi)存嗎?有什么辦法主動通知虛擬機進行垃圾回收 答:對于 GC 來說,當(dāng)程序員創(chuàng)建對象時,GC 就開始監(jiān)控這個對象的地址、大小以及使用 情況。通常,GC采用有向圖的方式記錄和管理堆(heap)中的所有對象。通過這種方式確定哪些對象是'可達的',哪些對象是'不可達的'。當(dāng)GC確定一些對象為'不可達'時,GC 就有責(zé)任回收這些內(nèi)存空間。可以。程序員可以手動執(zhí)行 System.gc(),通知GC運行,但是Java語言規(guī)范 并不保證GC一定會執(zhí)行。 53、靜態(tài)變量和實例變量的區(qū)別? 答:static i = 10; //常量 class A a; a.i =10;//可變 54、什么是java序列化,如何實現(xiàn) java序列化? 答:序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內(nèi)容進行流化???/p> 以對流化后的對象進行讀寫操作,也可將流化后的對象傳輸于網(wǎng)絡(luò)之間。序列化是為了解決在對對象流進行讀寫操作時所引發(fā)的問題。 序列化的實現(xiàn):將需要被序列化的類實現(xiàn) Serializable 接口,該接口沒有需要實現(xiàn)的方法,implements Serializable 只是 為了標(biāo)注該對象是可被序列化的,然后使用一個輸出流(如:FileOutputStream)來構(gòu)造一個ObjectOutputStream(對象流) 對象,接著,使用 ObjectOutputStream 對象的 writeObject(Object obj)方法就可以將參數(shù)為obj的對象寫出(即保存其狀態(tài)),要恢復(fù)的話則用輸入流。 55、是否可以從一個static方法內(nèi)部發(fā)出對非static方法的調(diào)用? 答:不可以,如果其中包含對象的 method();不能保證對象初始化. 56、寫clone()方法時,通常都有一行代碼,是什么? 答:Clone 有缺省行為,super.clone();他負責(zé)產(chǎn)生正確大小的空間,并逐位復(fù)制。 57、在JAVA中,如何跳出當(dāng)前的多重嵌套循環(huán)? 答:用break; return 方法。 58、List、Map、Set三個接口,存取元素時,各有什么特點? 答:List 以特定次序來持有元素,可有重復(fù)元素。Set 無法擁有重復(fù)元素,內(nèi)部排序。Map 保存key-value 值,value 可多值。 59、說出一些常用的類,包,接口,請各舉5 個 答:常用的類:BufferedReader BufferedWriter FileReader FileWirter String Integer 常用的包:java.lang java.awt java.io java.util java.sql 常用的接口:Remote List Map Document NodeList 60、java 中有幾種方法可以實現(xiàn)一個線程?用什么關(guān)鍵字修飾同步方法? stop()和 suspend()方法為何不推薦使用? 答:有兩種實現(xiàn)方法,分別是繼承 Thread類與實現(xiàn)Runnable接口 用synchronized關(guān)鍵字修飾同步方法 反對使用stop(),是因為它不安全。它會解除由線程獲取的所有鎖定,而且如果對象處于一種不連貫狀態(tài),那么其他線程 能在那種狀態(tài)下檢查和修改它們。結(jié)果很難檢查出真正的問題所在。suspend()方法容易發(fā)生死鎖。調(diào)用suspend()的時候,目標(biāo)線程會停下來,但卻仍然持有在這之前獲得的鎖定。此時,其他任何線程都不能訪問鎖定的資源,除非被'掛起' 的線程恢復(fù)運行。對任何線程來說,如果它們想恢復(fù)目標(biāo)線程,同時又試圖使用任何一個鎖定的資源,就會造成死鎖。所 以不應(yīng)該使用suspend(),而應(yīng)在自己的Thread類中置入一個標(biāo)志,指出線程應(yīng)該活動還是掛起。若標(biāo)志指出線程應(yīng)該掛 起,便用wait()命其進入等待狀態(tài)。若標(biāo)志指出線程應(yīng)當(dāng)恢復(fù),則用一個 notify()重新啟動線程。 61、sleep() 和 wait() 有什么區(qū)別? 答:sleep 是線程類(Thread)的方法,導(dǎo)致此線程暫停執(zhí)行指定時間,給執(zhí)行機會給其他線程,但是監(jiān)控狀態(tài)依然保持, 到時后會自動恢復(fù)。調(diào)用 sleep不會釋放對象鎖。 wait 是 Object 類的方法,對此對象調(diào)用 wait 方法導(dǎo)致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發(fā)出notify 方法(或notifyAll)后本線程才進入對象鎖定池準(zhǔn)備獲得對象鎖進入運行狀態(tài)。 62、同步和異步有何異同,在什么情況下分別使用他們?舉例說明。 答:如果數(shù)據(jù)將在線程間共享。例如正在寫的數(shù)據(jù)以后可能被另一個線程讀到,或者正在讀的數(shù)據(jù)可能已經(jīng)被另一個線程 寫過了,那么這些數(shù)據(jù)就是共享數(shù)據(jù),必須進行同步存取。 當(dāng)應(yīng)用程序在對象上調(diào)用了一個需要花費很長時間來執(zhí)行的方法,并且不希望讓程序等待方法的返回時,就應(yīng)該使用異步編程,在很多情況下采用異步途徑往往更有效率。 63、啟動一個線程是用 run()還是start()? 答:啟動一個線程是調(diào)用 start()方法,使線程所代表的虛擬處理機處于可運行狀態(tài),這意味著它可以由JVM調(diào)度并執(zhí)行。 這并不意味著線程就會立即運行。run()方法可以產(chǎn)生必須退出的標(biāo)志來停止一個線程。 64、當(dāng)一個線程進入一個對象的一個synchronized方法后,其它線程是否可進入此對象的其它方法? 答:不能,一個對象的一個 synchronized方法只能由一個線程訪問。 65、請說出你所知道的線程同步的方法。 答:wait():使一個線程處于等待狀態(tài),并且釋放所持有的對象的 lock。sleep():使一個正在運行的線程處于睡眠狀態(tài),是一個靜態(tài)方法,調(diào)用此方法要捕捉InterruptedException 異常。 notify():喚醒一個處于等待狀態(tài)的線程,注意的是在調(diào)用此方法的時候,并不能確切的喚醒某一個等待狀態(tài)的線程,而是由JVM確定喚醒哪個線程,而且不是按優(yōu)先級。 Allnotity():喚醒所有處入等待狀態(tài)的線程,注意并不是給所有喚醒線程一個對象的鎖,而是讓它們競爭。 66、多線程有幾種實現(xiàn)方法,都是什么?同步有幾種實現(xiàn)方法,都是什么? 答:多線程有兩種實現(xiàn)方法,分別是繼承Thread類與實現(xiàn) Runnable 接口 同步的實現(xiàn)方面有兩種,分別是 synchronized,wait 與 notify 67、線程的基本概念、線程的基本狀態(tài)以及狀態(tài)之間的關(guān)系 答:線程指在程序執(zhí)行過程中,能夠執(zhí)行程序代碼的一個執(zhí)行單位,每個程序至少都有一個線程,也就是程序本身。 Java中的線程有四種狀態(tài)分別是:運行、就緒、掛起、結(jié)束 68、簡述synchronized和java.util.concurrent.locks.Lock的異同 ? 答:主要相同點:Lock能完成synchronized所實現(xiàn)的所有功能 主要不同點:Lock 有比 synchronized 更精確的線程語義和更好的性能。synchronized 會自動釋放鎖,而Lock一定要求程序 員手工釋放,并且必須在 finally從句中釋放。 Jdbc方面 69、Class.forName的作用?為什么要用? 答:調(diào)用該訪問返回一個以字符串指定類名的類的對象。 70、Jdo是什么? 答:JDO是Java對象持久化的新的規(guī)范,為 java data object的簡稱,也是一個用于存取某種數(shù)據(jù)倉庫中的對象的標(biāo)準(zhǔn)化 API。JDO提供了透明的對象存儲,因此對開發(fā)人員來說,存儲數(shù)據(jù)對象完全不需要額外的代碼(如JDBC API的使用)。這些繁瑣的例行工作已經(jīng)轉(zhuǎn)移到 JDO 產(chǎn)品提供商身上,使開發(fā)人員解脫出來,從而集中時間和精力在業(yè)務(wù)邏輯上。另外,JDO很靈活,因為它可以在任何數(shù)據(jù)底層上運行。JDBC 只是面向關(guān)系數(shù)據(jù)庫(RDBMS)JDO 更通用,提供到任何數(shù)據(jù)底層的存儲功能, 比如關(guān)系數(shù)據(jù)庫、文件、XML以及對象數(shù)據(jù)庫(ODBMS)等等,使得應(yīng)用可移植性更強。 71、說出數(shù)據(jù)連接池的工作機制是什么? 答:J2EE 服務(wù)器啟動時會建立一定數(shù)量的池連接,并一直維持不少于此數(shù)目的池連接??蛻舳顺绦蛐枰B接時,池驅(qū)動程 序會返回一個未使用的池連接并將其表記為忙。如果當(dāng)前沒有空閑連接,池驅(qū)動程序就新建一定數(shù)量的連接,新建連接的 數(shù)量有配置參數(shù)決定。當(dāng)使用的池連接調(diào)用完成后,池驅(qū)動程序?qū)⒋诉B接表記為空閑,其他調(diào)用就可以使用這個連接。 Xml方面 72、xml有哪些解析技術(shù)?區(qū)別是什么? 答:有DOM,SAX,STAX等 DOM:處理大型文件時其性能下降的非常厲害。這個問題是由 DOM的樹結(jié)構(gòu)所造成的,這種結(jié)構(gòu)占用的內(nèi)存較多,而且 DOM必須在解析文件之前把整個文檔裝入內(nèi)存,適合對XML的隨機訪問SAX:不現(xiàn)于DOM,SAX是事件驅(qū)動型的XML解析方式。它順序讀取 XML 文件,不需要一次全部裝載整個文件。當(dāng)遇到像文件開頭,文檔結(jié)束,或者標(biāo)簽開頭與標(biāo)簽結(jié)束時,它會觸發(fā)一個事件,用戶通過在其回調(diào)事件中寫入處理代碼來處理XML文件,適合對XML的順序訪問 STAX:Streaming API for XML (StAX) 73、你在項目中用到了 xml技術(shù)的哪些方面?如何實現(xiàn)的? 答:用到了數(shù)據(jù)存貯,信息配置兩方面。在做數(shù)據(jù)交換平臺時,將不能數(shù)據(jù)源的數(shù)據(jù)組裝成XML文件,然后將XML文件壓縮 打包加密后通過網(wǎng)絡(luò)傳送給接收者,接收解密與解壓縮后再同 XML 文件中還原相關(guān)信息進行處理。在做軟件配置時,利用XML可以很方便的進行,軟件的各種配置參數(shù)都存貯在XML文件中。 74、XML文檔定義有幾種形式?它們之間有何本質(zhì)區(qū)別?解析 XML 文檔有哪幾種方式? 答:a: 兩種形式 dtd schema,b: 本質(zhì)區(qū)別:schema本身是xml的,可以被XML 解析器解析(這也是從DTD上發(fā)展 schema的根本目的),c:有DOM,SAX,STAX等 DOM:處理大型文件時其性能下降的非常厲害。這個問題是由 DOM的樹結(jié)構(gòu)所造成的,這種 結(jié)構(gòu)占用的內(nèi)存較多,而且DOM必須在解析文件之前把整個文檔裝入內(nèi)存,適合對 XML 的隨機訪問 SAX:不現(xiàn)于DOM,SAX 是事件驅(qū)動型的 XML 解析方式。它順序讀取XML 文件,不需要一次全部裝載整個文件。當(dāng)遇到像文件開頭,文檔結(jié)束,或者標(biāo)簽開頭與標(biāo)簽結(jié)束時,它會觸發(fā)一個事件,用戶通過在其回調(diào)事件中寫入處理代碼來處理XML文件, 適合對XML 的順序訪問STAX:Streaming API for XML (StAX) EJB 方面 J2EE,MVC方面 75、MVC的各個部分都有那些技術(shù)來實現(xiàn)?如何實現(xiàn)? 答:MVC 是 Model-View-Controller 的簡寫。'Model' 代表的是應(yīng)用的業(yè)務(wù)邏輯(通過JavaBean,EJB 組件實現(xiàn)),'View' 是應(yīng)用的表示面(由 JSP頁面產(chǎn)生),'Controller' 是提供應(yīng)用的處理過程控制(一般是一個Servlet),通過這種設(shè)計模型把應(yīng)用邏輯,處理過程和顯示邏輯分成不同的組件實現(xiàn)。這些組件可以進行交互和重用。 76、J2EE 是什么? 答:Je22 是Sun公司提出的多層(multi-diered),分布式(distributed),基于組件(component-base)的企業(yè)級應(yīng)用模型(enterpriese application model).在這樣的一個應(yīng)用系統(tǒng)中,可按照功能劃分為不同的組件,這些組件又可在不同計算機上,并且處于相應(yīng)的層次(tier)中。所屬層次包括客戶層(clietn tier)組件,web 層和組件,Business層和組件,企業(yè)信息系統(tǒng)(EIS)層。 |
|