精選30道Java筆試題解答(轉)

都是一些非常非常基礎的題,是我最近參加各大IT公司筆試后靠記憶記下來的,經過整理獻給與我一樣參加各大IT校園招聘的同學們,純考Java基礎功底, 老手們就不用進來了,免得笑話我們這些未出校門的孩紙們,但是IT公司就喜歡考這些基礎的東西,所以為了能進大公司就~~~當復習期末考吧。花了不少時間整理,在整理過程中也學到了很多東西,請大家認真對待每一題~~~

下面都是我自己的答案非官方,僅供參考,如果有疑問或錯誤請一定要提出來,大家一起進步啦~~~
1. 下面哪些是Thread類的方法()

A start() ? ? ? B run() ? ? ? C exit() ? ? ? D getPriority()

答案:ABD

解析:看Java API docs吧:http://docs.oracle.com/javase/7/docs/api/,exit()是System類的方法,如System.exit(0)。

2. 下面關于java.lang.Exception類的說法正確的是()

A 繼承自Throwable ? ?? B Serialable ? ?? CD 不記得,反正不正確

答案:A

解析:Java異常的基類為java.lang.Throwable,java.lang.Error和java.lang.Exception繼承 Throwable,RuntimeException和其它的Exception等繼承Exception,具體的RuntimeException繼承RuntimeException。

擴展:錯誤和異常的區別(Error vs Exception)?

1)?java.lang.Error: Throwable的子類,用于標記嚴重錯誤。合理的應用程序不應該去try/catch這種錯誤。絕大多數的錯誤都是非正常的,就根本不該出現的。
java.lang.Exception: Throwable的子類,用于指示一種合理的程序想去catch的條件。即它僅僅是一種程序運行條件,而非嚴重錯誤,并且鼓勵用戶程序去catch它。

2)? Error和RuntimeException 及其子類都是未檢查的異常(unchecked exceptions),而所有其他的Exception類都是檢查了的異常(checked exceptions).
checked exceptions:?通常是從一個可以恢復的程序中拋出來的,并且最好能夠從這種異常中使用程序恢復。比如FileNotFoundException, ParseException等。檢查了的異常發生在編譯階段,必須要使用try…catch(或者throws)否則編譯不通過。
unchecked exceptions:?通常是如果一切正常的話本不該發生的異常,但是的確發生了。發生在運行期,具有不確定性,主要是由于程序的邏輯問題所引起的。 比如ArrayIndexOutOfBoundException, ClassCastException等。從語言本身的角度講,程序不該去catch這類異常,雖然能夠從諸如RuntimeException這樣的異 常中catch并恢復,但是并不鼓勵終端程序員這么做,因為完全沒要必要。因為這類錯誤本身就是bug,應該被修復,出現此類錯誤時程序就應該立即停止執 行。 因此,面對Errors和unchecked exceptions應該讓程序自動終止執行,程序員不該做諸如try/catch這樣的事情,而是應該查明原因,修改代碼邏輯。

RuntimeException:RuntimeException體系包括錯誤的類型轉換、數組越界訪問和試圖訪問空指針等等。

處理RuntimeException的原則是: 如果出現 RuntimeException,那么一定是程序員的錯誤。例如,可以通過檢查數組下標和數組邊界來避免數組越界訪問異常。其他 (IOException等等)checked異常一般是外部錯誤,例如試圖從文件尾后讀取數據等,這并不是程序本身的錯誤,而是在應用環境中出現的外部 錯誤。?

?

3. 下面程序的運行結果是()

String str1 = "hello";
String str2 = "he" + new String("llo");
System.err.println(str1 == str2);

答案:false

解析:因為str2中的llo是新申請的內存塊,而==判斷的是對象的地址而非值,所以不一樣。如果是String str2 = str1,那么就是true了。

?

4. 下列說法正確的有()

A. class中的constructor不可省略

B. constructor必須與class同名,但方法不能與class同名

C. constructor在一個對象被new時執行

D.一個class只能定義一個constructor

答案:C?

解析:這里可能會有誤區,其實普通的類方法是可以和類名同名的,和構造方法唯一的區分就是,構造方法沒有返回值。

?

5. 具體選項不記得,但用到的知識如下:

String []a = new String[10];

則:a[0]~a[9] = null

a.length = 10

如果是int []a = new int[10];

則:a[0]~a[9] = 0

a.length = 10

?

6. 下面程序的運行結果:()

復制代碼
    public static void main(String args[]) {Thread t = new Thread() {public void run() {pong();}};t.run();System.out.print("ping");}static void pong() {System.out.print("pong");}
復制代碼

A pingpong ? ? ?? B pongping ? ? ? C pingpong和pongping都有可能 ? ? ? D 都不輸出

答案:B

解 析:這里考的是Thread類中start()和run()方法的區別了。start()用來啟動一個線程,當調用start方法后,系統才會開啟一個新 的線程,進而調用run()方法來執行任務,而單獨的調用run()就跟調用普通方法是一樣的,已經失去線程的特性了。因此在啟動一個線程的時候一定要使 用start()而不是run()。

