預科班第三次考試試卷總結
一、 選擇題(每道題3分,共30分)
1. 下列說法哪個錯誤?( )
A、 一個程式可以包含多個原始檔
B、 一個原始檔中,只能有一個公共類
C、 屬於同一個包的類在預設情況下可以相互訪問
D、 系統不會為原始檔建立預設的包
一個包中可以包含多個類, A正確;
一個原始檔中可以有多個類,但只能有一個公共類,B正確;
在同一個包中的類在預設的情況下是可以相互訪問的,C正確;
一般情況下用package語句將原始檔存入指定的包中,如果沒有該語句,則原始檔存入當前目錄下,所以 D的說法不正確。
2. 關鍵字supper的作用是( )
A、用來訪問父類被隱藏的成員變數
B、 用來呼叫父類中被過載的方法
C、 用來呼叫父類的建構函式
D、 以上都是
在Java中,子類在隱藏了父類的成員變數或覆蓋了父類的方法後,常常還需要用到父類的成員變數或方法或者父類的建構函式。比如,為了簡化程式碼的編寫,子類中的覆蓋方法就會經常呼叫父類中被覆蓋的方法。此時,使用變數super能夠實現對父類成員的訪問。
3. 設有下面兩個賦值語句:
a = Integer.parseInt(“12”);
b = Integer.valueOf(“12”).intValue();
下述說法正確的是( )。
A、 a是整數型別變數,b是整數類物件。
B、 a是整數類物件,b是整數型別變數。
C、 a和b都是整數類物件並且值相等。
D、 a和b都是整數型別變數並且值相等。
1. Integer.parseInt 返回int 值
2. Integer.valueOf(“12”) 返回Integer, 再呼叫.intValue();返回int
所以a,b都是int型並且值相等。
4. 在Java中,多型的實現不僅能減少編碼的工作量,還能大大提高程式的可維護性及可擴充套件性,下面哪一個選項不屬於多型的條件( )。
A、 子類重寫父類的方法
B、 子類過載同一個方法
C、 定義方法時,把父類型別作為引數型別;呼叫方法時,把父類或子類的物件作為引數傳入方法
D、 執行時,根據實際建立的物件型別動態決定使用哪個方法
多型的表現:1、方法多型:重寫,過載2、物件多型:向下轉型,向上轉型
A:子類重寫父類的方法重寫是繼承關係,只有當子類繼承父類時並且想改動父類的方法才會發生重寫。 比如說狗繼承了動物類,動物類下有吃的方法,然後狗想把吃的方法改成吃骨頭,這時呼叫重新,當然子類可繼承父類中的方法,也可以不用重新編寫相同的方法。方法多型性的體現是繼承和過載。
B:子類過載同一個方法過載就是在類中可以建立多個方法,它們具有相同的名字,但具有不同的引數和不同的定義。 呼叫方法時通過傳遞給它們的不同個數和型別的引數來決定具體使用哪個方法,這是多型的特性。
C:多型呼叫方法優先子類,子類沒有宣告才會呼叫父類的方法。1、分開看:方法名(當前類名的方法名)與方法體(new出來的是對應的方法體)要分開看。2、子帶父:建立一個子類的例項,那麼相當於連帶的建立了父類的例項。例:Father mm = new Child();//Child 是 Father的子類。那麼 mm.出來的東西,只能是Father中的方法名,但是方法體的例項確是Child中的同名方法體。
D:執行時,根據實際建立的物件型別動態決定使用哪個方法。呼叫方法時通過傳遞給它們的不同個數和型別的引數來決定具體使用哪個方法,這是多型的特性。
5. 下面關於陣列的說法中,錯誤的是( )
A、 在類中宣告一個整數陣列作為成員變數,如果沒有給它賦值,數值元素值為空
B、 陣列可以在記憶體空間連續儲存任意一組資料
C、 陣列必須先宣告,然後才能使用
D、 陣列本身是一個物件
在類中宣告一個整數陣列作為成員變數,如果沒有給它賦值,數值元素值為資料型別的預設值,例如int型別預設值為0。
6. 以下關於抽象類和介面的說法錯誤的是( )
A、 抽象類在 Java 語言中表示的是一種繼承關係,一個類只能使用一次繼承。但是一個類卻可以實現多個介面
B、 在抽象類中可以沒有抽象方法
C、 實現抽象類和介面的類必須實現其中的所有方法,除非它也是抽象類。介面中的方法都不能被實現
D、 介面中的方法都必須加上 public 關鍵字
實現介面的類必須實現其中的所有方法,意思是,一類個類繼承了一個介面,就必須要實現這個接口裡面所有的方法。
7. 下列說法正確的有( )
A、 在類方法中可用this來呼叫本類的類方法
B、 在類方法中呼叫本類的類方法時可直接呼叫
C、 在類方法中只能呼叫本類中的類方法
D、 在類方法中絕對不能呼叫例項方法
8. 求1000-5000中的個位+百位=十位+千位的數字有多少個( )
A、 180
B、 280
C、 380
D、 480
1 public class Main { 2 public static void main(String[] args) { 3 int count = 0; 4 for(int i = 1000;i<=5000;i++){ 5 if ((i%10 + i/10%10) == (i/100%10 + i/1000)){ 6 count ++; 7 } 8 } 9 System.out.println(count); 10 } 11 }
9. 下列關於建構函式的敘述中,錯誤的是( )
A、 Java語言規定構造方法名和類名保持一致
B、 Java語言規定構造方法沒有返回值,但不用void宣告
C、 Java語言規定構造方法不可以過載
D、 Java語言規定構造方法只能通過new自動呼叫
構造方法是類中的一種特殊方法,是為物件初始化操作編寫的方法,用它來定義物件的初始狀態。構造方法名必須與類名相同,它沒有返回值,使用者不能直接呼叫它,只能通過new自動呼叫。構造方法具有下列特點:①因為構造方法與類名必須相同,所以方法首字母小寫規則對它不適用。②構造方法是給物件賦初值,所以沒有返回值,但不要void來宣告。③構造方法不能被程式呼叫。④構造方法可由程式設計人員在類中定義,預設時由Java語言自動生成。⑤構造方法可以過載實現不同的初始化方法,呼叫時按引數決定呼叫哪個方法。
10. 關於面向物件的說法正確的是( )
A、 類可以讓我們用程式模擬現實世界中的實體
B、 有多少個實體就要建立多少個類
C、 物件的行為和屬性被封裝在類中,外界通過呼叫類的方法來獲得,但是要知道類的
內部是如何實現
D、 現實世界中的某些實體不能用類來描述
二、簡答/填空題(共25分)
1. 重寫與過載的區別。(6分)
過載:過載字面意思多次的意思,也就是同一個方法實現多個不同的邏輯,並可以在同一個類中可以實現。其實現的原理是,方法名相同,引數的個數或者型別不同即可。
重寫:重寫就是要重新去寫(實現),一個類中不可能兩個定義一樣的方法。因此,重寫就是子類對父類定義的方法重新實現一次。
2. 利用Java求出1到100之間所有質數之和___1060_____。(6分)
1 public class Prime { 2 public static void main(String[] args) { 3 int j; 4 int sum = 0; 5 for (int i = 2; i <= 100; i++) {// 1不是素數,所以直接從2開始迴圈 6 j = 2; 7 while (i % j != 0) { 8 j++; // 測試2至i的數字是否能被i整除,如不能就自加 9 } 10 if (j == i) // 當有被整除的數字時,判斷它是不是自身 11 { 12 sum+=i; // 如果是就sum+ 13 } 14 } 15 System.out.println(sum); 16 } 17 }
3. abstract 與哪些關鍵字不能共存為什麼?(6分)
1、和static:
abstract class A {
public abtract static void method();
}
static修飾後可以直接類名呼叫方法,但是抽象方法沒有實現體,呼叫無意義;
2、和final:
final修飾的類不能被繼承,修飾的方法不能被重寫,修飾的成員變數只能為常量;但是繼承的子類要重寫這個抽象方法,所以會出現矛盾;
3、和private:
抽象方法是為了讓子類重寫並給定實現體,但是private修飾的方法只能本類訪問,所以矛盾。
4. 美國數學家維納(N.Wiener)智力早熟,11歲就上了大學。他曾在1935~1936年應邀來中國清華大學講學。一次,他參加某個重要會議,年輕的臉孔引人注目。於是有人詢問他的年齡,他回答說:“我年齡的立方是個4位數。我年齡的4次方是個6位數。這10個數字正好包含了從0到9這10個數字,每個都恰好出現1次。”請問他的年齡是___19_____。(7分)
1 package PREV_55; 2 3 public class Test { 4 public static void main(String[] args) { 5 char[] a, b; 6 int[] c = new int[10]; 7 for (int i = 11; i <= 99; i++) { 8 a = String.valueOf(i * i * i).toCharArray(); 9 b = String.valueOf(i * i * i * i).toCharArray(); 10 11 int g = i*i*i; 12 int h = i*i*i*i; 13 if (g >= 1000 && g <= 9999) { 14 if (h >= 100000 && h <= 999999) { 15 for (int j = 0; j < 4; j++) { 16 c[j] = a[j] - '0'; 17 } 18 for (int k = 0; k < 6; k++) { 19 c[k + 4] = b[k] - '0'; 20 } 21 int[] e = new Test().sort(c); 22 boolean f = new Test().judge(e); 23 if(f) { 24 System.out.println(i); 25 break; 26 } 27 } 28 } 29 30 } 31 } 32 33 public int[] sort(int[] a) { 34 int t; 35 for (int i = 0; i < a.length; i++) { 36 for (int j = 0; j < a.length - 1; j++) { 37 if (a[j] > a[j + 1]) { 38 t = a[j]; 39 a[j] = a[j + 1]; 40 a[j + 1] = t; 41 } 42 } 43 } 44 return a; 45 } 46 47 public boolean judge(int[] a) { 48 int[] b = {0,1,2,3,4,5,6,7,8,9}; 49 for(int i = 0;i<b.length;i++) { 50 if(b[i] != a[i]) { 51 return false; 52 } 53 } 54 return true; 55 } 56 57 }
三、程式設計題(共45分)
1. 輸入一個數組,最大的元素與第一個元素交換,最小的元素與最後一個元素交換,然後輸出陣列。(10分)
1 public class Answer1 { 2 public static void main(String[] args) { 3 int t; 4 int max = 0, min = 0;//初始化最大值最小值為0; 5 int m, n;//m,n記錄最大值最小值的位置 6 Scanner input = new Scanner(System.in);//建立input物件 7 int[] a = new int[5];//宣告並建立了一個一維陣列a,並分配了5個元素 8 for (int i = 0; i < a.length; i++) { 9 a[i] = input.nextInt(); 10 max = a[0];//將第一個值定義為最大值 11 m = 0; 12 min = a[0];//將第一個值定義為最小值 13 n = 0; 14 if (max <= a[i]) 15 max = a[i]; //取出最大值 16 if (min >= a[i]) 17 min = a[i];//取出最小值 18 } 19 for (int i = 0; i < a.length; i++) { 20 if (max == a[i]) { 21 m = i; //獲取最大值位置 22 } 23 if (min == a[i]) { 24 n = i;//獲取最小值位置 25 }//將最大值與第一個元素互換,最小值與最後一個元素互換 26 t = a[0]; 27 a[0] = max; 28 max = t; 29 t = a[a.length - 1]; 30 a[a.length - 1] = min; 31 min = t; 32 } 33 for (int i = 0; i < a.length; i++) { 34 System.out.print(a[i] + "\t");//輸出陣列 35 } 36 } 37 }
2. 一個數如果恰好等於它的因子之和,這個數就稱為"完數"。例如6=1+2+3.程式設計找出1000以內的所有完數。(13分)
1 public class Answer2 { 2 public static void main(String[] args) { 3 int sum = 0; 4 for (int i = 1; i <= 1000; i++) { 5 sum = 0; 6 int arr[] = new int[i]; 7 for (int j = 1; j < i; j++) { 8 if (i % j == 0) { 9 int k = 0; 10 arr[k] = j; 11 sum += arr[k]; 12 k++; 13 } 14 } 15 if (i == sum) { 16 System.out.print(i + " "); 17 } 18 } 19 } 20 }
3. 按題目程式設計實現下列功能。(22分)
要求:按照題目所給變數名稱、型別和方法名稱進行程式設計,禁止修改
(1) 語言介面(Language)
常量:
母語型別(motherLan) 字串型別 常量值為中文
成員方法:
showForein( ),輸出所掌握的外語語種
(2) 教師類(Teacher)
成員變數:
工號(tId) String型別
姓名(name) String型別
構造方法:
通過形參初始化成員變數工號(tId)、姓名(name)
普通方法:
寫出成員引數name對應的getter和setter方法,分別用於獲取和設定類中name變數的值;
(3) 大學教師類(UniverTeacher),繼承自Teacher類,實現Language介面
成員變數:
外語語種(foreinLan) String型別
所在院系(department) String型別
構造方法:
呼叫父類構造方法初始化工號(tId)和姓名(name)資訊,再初始化外語語種(foreinLan)和所在院系(department)。
普通方法:
1)實現介面中的showForein方法
輸出外語語種。
2)重寫equals方法,當且僅當工號(tId)和所在院系(department) 均相等時,即為同一本書。
3)重寫toString方法,返回由工號(tId)、姓名(name)和所在院系(department)組成的字串,
格式如下:工號=2017091257,姓名=劉華,院系=資訊工程學院
(4) 通過main函式測試。
1)建立兩個大學教師(UniverTeacher)物件t1和t2,其中t1的工號和姓名分別採用自己的學號和姓名初始化。
2)分別輸出t1和t2物件,使t1物件呼叫其equals方法和t2物件比較,判斷兩個物件是否相等。
1 import java.util.Objects; 2 3 public class Answer3 { 4 public static void main(String[] args) { 5 UniverTeacher univerTeacher1 = new UniverTeacher("1","張三","中文","資訊工程學院"); 6 UniverTeacher univerTeacher2 = new UniverTeacher("1","李四","英文","資訊工程學院"); 7 System.out.println(univerTeacher1); 8 System.out.println(univerTeacher2); 9 System.out.println(univerTeacher1.equals(univerTeacher2)); 10 } 11 } 12 13 interface Language{ 14 String motherLan = "中文"; 15 public void showForein(); 16 } 17 18 class Teacher{ 19 String tId; 20 private String name; 21 22 public Teacher(String tId, String name) { 23 this.tId = tId; 24 this.name = name; 25 } 26 27 public String getName() { 28 return name; 29 } 30 31 public void setName(String name) { 32 this.name = name; 33 } 34 } 35 36 class UniverTeacher extends Teacher implements Language{ 37 private String foreinLan; 38 private String department; 39 40 public UniverTeacher(String tId, String name, String foreinLan, String department) { 41 super(tId, name); 42 this.foreinLan = foreinLan; 43 this.department = department; 44 } 45 46 @Override 47 public void showForein() { 48 System.out.println(foreinLan); 49 } 50 51 @Override 52 public boolean equals(Object o) { 53 if (this == o) return true; 54 if (!(o instanceof UniverTeacher)) return false; 55 UniverTeacher that = (UniverTeacher) o; 56 return Objects.equals(tId, that.tId) && 57 Objects.equals(department, that.department); 58 } 59 60 @Override 61 public int hashCode() { 62 return 0; 63 } 64 65 @Override 66 public String toString() { 67 return "工號="+super.tId + ",姓名="+super.getName()+",院系="+department; 68 } 69 }