一、 選擇題
1. |
Person類和Test類的代碼如下所示,則代碼中的錯誤語句是( C )。(選擇一項) |
|
|
public class Person { public String name; public Person(String name) { this.name = name; } } public class Test { public static void main(String[] args) { final Person person = new Person("歐歐"); person.name = "美美"; person = new Person("亞亞"); } } |
|
|
|
|
|
A. |
final Person person = new Person("歐歐"); |
|
B. |
person.name = "美美"; |
|
C. |
person = new Person("亞亞"); |
|
D. |
沒有錯誤 |
2. |
如下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. |
運行時出現異常 |
3. |
以下代碼中錯誤的語句是( D )。(選擇一項) |
|
|
public class Something{ public static void main(String[] args){ final Other o=new Other(); new Something().addOne(o);//1 } public void addOne( Other o){ o.i++;//2 o = new Other();//3 } } class Other{ public int i; } |
|
|
|
|
|
A |
1 |
|
B. |
2 |
|
C. |
3 |
|
D. |
沒有錯誤 |
4. |
下列選項中,關於Java的抽象類和抽象方法說法正確的是( AC )。(選擇二項) |
|
|
|
|
|
A |
抽象類中可以含有0個或多個抽象方法 |
|
B. |
抽象類中不可以有構造方法 |
|
C. |
一個類中若有抽象方法,則這個類必為抽象類 |
|
D. |
子類必須重寫父類所有的抽象方法 |
5. |
在Java中關於abstract關鍵字,以下說法正確的是( AB )。(選擇兩項) |
|
|
|
|
|
A |
abstract類中可以沒有抽象方法 |
|
B. |
abstract類的子類也可以是抽象類 |
|
C. |
abstract方法可以有方法體 |
|
D. |
abstract類可以創建對象 |
6. |
以下選項可替換題目中//add code here而不產生編譯錯誤的是( AD )。(選擇二項) |
|
|
public abstract class MyClass{ public int constInt=5; //add code here public void method( ){ } } |
|
|
|
|
|
A |
public abstract void method(int a); |
|
B. |
constInt =constInt+5; |
|
C. |
public int method( ); |
|
D. |
public abstract void anotherMethod( ); |
7. |
在Java接口中,下列選項中屬於有效的方法聲明是( AC )。(選擇二項) |
|
|
|
|
|
A |
public void aMethod( ); |
|
B. |
final void aMethod( ); |
|
C. |
void aMethod(){ } |
|
D. |
private void aMethod( ); |
8. |
以下選項中關於匿名內部類的說法正確的是( BC )。(選擇二項) |
|
|
|
|
|
A. |
匿名內部類可以實現多個接口,或者繼承一個父類 |
|
B. |
匿名內部類不能是抽象類,必須實現它的抽象父類或者接口里包含的所有抽象方法 |
|
C. |
匿名內部類沒有類名,所以匿名內部類不能定義構造方法 |
|
D. |
匿名內部類可以直接訪問外部類的所有局部變量 |
二、 判斷題(共20個題目,總計10分)
- 聲明為final的類不能是超類。( T )
- 使用final修飾的變量將變成常量,其中不能再被改變;使用final修飾的方法將無法被子類重載;使用final修飾的類將無法再被其他類繼承。( T )
- 抽象方法不能含有方法體,並且必須定義在抽象類中。( F )
- 抽象類是指在class前加使用abstract關鍵字修飾,且可以存在抽象方法和普通方法的類。( T )
- 接口中只有常量,沒有變量;只有抽象方法,並且全部都是public方法。( T )
- 抽象類和接口都不能實例化,都沒有構造方法。( F )
- 接口並不要求實現類和接口在概念本質上一致的,僅僅是實現了接口定義的約定或者能力而已。接口定義了“做什么”,而實現類負責完成“怎么做”,體現了功能(規范)和實現分離的原則。( T )
- 內部類作為外部類成員,權限修飾符和其他成員一樣,可聲明為private、默認、protected或public。( T )
- 匿名內部類適合創建那種只需要使用一次的類,它可以實現一個或多個接口,或者繼承一個父類。( F )
- 對於物理連接,比如數據庫連接、輸入流輸出流、Socket連接等,垃圾回收機制無能為力,必須手動關閉才可以。( T )
- 垃圾回收機制回收任何對象之前,總會先調用它gc( )方法,該方法是Object類提供的方法。不要主動調用某個對象的該方法,應該交給垃圾回收機制調用。( F )
三、 簡答題
- final和abstract關鍵字的作用。
- 接口和抽象類的聯系和區別。
- 內部類的類型及其特點。
四、 編碼題
1.編寫程序描述兔子和青蛙
需求說明:使用面向對象的思想,設計自定義類描述兔子和青蛙。
實現思路及關鍵代碼
1) 分析兔子和青蛙的共性
2) 根據共性,定義抽象的動物類
屬性:名字、顏色、類別(哺乳類、非哺乳類)
方法:吃飯,發出叫聲
3) 根據青蛙會游泳 抽象游泳的接口
方法:游泳
4) 定義兔子繼承動物類,青蛙繼承動物同時實現游泳接口
程序運行結果如圖所示。
1 /**
2 * 3 * 動物類 4 * 5 * @author Administrator 6 * 7 */
8 public abstract class Animal 9 { 10 private String name;//名字
11 private String color;//顏色
12 private String type;//類別(哺乳類、非哺乳類)
13 public Animal() 14 { 15 super(); 16 } 17 public Animal(String name, String color, String type) 18 { 19 super(); 20 this.name = name; 21 this.color = color; 22 this.type = type; 23 } 24 public String getName() 25 { 26 return name; 27 } 28 public void setName(String name) 29 { 30 this.name = name; 31 } 32 public String getColor() 33 { 34 return color; 35 } 36 public void setColor(String color) 37 { 38 this.color = color; 39 } 40 public String getType() 41 { 42 return type; 43 } 44 public void setType(String type) 45 { 46 this.type = type; 47 } 48 /**
49 * 50 * 發出叫聲 51 * 52 */
53 public abstract void shout(); 54 /**
55 * 56 * 吃飯 57 * 58 */
59 public abstract void eat(); 60 } 61 /**
62 * 63 * 游泳接口 64 * 65 * @author Administrator 66 * 67 */
68 public interface Swimmable 69 { 70 /**
71 * 72 * 游泳 73 * 74 */
75 public void swim(); 76 } 77 public class Frog extends Animal implements Swimmable 78 { 79 public Frog() 80 { 81 super(); 82 } 83 public Frog(String name, String color, String type) 84 { 85 super(name, color, type); 86 } 87 @Override 88 public void shout() 89 { 90 System.out.println("那只" + super.getColor() 91 + "的,名字叫" + super.getName() + "的青蛙正在呱呱的叫"); 92 } 93 @Override 94 public void eat() 95 { 96 System.out.println("青蛙是" + super.getType() + ",愛吃昆蟲"); 97 } 98 @Override 99 public void swim() 100 { 101 System.out.println("雖然不是魚,但是青蛙也是游泳高手"); 102 } 103 } 104 public class Rabbit extends Animal 105 { 106 public Rabbit() 107 { 108 super(); 109 } 110 public Rabbit(String name, String color, String type) 111 { 112 super(name, color, type); 113 } 114 @Override 115 public void shout() 116 { 117 System.out.println("那只" + super.getColor() 118 + "的,名字叫" + super.getName() + "的兔子正在嘰嘰的叫"); 119 } 120 @Override 121 public void eat() 122 { 123 System.out.println("兔子是" + super.getType() + ",愛吃胡蘿卜"); 124 } 125 } 126 public class Test 127 { 128 public static void main(String[] args) 129 { 130 Animal rabbit = new Rabbit("美人", "黑色", "哺乳類"); 131 rabbit.shout(); 132 rabbit.eat(); 133 System.out.println("===================="); 134 Animal frog = new Frog("大兵", "綠色", "非哺乳類"); 135 frog.shout(); 136 frog.eat(); 137 Swimmable swimer = (Swimmable) frog; 138 swimer.swim(); 139 } 140 }
2.編寫程序描述影視歌三棲藝人
需求說明:請使用面向對象的思想,設計自定義類,描述影視歌三梄藝人。
實現思路及關鍵代碼
1) 分析影視歌三棲藝人的特性
a) 可以演電影
b) 可以演電視劇
c) 可以唱歌
2) 定義多個接口描述特性
a) 演電影的接口-----方法:演電影
b) 演電視劇的接口-----方法:演電視劇
c) 唱歌的接口-----方法:唱歌
3) 定義藝人類實現多個接口
程序運行結果如圖2所示。
1 /**
2 * 3 * 可演電影接口 4 * 5 * @author Administrator 6 * 7 */
8 public interface Filmable 9 { 10 /**
11 * 12 * 演電影 13 * 14 */
15 public void actFilm(); 16 } 17 /**
18 * 19 * 會唱歌接口 20 * 21 * @author Administrator 22 * 23 */
24 public interface Singable 25 { 26 /**
27 * 28 * 唱歌 29 * 30 */
31 public void sing(); 32 } 33 /**
34 * 35 * 會演電視劇接口 36 * 37 * @author Administrator 38 * 39 */
40 public interface TVable 41 { 42 /**
43 * 44 * 演電視劇 45 * 46 */
47 public void showTV(); 48 } 49 public class Star implements Filmable, TVable, Singable 50 { 51 private String name;//姓名
52 public Star() 53 { 54 super(); 55 } 56 public Star(String name) 57 { 58 super(); 59 this.name = name; 60 } 61 public String getName() 62 { 63 return name; 64 } 65 public void setName(String name) 66 { 67 this.name = name; 68 } 69 @Override 70 public void sing() 71 { 72 System.out.println("我會唱歌"); 73 } 74 @Override 75 public void showTV() 76 { 77 System.out.println("我能演電視劇"); 78 } 79 @Override 80 public void actFilm() 81 { 82 System.out.println("我能演電影"); 83 } 84 public void introduce() 85 { 86 System.out.println("大家好,我是" + name); 87 } 88 } 89 public class Test 90 { 91 public static void main(String[] args) 92 { 93 Star star = new Star("馬素素"); 94 star.introduce(); 95 star.actFilm(); 96 star.showTV(); 97 star.sing(); 98 } 99 }
3.寫一個方法對任意引用數據類型數組進行排序。具體要求如下:
1) 方法聲明為public void sortArr(Object arr[]){ }
2) 方法中首先輸出排序前數組內容,然后進行排序,最后輸出排序后數組內容。
3) 可以是冒泡排序或其他算法實現,不直接調用Java提供的方法實現排序。
思路:任意類實現Comparable接口來實現該引用數據類型的元素排序,在sort()方法中將Object強轉成Comparable實現兩個對象的比較。
1 public void sort(Object[] arr) 2 { 3 //輸出排序前數組
4 for (int i = 0; i < arr.length; i++) 5 { 6 System.out.println(arr[i]); 7 } 8 //大循環,一共n個元素,達到最終有序,至多n-1趟比較
9 Object temp; 10 for (int i = 0; i < arr.length - 1; i++) 11 { 12 //定義一個符號量
13 boolean flag = true;//沒有交換,有序 14 //小循環
15 for (int j = 0; j < arr.length - 1 - i; j++) 16 { 17 //如果前一個大於后一個
18 Comparables c1 = (Comparables) arr[j]; 19 Comparables c2 = (Comparables) arr[j + 1]; 20 if (c1.compareTo(c2) > 0) 21 { 22 //交換
23 temp = arr[j]; 24 arr[j] = arr[j + 1]; 25 arr[j + 1] = temp; 26 //修改符號量
27 flag = false;//交換過,無序
28 } 29 } 30 //判斷經過此趟循環后是否已經有序
31 if (flag) 32 { 33 break;//退出外層循環,省略后續趟循環
34 } 35 } 36 //輸出排序后數組
37 for (int i = 0; i < arr.length; i++) 38 { 39 System.out.println(arr[i]); 40 } 41 }
五、 可選題
1.實現不同符合PCI規范的適配器
需求說明:PCI是一種規范,所有實現了該規范的適配器,必如顯卡、聲卡、網卡都可以安裝到PCI插槽上並工作。模擬實現該功能。
實現思路及關鍵代碼
1) 定義PCI接口,具有傳送數據send()方法
2) 定義顯卡VideaCard類,實現該接口
3) 定義聲卡AudioCard類,實現PCI接口
4) 定義網卡NetCard類,實現PCI接口
5) 定義測試類,讓顯卡、聲卡、網卡發送數據
1 class a 2 { 3 /**
4 * 5 * PCI接口 6 * 7 * @author Administrator 8 * 9 * 10 * 11 */
12 public interface PCI 13 { 14 /**
15 * 16 * 傳輸數據 17 * 18 */
19 public void send(); 20 } 21 public class VideoCard implements PCI 22 { 23 @Override 24 public void send() 25 { 26 System.out.println("使用PCI接口傳輸視頻數據"); 27 } 28 } 29 public class SoundCard implements PCI 30 { 31 @Override 32 public void send() 33 { 34 System.out.println("使用PCI接口傳輸聲音數據"); 35 } 36 } 37 public class NetCard implements PCI 38 { 39 @Override 40 public void send() 41 { 42 System.out.println("使用PCI接口傳輸網絡數據"); 43 } 44 } 45 public class Test 46 { 47 public static void main(String[] args) 48 { 49 PCI p1 = new VideoCard(); 50 p1.send(); 51 PCI p2 = new SoundCard(); 52 p2.send(); 53 PCI p3 = new NetCard(); 54 p3.send(); 55 } 56 } 57 }
2.實現不同引用類型對象的大小比較
需求說明:學生類,新聞類,商品類雖然是完全不同的類,但是都具有比較的能力,比如可以比較兩個學生的大小,但需要指定比較的依據是學號、姓名還是成績等。
實現思路及關鍵代碼:
將比較的能力定義為接口,讓學生、新聞、商品類都實現該接口。
1) 定義接口Comparable,其中包含唯一的方法int compareTo(Object obj);返回值>0,表示大於,返回值=0,表示等於,返回值<0,表示小於。
2) 定義學生類,包括學號、姓名、年齡和分數,實現Comparable接口,按照分數倒序排列;
3) 定義新聞類,包括編號(int類型)、標題、內容和點擊數,實現Comparable接口,按照編號正序排列;
4) 定義測試類,分別創建兩個學生對象、新聞對象,進行比較並輸出結果。
1 /**
2 * 3 * 比較接口 4 * 5 * @author Administrator 6 * 7 * 8 * 9 */
10 public interface Comparable 11 { 12 /**
13 * 14 * 比較 15 * 16 * @param obj 另外一個對象 17 * 18 * @return 比較的結果 >0 大於 =0 等於 <0 小於 19 * 20 */
21 public int compareTo(Object obj); 22 } 23 public class News implements Comparable 24 { 25 private int nid;//編號
26 private String title; //標題
27 private String contents;//內容
28 private String type;//新聞類別
29 public News() 30 { 31 super(); 32 } 33 public News(int nid, String title, String contents, String type) 34 { 35 super(); 36 this.nid = nid; 37 this.title = title; 38 this.contents = contents; 39 this.type = type; 40 } 41 /**
42 * 43 * 按照新聞編號正序排列 44 * 45 */
46 public int compareTo(Object obj) 47 { 48 News other = (News) obj; 49 return this.nid - other.nid; 50 } 51 @Override 52 public String toString() 53 { 54 return "News [nid=" + nid + ", title=" + title + ", contents="
55 + contents + ", type=" + type + "]"; 56 } 57 } 58 public class Student implements Comparable 59 { 60 private int id; 61 private String name; 62 private int age; 63 private double score; 64 public Student() 65 { 66 super(); 67 } 68 public Student(int id, String name, int age, double score) 69 { 70 super(); 71 this.id = id; 72 this.name = name; 73 this.age = age; 74 this.score = score; 75 } 76 /**
77 * 78 * 按照學生成績降序排序 79 * 80 */
81 public int compareTo(Object obj) 82 { 83 Student other = (Student) obj; 84 if (this.score > other.score) 85 { 86 return -1; 87 } else if (this.score < other.score) 88 { 89 return 1; 90 } else
91 { 92 return 0; 93 } 94 } 95 @Override 96 public String toString() 97 { 98 return "Student [id=" + id + ", name=" + name + ", age=" + age 99 + ", score=" + score + "]"; 100 } 101 } 102 public class Test 103 { 104 public static void main(String[] args) 105 { 106 // 107 Student stu1 = new Student(11, "小紅", 18, 97d); 108 Student stu2 = new Student(12, "小東", 20, 98d); 109 if (stu1.compareTo(stu2) > 0) 110 { 111 System.out.println(stu2); 112 System.out.println(stu1); 113 } else
114 { 115 System.out.println(stu1); 116 System.out.println(stu2); 117 } 118 // 119 News news1 = new News(33, "恆大亞冠", "恆大亞冠小組被淘汰", "體育"); 120 News news2 = new News(44, "上海尚學堂", "請原諒我的姍姍來遲", "IT"); 121 if (news1.compareTo(news2) > 0) 122 { 123 System.out.println(news2); 124 System.out.println(news1); 125 } else
126 { 127 System.out.println(news1); 128 System.out.println(news2); 129 } 130 } 131 }