?

7. 下列屬于關系型數據庫的是()

A. Oracle ? ?B MySql ? ?C IMS ? ? D MongoDB

答案:AB

解答:IMS(Information Management System?)數據庫是IBM公司開發的兩種數據庫類型之一;?

一種是關系數據庫,典型代表產品:DB2;

另一種則是層次數據庫,代表產品:IMS層次數據庫。

非關系型數據庫有MongoDB、memcachedb、Redis等。

?

8. GC線程是否為守護線程?()

答案:是

解析:線程分為守護線程和非守護線程(即用戶線程)。

只要當前JVM實例中尚存在任何一個非守護線程沒有結束,守護線程就全部工作;只有當最后一個非守護線程結束時,守護線程隨著JVM一同結束工作。
守護線程最典型的應用就是 GC (垃圾回收器)

?

9. volatile關鍵字是否能保證線程安全?()

答案:不能

解析:volatile關鍵字用在多線程同步中,可保證讀取的可見性,JVM只是保證從主內存加載到線程工作內存的值是最新的讀取值,而非cache中。但多個線程對

volatile的寫操作,無法保證線程安全。例 如假如線程1,線程2 在進行read,load 操作中,發現主內存中count的值都是5,那么都會加載這個最新的值,在線程1堆count進行修改之后,會write到主內存中,主內存中的 count變量就會變為6;線程2由于已經進行read,load操作,在進行運算之后,也會更新主內存count的變量值為6;導致兩個線程及時用 volatile關鍵字修改之后,還是會存在并發的情況。


10. 下列說法正確的是()

A LinkedList繼承自List

B AbstractSet繼承自Set

C HashSet繼承自AbstractSet

D WeakMap繼承自HashMap

答案:AC

解析:下面是一張下載的Java中的集合類型的繼承關系圖,一目了然。

?

11. 存在使i + 1 < i的數嗎()

答案:存在

解析:如果i為int型,那么當i為int能表示的最大整數時,i+1就溢出變成負數了,此時不就<i了嗎。

擴展:存在使i > j || i <= j不成立的數嗎()

答案:存在

解析:比如Double.NaN或Float.NaN,感謝@BuilderQiu網友指出。

?

12. 0.6332的數據類型是()

A float ? ? B double ? ? C Float ? ?? D Double

答案:B

解析:默認為double型,如果為float型需要加上f顯示說明,即0.6332f

?

13. 下面哪個流類屬于面向字符的輸入流(? )

A? BufferedWriter?????????? B? FileInputStream??? ? ? ? C? ObjectInputStream????????? D? InputStreamReader

?答案:D

?解析:Java的IO操作中有面向字節(Byte)和面向字符(Character)兩種方式。
面向字節的操作為以8位為單位對二進制的數據進行操作,對數據不進行轉換,這些類都是InputStream和OutputStream的子類。
面向字符的操作為以字符為單位對數據進行操作,在讀的時候將二進制數據轉為字符,在寫的時候將字符轉為二進制數據,這些類都是Reader和Writer的子類。

總結:以InputStream(輸入)/OutputStream(輸出)為后綴的是字節流;

????????? 以Reader(輸入)/Writer(輸出)為后綴的是字符流。

擴展:Java流類圖結構,一目了然,解決大部分選擇題:

?

14. Java接口的修飾符可以為()

A private ? ? B protected ??? C final ? ? ? D abstract

答案:CD

解析:接口很重要,為了說明情況,這里稍微啰嗦點:

(1)接口用于描述系統對外提供的所有服務,因此接口中的成員常量和方法都必須是公開(public)類型的,確保外部使用者能訪問它們;

(2)接口僅僅描述系統能做什么,但不指明如何去做,所以接口中的方法都是抽象(abstract)方法;

(3)接口不涉及和任何具體實例相關的細節,因此接口沒有構造方法,不能被實例化,沒有實例變量,只有靜態(static)變量;

(4)接口的中的變量是所有實現類共有的,既然共有,肯定是不變的東西,因為變化的東西也不能夠算共有。所以變量是不可變(final)類型,也就是常量了。

(5) 接口中不可以定義變量?如果接口可以定義變量,但是接口中的方法又都是抽象的,在接口中無法通過行為來修改屬性。有的人會說了,沒有關系,可以通過 實現接口的對象的行為來修改接口中的屬性。這當然沒有問題,但是考慮這樣的情況。如果接口 A 中有一個public 訪問權限的靜態變量 a。按照 Java 的語義,我們可以不通過實現接口的對象來訪問變量 a,通過 A.a = xxx; 就可以改變接口中的變量 a 的值了。正如抽象類中是可以這樣做的,那么實現接口 A 的所有對象也都會自動擁有這一改變后的 a 的值了,也就是說一個地方改變了 a,所有這些對象中 a 的值也都跟著變了。這和抽象類有什么區別呢,怎么體現接口更高的抽象級別呢,怎么體現接口提供的統一的協議呢,那還要接口這種抽象來做什么呢?所以接口中 不能出現變量,如果有變量,就和接口提供的統一的抽象這種思想是抵觸的。所以接口中的屬性必然是常量,只能讀不能改,這樣才能為實現接口的對象提供一個統 一的屬性。

