JavaSE 軟件工程師
認證考試試卷
筆試
考試時間150分鍾
總分 100分
姓 名_______________________
身份證號_______________________
准考證號_______________________
考試結束后考卷必須收回,否則考試成績無效
尚學堂JavaSE軟件工程師認證考試試卷
一、 填空題(共20個題目,總計20分)
- 使用Java開發應用程序包括編寫源程序,編譯源程序,解釋並運行三個步驟,其中Java源程序編譯后生成的字節碼文件的擴展名為 .class 。
- 在Java中,浮點型變量的類型有float和double兩種,對於float型變量,內存分配4個字節,對於double型變量,內存分配 8 個字節。
- 在Java JDK1.7之前,switch只能支持byte、short、char、int或者其對應的封裝類以及Enum類型。在JDK1.7中又加入了 String 類型。
- 在循環結構中,如果想跳出循環體,結束整個循環結構可以使用 braek 語句。
- 類是組成Java程序的基本要素,類體有兩部分構成:一部分是變量的定義,另一部分是方法 的定義。
- 方法重載 是指在一個類中可以有多個方法具有相同的名字,但這些方法的參數類型、個數、順序必須不同,與方法的返回值和訪問修飾符無關。
- package 關鍵字作為Java源文件的第一條非注釋性語句,指明該源文件定義的類所有的包。
- 在Java中如果一個類中沒有顯示使用extends關鍵字標明這個類繼承自哪個類,那么這個類就默認是 Object 的子類。
- 聲明數組僅僅是給出了數組的名字和元素的數據類型,要想真正地使用數組還必須使用 new 關鍵字在堆內存中分配內存空間。
- 在Java中有二維數組int [ ] [ ] array={{1,2,3},{4,5}} ,可以使用array[0].length 得到二維數組中第二維中第一個數組的長度。
- 在Java中使用java.lang包中的 StringBuffer 類來創建一個字符串對象,它代表一個字符序列可變的字符串,可以通過相應的方法改變這個字符串對象的字符序列。
- 在Java中每個Java基本類型在java.lang包中都在一個相應的包裝類,把基本類型數據轉換為對象,其中包裝類Integer是java.lang.Number 的直接子類。
- 對於一個已經不被任何引用變量引用的對象,當垃圾回收器准備回收該對象所占用的內存時,將自動調用該對象的 finalize() 方法。
- Math類提供了許多數學運算的靜態方法,其中 random() 方法是用來生成隨機數的方法,其返回類型是double類型。
- 在Java中對於程序可能出現的檢查時異常,要么用try…catch語句捕獲並處理它,要么使用 throws 語句拋出它,由上一級調用者來處理。
- read方法從輸入流中順序讀取源中的單個字節數據,該方法返回字節值(0-255之間的一個整數),如果到達源的末尾,該方法返回 -1 。
- 在Java中編寫實現多線程應用有兩種途徑:一種是繼承Thread類創建線程,另一種是實現 Runnable 接口創建線程。
- 鏈表 結構是一種由多個節點組成的數據結構,並且每個節點包含有數據以及指向下一個節點的引用。
- 在Java Socket網絡編程中,開發基於TCP協議的服務器端程序使用的套接字是 Serversocket 。
- 在Java中使用SAX解析XML文檔主要有兩個部分,一個是SAX解析器,一個是 事件處理器 。
二、 選擇題(共25個題目,總計25分)
1) |
在Java中,源文件Test.java中包含如下代碼,則程序編譯運行的結果是( B )。(選擇一項) |
|
|
public class Test { public static void main(String[ ] args) { system.out.println("Hello!"); } } |
|
|
|
|
|
A |
輸出:Hello! |
|
B. |
編譯出錯,提示“無法解析system” |
|
C. |
運行正常,但沒有輸出任何內容 |
|
D. |
運行時出現異常 |
2) |
在Java中,下面( AB )語句能正確通過編譯。(選擇兩項) |
|
|
|
|
|
A |
System.out.println(1+1); |
|
B. |
char i =2+'2'; System.out.println(i); |
|
C. |
String s="on"+'one'; |
|
D. |
int b=255.0; |
3) |
分析如下Java代碼,編譯運行的輸出結果是( A )。(選擇一項) |
|
|
public static void main(String[ ] args) { boolean a=true; boolean b=false; if (!(a&&b)) { System.out.print("!(a&&b)"); }else if (!(a||b)) { System.out.println("!(a||b)"); }else { System.out.println("ab"); } } |
|
|
|
|
|
A |
!(a&&b) |
|
B. |
!(a||b) |
|
C. |
ab |
|
D. |
!(a||b)ab |
4) |
在Java中有如下代碼,則編譯運行該類的輸出結果是( D )。(選擇一項) |
|
|
public static void main(String[ ] args) { for(int i=0;i<10;i++){ if (i%2!=0) return; System.out.print(i); } } |
|
|
|
|
|
A |
13578 |
|
B. |
02468 |
|
C. |
0123456789 |
|
D. |
0 |
5) |
在Java的程序類中如下方法定義正確的是( AD )。(選擇兩項) |
|
|
|
|
|
A |
public int ufTest(int num){ int sum=num+100; return sum; } |
|
B. |
public String ufTest(int num){ int sum=num+100; return sum; } |
|
C. |
public void ufTest(int num){ int sum=num+100; return sum; } |
|
D. |
public float ufTest(int num){ int sum=num+100; return sum; } |
6) |
分析下面的Java源程序,編譯后的運行結果是( B )。(選擇一項) |
|
|
import java.util.*; public class Test { public static void main(String[ ] args) { int [ ] numbers=new int[ ]{1,2,3}; System.out.println(Arrays.binarySearch(numbers, 2)); } } |
|
|
|
輸出 |
|
A |
輸出:0 |
|
B. |
輸出:1 |
|
C. |
輸出:2 |
|
D. |
輸出:3 |
7) |
分析如下Java程序的代碼所示,則編譯運行后的輸出結果是( C )。(選擇一項) |
|
|
public class Test { int count=9; public void count1(){ count=10; System.out.println("count1="+count); } public void count2(){ System.out.println("count2="+count); } public static void main(String[ ] args) { Test t=new Test(); t.count1(); t.count2(); } } |
|
|
|
|
|
A |
count1=9; count2=9; |
|
B. |
count1=10; count2=9; |
|
C. |
count1=10; count2=10; |
|
D. |
count1=9; count2=10; |
8) |
在Java中,以下定義數組的語句正確的是( CD )。(選擇兩項) |
|
|
|
|
|
A |
int t[10]=new int[ ]; |
|
B. |
char [ ]a=”hello”; |
|
C. |
String [ ] s=new String [10]; |
|
D. |
double[ ] d [ ]=new double [4][ ]; |
9) |
分析如下Java代碼,該程序編譯后的運行結果是( D )。(選擇一項) |
|
|
public static void main(String[ ] args) { String str=null; str.concat("abc"); str.concat("def"); System.out.println(str); } |
|
|
|
|
|
A |
null |
|
B. |
abcdef |
|
C. |
編譯錯誤 |
|
D. |
運行時出現NullPointerException異常 |
10) |
給定如下Java代碼,編譯運行后,輸出結果是( C )。(選擇一項) |
|
|
public class Test { public static void main(String[ ] args) { StringBuffer a=new StringBuffer("A"); StringBuffer b=new StringBuffer("B"); operate(a, b); System.out.println(a+","+b); } static void operate(StringBuffer x,StringBuffer y){ x=new StringBuffer("BBB"); y=x; } } |
|
|
|
|
|
A |
BBB,B |
|
B. |
BBB,BBB |
|
C. |
A,B |
|
D. |
A,A |
11) |
給定如下Java程序,Test類中的四個輸出語句輸出結果依次是( C )。(選擇一項) |
|
|
class Person { String name="person"; public void shout(){ System.out.println(name); } } class Student extends Person{ String name="student"; String school="school"; } public class Test { public static void main(String[ ] args) { Person p=new Student(); System.out.println(p instanceof Student); System.out.println(p instanceof Person); System.out.println(p instanceof Object);; System.out.println(p instanceof System); } } |
|
|
|
|
|
A |
true,false,true,false |
|
B. |
false,true,false,false |
|
C. |
true,true,true,編譯錯誤 |
|
D. |
true,true,false,編譯錯誤 |
12) |
在Java中,LinkedList類與ArrayList類同屬於集合框架類,下列( CD )選項中是LinkedList類有而ArrayList類沒有的方法。(選擇兩項) |
|
|
|
|
|
A |
add(Object o) |
|
B. |
add(int index,Object o) |
|
C. |
getFirst() |
|
D. |
removeLast() |
13) |
如下Java代碼,輸出的運行結果是( A )。(選擇一項) |
|
|
public class Test { public static void main(String[ ] args) { List<String> list=new ArrayList<String>(); list.add("str1"); list.add(2, "str2"); String s=list.get(1); System.out.println(s); } } |
|
|
|
|
|
A |
運行時出現異常 |
|
B. |
正確運行,輸出str1 |
|
C. |
正確運行,輸出str2 |
|
D. |
編譯時出現異常 |
14) |
在Java中關於靜態方法,以下說法中正確的是( A C)。(選擇兩項) |
|
|
|
|
|
A |
靜態方法中不能直接調用非靜態方法 |
|
B. |
非靜態方法中不能直接調用靜態方法 |
|
C. |
靜態方法可以用類名直接調用 |
|
D. |
靜態方法里可以使用this |
15) |
如下Java代碼運行的結果是( B )。(選擇一項) |
|
|
public class Test { final int age; public Test(){ age=10; } public static void main(String[ ] args) { System.out.println(new Test().age); } } |
|
|
|
|
|
A |
輸出:0 |
|
B. |
輸出:10 |
|
C. |
輸出:null |
|
D. |
運行時出現異常 |
16) |
在Java中關於abstract關鍵字,以下說法正確的是( AB )。(選擇兩項) |
|
|
|
|
|
A |
abstract類中可以沒有抽象方法 |
|
B. |
abstract類的子類也可以是抽象類 |
|
C. |
abstract方法可以有方法體 |
|
D. |
abstract類可以創建對象 |
17) |
在Java中,下列關於讀寫文件的描述錯誤的是( B )。(選擇一項) |
|
|
|
|
|
A |
Reader類的read()方法用來從源中讀取一個字符的數據 |
|
B. |
Reader類的read(int n )方法用來從源中讀取一個字符的數據 |
|
C. |
Writer類的write(int n)方法用來向輸出流寫入單個字符 |
|
D. |
Writer類的write(String str)方法用來向輸出流寫入一個字符串 |
18) |
分析如下Java代碼,有標注的四行代碼中,有錯誤的是第( D )處。(選擇一項) |
|
|
import java.io.FileWriter; import java.io.IOException; public class Test { public static void main(String[ ] args) { String str = "Hello World"; FileWriter fw = null; try { fw = new FileWriter("c:\\hello.txt"); // 1 fw.write(str); // 2 } catch (IOException e) { e.printStackTrace(); // 3 } finally { fw.close(); // 4 } } } |
|
|
|
|
|
A |
1 |
|
B. |
2 |
|
C. |
3 |
|
D. |
4 |
19) |
在Java的IO操作中,( BD )方法可以用來刷新流的緩沖。(選擇兩項) |
|
|
|
|
|
A |
void release() |
|
B. |
void close() |
|
C. |
void remove() |
|
D. |
void flush() |
20) |
下列關於線程的優先級說法中,正確的是( BC )。(選擇兩項) |
|
|
|
|
|
A |
線程的優先級是不能改變的 |
|
B. |
線程的優先級是在創建線程時設置的 |
|
C. |
在創建線程后的任何時候都可以重新設置 |
|
D. |
線程的優先級的范圍在1-100之間 |
21) |
下列關於Java線程的說法正確的是( B )。(選擇一項) |
|
|
|
|
|
A |
每一個Java線程可以看成由代碼、一個真實的CPU以及數據三部分組成 |
|
B. |
創建線程的兩種方法中,從Thread類中繼承的創建方式可以防止出現多父類的問題 |
|
C. |
Thread類屬於java.util程序包 |
|
D. |
使用new Thread(new X()).run();方法啟動一個線程 |
22) |
在Java網絡編程中,使用客戶端套接字Socket創建對象時,需要指定( A )。(選擇一項) |
|
|
|
|
|
A |
服務器主機名稱和端口 |
|
B. |
服務器端口和文件 |
|
C. |
服務器名稱和文件 |
|
D. |
服務器地址和文件 |
23) |
在Java的反射中關於代理說法正確的是( BD )。(選擇兩項) |
|
|
|
|
|
A |
動態代理類與靜態代理類一樣,必須由開發人員編寫源代碼,並進行編譯 |
|
B. |
代理類與被代理類具有同樣的接口 |
|
C. |
動態代理是public、final和abstract類型的 |
|
D. |
java.lang.reflect包中的Proxy類提供了創建動態代理類的方法 |
24) |
在編寫XML 文件時,下列關於屬性的聲明說法正確的是(AD )。(選擇兩項) |
|
|
|
|
|
A |
標記中可以使用多個屬性 |
|
B. |
屬性可以出現在起始標記或結束標記中 |
|
C. |
屬性是不區分大小寫的 |
|
D. |
屬性值必須用引號引上 |
25) |
在使用UDP套接字通信時,常用( D )類把要發送的信息打包。(選擇一項) |
|
|
|
|
|
A |
String |
|
B. |
DatagramSocket |
|
C. |
MulticastSocket |
|
D. |
DatagramPacket |
三、 判斷題(共20個題目,總計10分,正確√,錯誤×)
- Java語言是一種面向對象的語言,具有較好的安全性和可移植性及與平台無關等特性。( T )
- 假設有一個Java源程序文件,它只定義了一個具有public屬性的類Hello,那么編譯該文件的命令是“javac Hello”。( F )
- 在編譯Java源程序時,計算機根本不會去識別各個變量名的具體含義,因此命名規范對編寫Java程序而言不是必要的,而且有可能會降低編寫Java源程序的效率。( F )
- 在Java中任何一個子類的構造方法都必須調用其父類的構造方法(包括隱式調用),並且調用父類的構造方法的語句必須是子類構造方法的第一條語句。( T )
- Java語言為所有的Java程序自動導入包“java.lang”,因此Java程序可以直接用“java.lang”中的類和接口。( T )
- Java中的類不允許多重繼承,但接口支持多重繼承。( T )
- 父類Person中定義了一個private void show()的方法,那么子類要重寫這個方法時,方法的訪問修飾符可以是默認的,protected或public。( F )
- 抽象方法不能含有方法體,並且必須定義在抽象類中。( F )
- 構造方法用於創建對象,一般不允許有任何返回值,因此需要在構造方法返回類型處標注為void。( F )
- 在Java中對象可以賦值,只要使用賦值運算符即可,相當於生成了一個各屬性與賦值對象相同的新對象。( F )
- Java允許創建不規則數組,即Java多維數組中各行的列數可以不同。( T )
- 在Java異常處理中可以使用多個catch子句,此時應將異常類的父類Exception放到第一個catch子中。( F )
- 與未加訪問控制符的缺省情況相比,public和protected修飾符擴大了類及其屬性和方法的被訪問范圍,private修飾符則縮小了這種范圍。( T )
- 泛型是JavaSE1.7的新特性,泛型的本質是參數化類型,也就是說所操作的數據類型被指定為一個參數。Java語言引入泛型的好處是安全簡單。( F )
- List是有序的Collection,使用此接口能夠精確的控制每個元素插入的位置。用戶能夠使用索引來訪問List中的無素,這類似於Java的數組。( T )
- 在使用File類中的delete()方法時,刪除時可能文件不存在,所以我們最好先判斷一下是否存在,不然會出現NullPointerException異常。( F )
- 當一個線程進入一個對象的一個synchronized方法后,其它線程不可以再進入該對象的其它方法執行。( T )
- TCP/IP傳輸控制協議是Internet的主要協議,定義了計算機和外設進行通信的規則。TCP/IP網絡參考模型包括七個層次:應用層、會話層、表示層、傳輸層、網絡層、鏈路層和物理層。( F )
- Java反射機制是指:Java程序可以加載一個運行時才得知名稱的類,獲悉其完整結構信息(但不包括methods定義),並生成其對象實體、或對其fields設值、或調用其methods。( T )
- XML在不同的語言里解析方式都是一樣的,只不過實現的語法不同而已。基本的解析方式有兩種,一種叫SAX,另一種叫DOM。SAX是基於事件流的解析,DOM是基於XML文檔樹結構的解析。(T )
四、 簡答題(共5個題目,總計25分)
- Java異常處理中,關鍵字try、catch、finally、throw、throws分別代表什么含義?(5分)
答: try:用來指定一塊預防所有“異常”的程序。(1分)
catch:子右緊跟在try塊后面,用於指定你想要捕捉的“異常”的類型。(1分)
finally:為確保一段代碼不管發生什么“異常”都被執行一段代碼。(1分)
throw:語句用來明確地拋出一個“異常”,在方法體中。(1分)
throws:用來標明一個方法可以拋出的各種“異常”,寫在方法名的后面。(1分)
- 請你簡述sleep( )和wait( )有什么區別?(5分)
sleep是線程類(Thread)的方法;(0.5分)作用是導致此線程暫停執行指定時間,給執行機會給其他線程,但是監控狀態依然保持,到時后會自動恢復;(1分) 調用sleep()不會釋放對象鎖。(1分)
wait是Object類的方法;(0.5分)對此對象調用wait方法導致本線程放棄對象鎖,進入等 待此對象的等待鎖定池。(1分)只有針對此對象發出notify方法(或notifyAll)后本線程才進入對象鎖定池,准備獲得對象鎖進行運行狀態。(1分)
- 請你簡述HashMap和Hashtable的區別?(5分)
答:共同點:
1) 二者都實現了Map接口,是將惟一鍵映射到特定的值上。(1分)
2) 底層都采用哈希表作為存儲結構,查詢速度快,在很多情況下可互用。(1分)
主要區別:
1) Hashtable繼承Dictionary類,HashMap是Java1.2引進的Map實現。(1分)
2) Hashtable的線程安全的,而HashMap不是。在多個線程訪問Hashtable時,不需要自己為它的方法實現同步,而HashMap就必須為之提供外同步。(1分)
3) HashMap沒有排序,允許一個null鍵和多個null值,而Hashtable不允許。(0.5分)
4) HashMap把Hashtable的contains( )去掉了,改成containsValue和containsKey,因為contains方法容易讓人引起誤解。(0.5分)
- 什么是設計模式?設計模式的作用?(5分)
設計模式是一套被反復使用的、多數人知曉、經過分類編目的優秀代碼設計經驗的總結。每個設計模式都是特定環境下特定問題的處理方法。(1分)
設計模式主要作用如下:
1) 重用設計和代碼。重用設計比重用代碼更有意義,自動帶來代碼重用。(1分)
2) 提高擴展性。大量使用面向接口編程,預留擴展插槽,新的功能或特性很容易加入到系統中來。(1分)
3) 提高靈活性。通過組合提高靈活性,可以允許代碼修改平穩發生,對一處的修改不會波及到很多其他模塊。(1分)
4) 提高開發效率。正確使用設計模式,可以節省大量的時間。(1分)
- TCP/IP協議棧中,TCP協議和UDP協議的聯系和區別?(5分)
答:聯系:
TCP和UDP是TCP/IP協議棧中傳輸層的兩個協議,它們使用網絡層功能把數據包發送到目的地,從而為應用層提供網絡服務。(1分)
區別:
1. TCP是面向連接的傳輸。UDP是無連接的傳輸。(1分)
2. TCP保證數據按照發送順序到達,UDP無法保證。(1分)
4. TCP是可靠性傳輸,而UDP則是不可靠傳輸。(1分)
5. UDP因為少了很多控制信息,所以傳輸速度比TCP速度快。(0.5分)
6. TCP適合用於傳輸大量數據,UDP適合用於傳輸小量數據。(0.5分)
比喻: TCP的server和client之間通信就好比兩個人打電話。UDP的server和client之間的通信就像兩個人發電報或者發短信。
1 一、 編碼題(共3個題目,總計20分) 2 3 1. 編寫兩個線程,一個線程打印1-52的整數,另一個線程打印字母A-Z。打印順序為12A34B56C….5152Z。即按照整數和字母的順序從小到大打印,並且每打印兩個整數后,打印一個字母,交替循環打印,直到打印到整數52和字母Z結束。(8分) 4 要求: 5 (1) 編寫打印類Printer,聲明私有屬性index,初始值為1,用來表示是第幾次打印。 6 (2) 在打印類Printer中編寫打印數字的方法print(int i),3的倍數就使用wait()方法等待,否則就輸出i,使用notifyAll()進行喚醒其它線程。 7 (3) 在打印類Printer中編寫打印字母的方法print(char c),不是3的倍數就等待,否則就打印輸出字母c,使用notifyAll()進行喚醒其它線程。 8 (4) 編寫打印數字的線程NumberPrinter繼承Thread類,聲明私有屬性private Printer p;在構造方法中進行賦值,實現父類的run方法,調用Printer類中的輸出數字的方法。 9 (5) 編寫打印字母的線程LetterPrinter繼承Thread類,聲明私有屬性private Printer p;在構造方法中進行賦值,實現父類的run方法,調用Printer類中的輸出字母的方法。 10 (6) 編寫測試類Test,創建打印類對象,創建兩個線程類對象,啟動線程。 11 12 public class Printer { 13 /** 14 *1)編寫打印類Printer,聲明私有屬性index,初始值為1,用來表示是第幾次打印。 15 * 2) 在打印類Printer中編寫打印數字的方法print(int i),3的倍數就使用wait()方法等待, 16 * 否則就輸出i,使用notifyAll()進行喚醒其它線程。 17 * 3) 在打印類Printer中編寫打印字母的方法print(char c),不是3的倍數就等待, 18 * 否則就打印輸出字母c,使用notifyAll()進行喚醒其它線程。 19 */ 20 private int index = 1; 21 //打印數字的方法print(int i) 22 public synchronized void print(int i){ 23 while(index%3==0){ 24 try { 25 wait(); 26 } catch (InterruptedException e) { 27 e.printStackTrace(); 28 } 29 } 30 System.out.println(i); 31 index++; 32 notifyAll(); 33 } 34 public synchronized void print(char c){ 35 while(index%3!=0){ 36 try { 37 wait(); 38 } catch (InterruptedException e) { 39 e.printStackTrace(); 40 } 41 } 42 System.out.println(c); 43 index++; 44 notifyAll(); 45 } 46 } 47 public class NumberPrinter extends Thread{ 48 /** 49 * 4)編寫打印數字的線程NumberPrinter繼承Thread類,聲明私有屬性private Printer p; 50 * 在構造方法中進行賦值,實現父類的run方法,調用Printer類中的輸出數字的方法。 51 */ 52 private Printer p; 53 54 public NumberPrinter(Printer p) { 55 this.p = p; 56 } 57 @Override 58 public void run() { 59 for(int i=1;i<53;i++){ 60 p.print(i); 61 } 62 } 63 } 64 65 public class LetterPrinter extends Thread{ 66 /** 67 * * 5)編寫打印字母的線程LetterPrinter繼承Thread類,聲明私有屬性private Printer p; 68 * 在構造方法中進行賦值,實現父類的run方法,調用Printer類中的輸出字母的方法。 69 */ 70 private Printer p; 71 72 public LetterPrinter(Printer p) { 73 this.p = p; 74 } 75 @Override 76 public void run() { 77 for(char j='A';j<='Z';j++){ 78 p.print(j); 79 } 80 } 81 82 } 83 public class test_2 { 84 public static void main(String[] args) { 85 //創建公共打印資源對象 86 Printer p = new Printer(); 87 //創建數字打印線程 88 Thread t1 = new NumberPrinter(p); 89 //創建字母打印線程 90 Thread t2 = new LetterPrinter(p); 91 //啟動線程 92 t1.start(); 93 t2.start(); 94 } 95 } 96 97 98 2. 使用IO包中的類讀取D盤上exam.txt文本文件的內容,每次讀取一行內容,將每行作為一個輸入放入ArrayList的泛型集合中並將集合中的內容使用加強for進行輸出顯示。(5分) 99 100 public static void main(String[] args) throws IOException { 101 BufferedReader br = new BufferedReader(new InputStreamReader( 102 new FileInputStream("D:\\exam.txt"))); 103 List<String> list = new ArrayList<>(); 104 String num=null; 105 while((num=br.readLine())!=null){ 106 list.add(num); 107 } 108 for (String s : list) { 109 System.out.println(s); 110 } 111 112 } 113 3. 使用反射機制完成學生對象的創建並輸出學生信息。(7分) 114 要求: 115 (1) 定義一個學生類Student,其中包含姓名(String)、年齡(int)、成績(float)的屬性。 116 (2) 編寫帶參與無參構造方法。 117 (3) 重寫父類的toString()方法用於輸出學生的信息。 118 (4) 編寫測試類TestStudent,從鍵盤錄入學生的信息格式為(姓名:年齡:成績)一次性錄入使用“:”分隔,舉例(mary:20:90)。 119 (5) 使用String類的split方法按照“:”進行分隔。 120 (6) 調用Constructor的newInstance()方法並用分隔后的信息初始化學生對象。 121 (7) 調用重寫父類的toString()方法將學生信息進入輸出顯示。 122 123 public class Student_3 { 124 private String name; 125 private int age; 126 private float grade; 127 128 public Student_3() { 129 } 130 131 public Student_3(String name, int age, float grade) { 132 this.name = name; 133 this.age = age; 134 this.grade = grade; 135 } 136 137 @Override 138 public String toString() { 139 return "Student_3 ["+ name +" "+ age+" "+ grade +"]"; 140 } 141 142 143 } 144 public class TestStudent_3 { 145 public static void main(String[] args) throws Exception { 146 Scanner sc = new Scanner(System.in); 147 System.out.println("錄入學生的信息格式為(姓名:年齡:成績):"); 148 String info = sc.nextLine(); 149 String[] s = info.split(":"); 150 int age = Integer.parseInt(s[1]); 151 float grade =Float.parseFloat(s[2]); 152 Class<?> clazz = Class.forName("復習題二201511.Student_3"); 153 Constructor<?> con = clazz.getConstructor(String.class,int.class,float.class); 154 Object obj = con.newInstance(s[0],age,grade); 155 Method m = clazz.getMethod("toString"); 156 Object invoke = m.invoke(obj); 157 System.out.println(invoke); 158 159 } 160 }