通俗的講,你認為是要變化的東西,就放在你自己的實現中,不能放在接口中去,接口只是對一類事物的屬性和行為更高層次的抽象。對修改關閉,對擴展(不同的實現 implements)開放,接口是對開閉原則的一種體現。

所以:

接口的方法默認是public abstract;

接口中不可以定義變量即只能定義常量(加上final修飾就會變成常量)。所以接口的屬性默認是public static final 常量,且必須賦初值。

注意:final和abstract不能同時出現。

?

15. 不通過構造函數也能創建對象嗎()

A 是 ? ? B 否

答案:A

解析:Java創建對象的幾種方式(重要):

(1) 用new語句創建對象,這是最常見的創建對象的方法。
(2) 運用反射手段,調用java.lang.Class或者java.lang.reflect.Constructor類的newInstance()實例方法。
(3) 調用對象的clone()方法。
(4) 運用反序列化手段,調用java.io.ObjectInputStream對象的 readObject()方法。

(1)和(2)都會明確的顯式的調用構造函數 ;(3)是在內存上對已有對象的影印,所以不會調用構造函數 ;(4)是從文件中還原類的對象,也不會調用構造函數。

?

16. ArrayList list = new ArrayList(20);中的list擴充幾次()

A 0 ? ? B 1 ? ? C 2 ? ?? D 3

答案:A

解析:這里有點迷惑人,大家都知道默認ArrayList的長度是10個,所以如果你要往list里添加20個元素肯定要擴充一次(擴充為原來的1.5倍),但是這里顯示指明了需要多少空間,所以就一次性為你分配這么多空間,也就是不需要擴充了。

?

17. 下面哪些是對稱加密算法()

A DES ? B AES ? C DSA ? D RSA

答案:AB

解析:常用的對稱加密算法有:DES、3DES、RC2、RC4、AES

常用的非對稱加密算法有:RSA、DSA、ECC

使用單向散列函數的加密算法:MD5、SHA

?

18.新建一個流對象,下面哪個選項的代碼是錯誤的?()

A)new BufferedWriter(new FileWriter("a.txt"));

B)new BufferedReader(new FileInputStream("a.dat"));

C)new GZIPOutputStream(new FileOutputStream("a.zip"));

D)new ObjectInputStream(new FileInputStream("a.dat"));

答案:B

解析:請記得13題的那個圖嗎?Reader只能用FileReader進行實例化。

?

19. 下面程序能正常運行嗎()

復制代碼
public class NULL {public static void haha(){System.out.println("haha");}public static void main(String[] args) {((NULL)null).haha();}}
復制代碼

答案:能正常運行

解析:輸出為haha,因為null值可以強制轉 換為任何java類類型,(String)null也是合法的。但null強制轉換后是無效對象,其返回值還是為null,而static方法的調用是和 類名綁定的,不借助對象進行訪問所以能正確輸出。反過來,沒有static修飾就只能用對象進行訪問,使用null調用對象肯定會報空指針錯了。這里和 C++很類似。這里感謝@Florian網友解答。

?

20. 下面程序的運行結果是什么()

復制代碼
class HelloA {public HelloA() {System.out.println("HelloA");}{ System.out.println("I'm A class"); }static { System.out.println("static A"); }}public class HelloB extends HelloA {public HelloB() {System.out.println("HelloB");}{ System.out.println("I'm B class"); }static { System.out.println("static B"); }public static void main(String[] args) { new HelloB(); }}
復制代碼

答案:

static A
static B
I'm A class
HelloA
I'm B class
HelloB

解析:說實話我覺得這題很好,考查靜態語句塊、構造語句塊(就是只有大括號的那塊)以及構造函數的執行順序。

對象的初始化順序:(1)類加載之后,按從上到下(從父類到子類)執行被static修飾的語句;(2)當static語句執行完之后,再執行main方法;(3)如果有語句new了自身的對象,將從上到下執行構造代碼塊、構造器(兩者可以說綁定在一起)。

下面稍微修改下上面的代碼,以便更清晰的說明情況:

復制代碼
class HelloA {public HelloA() {System.out.println("HelloA");}{ System.out.println("I'm A class"); }static { System.out.println("static A"); }}public class HelloB extends HelloA {public HelloB() {System.out.println("HelloB");}{ System.out.println("I'm B class"); }static { System.out.println("static B"); }public static void main(String[] args) {System.out.println("-------main start-------");new HelloB();new HelloB();System.out.println("-------main end-------");}
}
復制代碼

此時輸出結果為:

復制代碼
static A
static B
-------main start-------
I'm A class
HelloA
I'm B class
HelloB
I'm A class
HelloA
I'm B class
HelloB
-------main end-------
復制代碼

?

21. getCustomerInfo()方法如下,try中可以捕獲三種類型的異常,如果在該方法運行中產生了一個IOException,將會輸出什么結果()

復制代碼
    public void getCustomerInfo() {try {// do something that may cause an Exception} catch (java.io.FileNotFoundException ex) {System.out.print("FileNotFoundException!");} catch (java.io.IOException ex) {System.out.print("IOException!");} catch (java.lang.Exception ex) {System.out.print("Exception!");}}
復制代碼

A IOException!

BIOException!Exception!

CFileNotFoundException!IOException!

DFileNotFoundException!IOException!Exception!

答案:A

解 析:考察多個catch語句塊的執行順序。當用多個catch語句時,catch語句塊在次序上有先后之分。從最前面的catch語句塊依次先后進行異常 類型匹配,這樣如果父異常在子異常類之前,那么首先匹配的將是父異常類,子異常類將不會獲得匹配的機會,也即子異常類型所在的catch語句塊將是不可到 達的語句。所以,一般將父類異常類即Exception老大放在catch語句塊的最后一個。

?

22. 下面代碼的運行結果為:()

復制代碼
import java.io.*;
import java.util.*;public class foo{public static void main (String[] args){String s;System.out.println("s=" + s);}}
復制代碼

A 代碼得到編譯,并輸出“s=”

B 代碼得到編譯,并輸出“s=null”

C 由于String s沒有初始化,代碼不能編譯通過

D 代碼得到編譯,但捕獲到?NullPointException異常

答案:C

解析:開始以為會輸出null什么的,運行后才發現Java中所有定義的基本類型或對象都必須初始化才能輸出值。

?

23. ?System.out.println("5" + 2);的輸出結果應該是()。

A 52?????????????????? B7???????????????????? C2?????????????? ??????D5

答案:A

解析:沒啥好說的,Java會自動將2轉換為字符串。

?

24.?指出下列程序運行的結果?()

復制代碼
public class Example {String str = new String("good");char[] ch = { 'a', 'b', 'c' };public static void main(String args[]) {Example ex = new Example();ex.change(ex.str, ex.ch);System.out.print(ex.str + " and ");System.out.print(ex.ch);}public void change(String str, char ch[]) {str = "test ok";ch[0] = 'g';}
}
復制代碼

A、?good and abc

B、?good and gbc

C、?test ok and abc

D、?test ok and gbc?

答案:B

解析:大家可能以為Java中String和數組都是對象所以肯定是對象引用,然后就會選D,其實這是個很大的誤區:因為在java里沒有引用傳遞,只有值傳遞

這個值指的是實參的地址的拷貝,得到這個拷貝地址后,你可以通過它修改這個地址的內容(引用不變),因為此時這個內容的地址和原地址是同一地址,

但是你不能改變這個地址本身使其重新引用其它的對象,也就是值傳遞,可能說的不是很清楚,下面給出一個完整的能說明情況的例子吧:

復制代碼
package test;/*** @description Java中沒有引用傳遞只有值傳遞* * @author Alexia* @date 2013-10-16* */
class Person {private String name;private String sex;public Person(String x, String y) {this.name = x;this.sex = y;}// 重寫toString()方法,方便輸出public String toString() {return name + " " + sex;}// 交換對象引用public static void swapObject(Person p1, Person p2) {Person tmp = p1;p1 = p2;p2 = tmp;}// 交換基本類型public static void swapInt(int a, int b) {int tmp = a;a = b;b = tmp;}// 交換對象數組public static void swapObjectArray(Person[] p1, Person[] p2) {Person[] tmp = p1;p1 = p2;p2 = tmp;}// 交換基本類型數組public static void swapIntArray(int[] x, int[] y) {int[] tmp = x;x = y;y = tmp;}// 改變對象數組中的內容public static void changeObjectArray(Person[] p1, Person[] p2) {Person tmp = p1[1];p1[1] = p2[1];p2[1] = tmp;// 再將p1[1]修改Person p = new Person("wjl", "male");p1[1] = p;}// 改變基本類型數組中的內容public static void changeIntArray(int[] x, int[] y) {int tmp = x[1];x[1] = y[1];y[1] = tmp;x[1] = 5;}
}public class ByValueTest {public static void main(String[] args) {// 建立并構造兩個對象Person p1 = new Person("Alexia", "female");Person p2 = new Person("Edward", "male");System.out.println("對象交換前:p1 = " + p1.toString());System.out.println("對象交換前:p2 = " + p2.toString());// 交換p1對象和p2對象Person.swapObject(p1, p2);// 從交換結果中看出,實際對象并未交換System.out.println("\n對象交換后:p1 = " + p1.toString());System.out.println("對象交換后:p2 = " + p2.toString());// 建立兩個對象數組Person[] arraya = new Person[2];Person[] arrayb = new Person[2];// 分別構造數組對象arraya[0] = new Person("Alexia", "female");arraya[1] = new Person("Edward", "male");arrayb[0] = new Person("jmwang", "female");arrayb[1] = new Person("hwu", "male");System.out.println('\n' + "對象數組交換前:arraya[0] = "+ arraya[0].toString() + ", arraya[1] = "+ arraya[1].toString());System.out.println("對象數組交換前:arrayb[0] = "+ arrayb[0].toString() + ", arrayb[1] = "+ arrayb[1].toString());// 交換這兩個對象數組Person.swapObjectArray(arraya, arrayb);System.out.println('\n' + "對象數組交換后:arraya[0] = "+ arraya[0].toString() + ", arraya[1] = "+ arraya[1].toString());System.out.println("對象數組交換后:arrayb[0] = "+ arrayb[0].toString() + ", arrayb[1] = "+ arrayb[1].toString());// 建立兩個普通數組int[] a = new int[2];int[] b = new int[2];// 給數組個元素賦值for (int i = 0; i < a.length; i++) {a[i] = i;b[i] = i + 1;}System.out.println('\n' + "基本類型數組交換前:a[0] = " + a[0] + ", a[1] = " + a[1]);System.out.println("基本類型數組交換前:b[0] = " + b[0] + ", b[1] = " + b[1]);// 交換兩個基本類型數組Person.swapIntArray(a, b);System.out.println('\n' + "基本類型數組交換后:a[0] = " + a[0] + ", a[1] = " + a[1]);System.out.println("基本類型數組交換后:b[0] = " + b[0] + ", b[1] = " + b[1]);// 改變對象數組的內容Person.changeObjectArray(arraya, arrayb);System.out.println('\n' + "對象數組內容交換并改變后:arraya[1] = " + arraya[1].toString());System.out.println("對象數組內容交換并改變后:arrayb[1] = " + arrayb[1].toString());// 改變基本類型數組的內容Person.changeIntArray(a, b);System.out.println('\n' + "基本類型數組內容交換并改變后:a[1] = " + a[1]);System.out.println("基本類型數組內容交換并改變后:b[1] = " + b[1]);}
}
復制代碼

程序有些啰嗦,但能反映問題,該程序運行結果為:

復制代碼
對象交換前:p1 = Alexia female
對象交換前:p2 = Edward male對象交換后:p1 = Alexia female
對象交換后:p2 = Edward male對象數組交換前:arraya[0] = Alexia female, arraya[1] = Edward male
對象數組交換前:arrayb[0] = jmwang female, arrayb[1] = hwu male對象數組交換后:arraya[0] = Alexia female, arraya[1] = Edward male
對象數組交換后:arrayb[0] = jmwang female, arrayb[1] = hwu male基本類型數組交換前:a[0] = 0, a[1] = 1
基本類型數組交換前:b[0] = 1, b[1] = 2基本類型數組交換后:a[0] = 0, a[1] = 1
基本類型數組交換后:b[0] = 1, b[1] = 2對象數組內容交換并改變后:arraya[1] = wjl male
對象數組內容交換并改變后:arrayb[1] = Edward male基本類型數組內容交換并改變后:a[1] = 5
基本類型數組內容交換并改變后:b[1] = 1
復制代碼

說明:不管是對象、基本類型還是對象數組、基本類型數組,在函數中都不能改變其實際地址但能改變其中的內容。

?
25.?要從文件"file.dat"中讀出第10個字節到變量c中,下列哪個方法適合??()

A?FileInputStream in=new FileInputStream("file.dat"); in.skip(9); int c=in.read();

B?FileInputStream in=new FileInputStream("file.dat"); in.skip(10); int c=in.read();

C?FileInputStream in=new FileInputStream("file.dat"); int c=in.read();

D?RandomAccessFile in=new RandomAccessFile("file.dat"); in.skip(9); int c=in.readByte();

答案:A?D?

解析:long skip(long n)作用是跳過n個字節不讀,主要用在包裝流中的,因為一般流(如FileInputStream)只 能順序一個一個的讀不能跳躍讀,但是包裝流可以用skip方法跳躍讀取。那么什么是包裝流呢?各種字節節點流類,它們都只具有讀寫字節內容的方法,以 FileInputStream與FileOutputStream為例,它們只能在文件中讀取或者向文件中寫入字節,在實際應用中我們往往需要在文件中 讀取或者寫入各種類型的數據,就必須先將其他類型的數據轉換成字節數組后寫入文件,或者從文件中讀取到的字節數組轉換成其他數據類型,想想都很麻煩!!因 此想通過FileOutputStream將一個浮點小數寫入到文件中或將一個整數寫入到文件時是非常困難的。這時就需要包裝類DataInputStream/DataOutputStream,它提供了往各種輸入輸出流對象中讀入或寫入各種類型的數據的方法。

DataInputStream/DataOutputStream并沒有對應到任何具體的流設備,一定要給它傳遞一個對應具體流設備的輸入或輸出流對象,完成類似 DataInputStream/DataOutputStream功 能的類就是一個包裝類,也叫過濾流類或處理流類。它對InputOutStream/OutputStream流類進行了包裝,使編程人員使用起來更方 便。其中DataInputStream包裝類的構造函數語法:public DataInputStream(InputStream in)。包裝類也可以包裝另外一個包裝類。

首先BC肯定 是錯的,那A正確嗎?按上面的解析應該也不對,但我試了下,發現A也是正確的,與網上解析的資料有些出入,下面是我的code:

復制代碼
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class FileStreamTest {public static void main(String[] args) throws IOException {// TODO Auto-generated method stubFileOutputStream out = new FileOutputStream("file.dat");byte[] b = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };out.write(b);out.close();FileInputStream in = new FileInputStream("file.dat");in.skip(9); // 跳過前面的9個字節int c = in.read();System.out.println(c);  // 輸出為10in.close();}}
復制代碼

那么D呢,RandomAccessFile是IO包的類,但是其自成一派,從Object直接繼承而來。可以對文件進行讀取和寫入。支持文件的隨機訪問,即可以隨機讀取文件中的某個位置內容,這么說RandomAccessFile肯定可以達到題目的要求,但是選項有些錯誤,比如RandomAccessFile的初始化是兩個參數而非一個參數,采用的跳躍讀取方法是skipBytes()而非skip(),即正確的寫法是:

RandomAccessFile in = new RandomAccessFile("file.dat", "r");
in.skipBytes(9);
int c = in.readByte();

這樣也能讀到第十個字節,也就是A和D都能讀到第十個字節,那么到底該選哪個呢?A和D有啥不同嗎?求大神解答~~~

?

26.?下列哪種異常是檢查型異常,需要在編寫程序時聲明?()

ANullPointerException??????? BClassCastException????? CFileNotFoundException?????? D IndexOutOfBoundsException?

答案:C

解析:看第2題的解析。

?

27. 下面的方法,當輸入為2的時候返回值是多少?()

復制代碼
    public static int getValue(int i) {int result = 0;switch (i) {case 1:result = result + i;case 2:result = result + i * 2;case 3:result = result + i * 3;}return result;}
復制代碼

A0??????????????????? B2??????????????????? C4???????????????????? D10

答案:D

解析:注意這里case后面沒有加break,所以從case 2開始一直往下運行。

?

28.?選項中哪一行代碼可以替換題目中//add code here而不產生編譯錯誤?()

復制代碼
public abstract class MyClass {
public int constInt = 5;//add code herepublic void method() {} }
復制代碼

Apublic abstract void method(int a);

B constInt = constInt + 5;

C public int method();

D public abstract void anotherMethod() {}

答案:A

解析:考察抽象類的使用。

抽象類遵循的原則:

(1)abstract關鍵字只能修飾類和方法,不能修飾字段。
(2)抽象類不能被實例化(無法使用new關鍵字創建對象實例),只能被繼承。
(3)抽象類可以包含屬性,方法,構造方法,初始化塊,內部類,枚舉類,和普通類一樣,普通方法一定要實現,變量可以初始化或不初始化但不能初始化后在抽象類中重新賦值或操作該變量(只能在子類中改變該變量)。
(4)抽象類中的抽象方法(加了abstract關鍵字的方法)不能實現。
(5)含有抽象方法的類必須定義成抽象類。
擴展:抽象類和接口的區別,做個總結吧:

(1)接口是公開的,里面不能有私有的方法或變量,是用于讓別人使用的,而抽象類是可以有私有方法或私有變量的。

(2)abstract class 在 Java 語言中表示的是一種繼承關系,一個類只能使用一次繼承關系。但是,一個類卻可以實現多個interface,實現多重繼承。接口還有標識(里面沒有任何方法,如Remote接口)和數據共享(里面的變量全是常量)的作用。

(3)在abstract class 中可以有自己的數據成員,也可以有非abstarct的成員方法,而在interface中,只能夠有靜態的不能被修改的數據成員(也就是必須是 static final的,不過在 interface中一般不定義數據成員),所有的成員方法默認都是 public abstract 類型的。

(4)abstract class和interface所反映出的設計理念不同。其實abstract class表示的是"is-a"關系,interface表示的是"has-a"關系。

(5)實現接口的一定要實現接口里定義的所有方法,而實現抽象類可以有選擇地重寫需要用到的方法,一般的應用里,最頂級的是接口,然后是抽象類實現接口,最后才到具體類實現。抽象類中可以有非抽象方法。接口中則不能有實現方法。

(6)接口中定義的變量默認是public static final 型,且必須給其初值,所以實現類中不能重新定義,也不能改變其值。抽象類中的變量默認是 friendly 型,其值可以在子類中重新定義,也可以在子類中重新賦值。

?

29. 閱讀Shape和Circle兩個類的定義。在序列化一個Circle的對象circle到文件時,下面哪個字段會被保存到文件中??(? )

復制代碼
class Shape {public String name;}class Circle extends Shape implements Serializable{private float radius;transient int color;public static String type = "Circle";}
復制代碼

Aname

B radius

C color

D type

答案:B

解析:這里有詳細的解釋:http://www.cnblogs.com/lanxuezaipiao/p/3369962.html

?

30.下面是People和Child類的定義和構造方法,每個構造方法都輸出編號。在執行new Child("mike")的時候都有哪些構造方法被順序調用?請選擇輸出結果?( )

復制代碼
class People {String name;public People() {System.out.print(1);}public People(String name) {System.out.print(2);this.name = name;}
}class Child extends People {People father;public Child(String name) {System.out.print(3);this.name = name;father = new People(name + ":F");}public Child() {System.out.print(4);}}
復制代碼

A312????????????? B 32?????????????? C 432????????????? D 132

答案:D

解析:考察的又是父類與子類的構造函數調用次序。在Java中,子類的構造過程中必須調用其父類的構造函數,是因為有繼承關系存在時,子類要把父類的內容繼承下來。但如果父類有多個構造函數時,該如何選擇調用呢?

第一個規則:子類的構造過程中,必須調用其父類的構造方法。一個類,如果我們不寫構造方法,那么編譯器會幫我們加上一個默認的構造方法(就是沒有參數的構造方法),但是如果你自己寫了構造方法,那么編譯器就不會給你添加了,所以有時候當你new一個子類對象的時候,肯定調用了子類的構造方法,但是如果在子類構造方法中我們并沒有顯示的調用基類的構造方法,如:super();??這樣就會調用父類沒有參數的構造方法。????

第二個規則:如果子類的構造方法中既沒有顯示的調用基類構造方法,而基類中又沒有無參的構造方法,則編譯出錯,所以,通常我們需要顯示的:super(參數列表),來調用父類有參數的構造函數,此時無參的構造函數就不會被調用。

總之,一句話:子類沒有顯示調用父類構造函數,不管子類構造函數是否帶參數都默認調用父類無參的構造函數,若父類沒有則編譯出錯。

?

最后,給大家出個思考題:下面程序的運行結果是什么?

復制代碼
public class Dervied extends Base {private String name = "dervied";public Dervied() {tellName();printName();}public void tellName() {System.out.println("Dervied tell name: " + name);}public void printName() {System.out.println("Dervied print name: " + name);}public static void main(String[] args){new Dervied();    }
}class Base {private String name = "base";public Base() {tellName();printName();}public void tellName() {System.out.println("Base tell name: " + name);}public void printName() {System.out.println("Base print name: " + name);}
}

結果是:Dervied tell name: null
Dervied print name: null
Dervied tell name: dervied
Dervied print name: dervied


復制代碼


作者:Alexia(minmin)
如果您認為閱讀這篇博客讓您有些收獲,不妨點擊一下右下角的【推薦】
如果您希望與我交流互動,歡迎微博互粉
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

轉載于:https://www.cnblogs.com/jianmang/articles/4986794.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374103.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374103.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374103.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

list取值_Redis中List及quicklist實現-2

上一篇中看了List的使用方式、quicklist中的各個結構體&#xff0c;這一篇來看看quicklist里面的幾個核心函數&#xff0c;quicklistCreate函數、quicklistCreateNode函數、quicklistPush函數、quicklistPop函數。接下來我們通過源碼看一下quicklist中是如何借鑒STL中deque的這…

通過示例休眠–第1部分(刪除孤兒)

所以我想做一系列的冬眠例子&#xff0c;展示冬眠的各種特征。 在第一部分中&#xff0c;我想展示有關刪除孤兒功能及其在故事情節中的使用方法。 因此&#xff0c;讓我們開始:) 先決條件 &#xff1a; 為了嘗試以下示例&#xff0c;您將需要以下提到的JAR文件&#xff1a; …

站長工具--IP地址庫

中國最全的IP地址庫 轉載于:https://www.cnblogs.com/weloveshare/p/5783438.html

String使用注意一

public class StringNote{ public static void main(String[] args){ char[] c{h,e,l,l,o}; String str1new String(c); String str2new String(c); String str3"hello"; //常量池中有 “hello” 字符串&#xff0c;str3和str4分別指向他 String str4"…

Win10手記-IIS部署網站問題解決

最近在自己的Win10電腦上嘗試部署ASP.NET網站時出現了問題&#xff0c;經過多方查找定位到IIS為問題來源。 開始之前 先描述下技術環境&#xff1a; 1.Windows 10 PC 2.Windows 自帶的IIS 7 3.ASP.NET Web API項目網站 4.VS 2015 問題描述 首先我們為PC安裝IIS&#xff0c;按照…

python隨機數生成的方法_python生成隨機數的方法

一、概述python可以通過random包來產生隨機數或者執行一些隨機操作。1. random.seed()給定一個數據作為隨機數種子&#xff0c;和大多數語言一樣&#xff0c;python也可以使用時間來作為隨機數種子。import timetime.seed(time.time())12importtimetime.seed(time.time())2. ra…

Java模塊化方法–模塊,模塊,模塊

我認為每個人都會同意&#xff0c;編寫模塊化應用程序和模塊化通常是一件好事。 但是&#xff0c;從Java和Scala語言以及各種Java / Scala框架來看&#xff0c;對模塊化的支持是怎樣的呢&#xff1f; 有很多不同的方法&#xff01; 讓我們看看其中的一些。 “保護”以下是指模塊…

CentOS 7 安裝記錄

由于centos6.4版本有點老&#xff0c;所以換到centos7。 1.安裝 CentOS 7.0系統安裝配置圖解教程 2.linux設置網卡開機啟動 實質linux是看一個網卡文件的配置&#xff0c;就是/etc/sysconfig/network-scripts/ifcfg-eth0 (這個文件名看你網卡名稱而異&#xff0c;具體你到該目錄…

String使用注意二

public class StringNote_1{ public void fun(){ for(int i1;i<100;i){ System.out.print(i""); //此語句很耗時間影響性能 } System.out.println("100"); } public void fun1(){ String text""; for(int i1;i<100;i){ …

python2clock_控制fps的時鐘Clock類源碼

"""控制fps的時鐘Clock類&#xff0c;本程序用來在循環中控制fps。如何在海龜畫圖中控制fps&#xff1f;這是一個比較重要的問題&#xff0c;否則程序可能有時候快有時候慢。"""import timeimport colorsysfrom turtle import *from random impo…

將mysql的data目錄移走方法

如移動到"/home/mysql/data"&#xff0c;我的mysql是裝在/usr/local/mysql下的 1. 將/usr/local/mysql/data移動到/home/mysql/data mv /usr/local/mysql/data /home/mysql/data 2. 修改啟動文件 vi /usr/local/mysql/support-files/mysql.server 修改如下行&#xf…

Integer注意_享元設計模式

public class IntegerNote{ public static void main(String[] args){ Integer d1100; Integer d2100; System.out.println(d1d2); //true Integer d3129; Integer d4129; System.out.println(d3d4); //false } } /* 究其原因則涉及到java設計中的一個設計模式&am…

使用Spring 3引導Web應用程序

1.概述 這是關于使用Spring 3.1和基于Java的配置來建立RESTfull Web應用程序的系列教程的第一篇。 本文將重點介紹如何引導Web應用程序 &#xff0c;討論如何從XML過渡到Java&#xff0c;而不必完全遷移整個XML配置。 2. Maven <project xmlns"http://maven.apache.o…

通知欄發送消息Notification(可以使用自定義的布局)

一個簡單的應用場景&#xff1a;假如用戶打開Activity以后&#xff0c;按Home鍵&#xff0c;此時Activity 進入-> onPause() -> onStop() 不可見。代碼在此時機發送一個Notification到通知欄。當用戶點擊通知欄的Notification后&#xff0c;又重新onRestart() -> onSt…

退出頁面刪除cookie_Cookie 機制

歡迎關注公眾號 學習資料不會少01「HTTP 協議是無狀態的」對于瀏覽器的每一次請求&#xff0c;服務器都會獨立處理&#xff0c;不與之前或之后的請求發生關聯。這個過程如圖 11-1 所示&#xff0c;3次“請求&#xff0f;響應”之間沒有任何關系。即使是同一個瀏覽器發送了3個請…

【程序員感悟系列】 由一點業務說開去

最近的工作不是很忙&#xff0c;我也趁著這個機會多讀了一些技術的書籍。比如剛讀完的《大話設計模式》&#xff0c;以將故事的形式講述了設計模式的方方面面&#xff0c;感覺還是不錯的。現在看的一本是英國人寫的《企業應用架構模式》。對于web的企業級應用&#xff0c;還是挺…

浮點數使用注意

public class DoubleNote{ public static void main(String[] args){ System.out.println((1.0-0.8)); //結果&#xff1a; 0.19999999999999996 //浮點數“”要慎用 System.out.println((1.0-0.8)0.2)); // false } } /* Java 浮點數表示采用IEE765表示法 */

Oracle WebLogic Java云服務–幕后花絮。

在開放世界方面&#xff0c;發生的一件大事可能是出乎意料的消息&#xff0c;那就是Oracle最終支持云計算發展并提供自己的公共云服務 。 除了官方公告之外&#xff0c;Aquarium上&#xff08; 此處和此處 &#xff09;的內容或多或少都沒有多少內容&#xff0c;您找不到很多信…

QT子窗口及停靠實現

Demo的效果 頭文件中的變量聲明 //退出動作QAction* exit;//菜單欄菜單QMenu* filemenu;QMenu* actiona;//在狀態欄的標簽控件QLabel* label;//兩個停靠窗口QDockWidget *dockwidget;QDockWidget *dockwidget_textbox; CPP源文件中的對象定義 //創建初始化按鈕,將要放到第一個窗…

python關鍵字驅動框架搭建_python webdriver混合驅動測試框架(數據驅動+關鍵字驅動)...

混合驅動&#xff1a;把數據驅動、關鍵字驅動結合起來一起使用testdata.txthttp://www.126.comhttp://www.sohu.comteststep.txtopen||chromevisit||${url}sleep||3主程序腳本hybrid.py#encodingutf-8import refrom selenium import webdriverimport timewith open("tests…