> 考試說明:本次測試卷一共25道測試題,共計100分。考試時間120分鐘。
## 一、選擇題(共 15 題,每題 2 分)
1. 關于 Java 語言 static 應用說法正確的是(C)
```
A 父類中的靜態方法可以被子類重寫
B 靜態數據是屬于對象的,可以通過某個對象來引用
C 父類和子類具有同名的靜態方法時,當子類對象向上轉型后,只能調用到父類原有的靜態方法
D 靜態的方法中可以通過方法名直接調用非靜態的方法
```
2. 以下在 Java 中定義接口正確的是(B)
```
A public interface PersonDao { public int age; public int getAge(); }
B public interface PersonDao { public String getName(); public int getAge(); }
C public interface PersonDao { public String getName() {} pubic int getAge() {} }
D public interface PersonDao { private String getName() {} private int getAge() {} }
```
3. 以下關于 Java 語言繼承的說法正確的是(C)
```
A Java 中的類可以有多個直接父類
B 抽象類不能有父類
C Java中的接口支持多繼承
D 最終類可以作為其他類的父類
```
4. 對于構造方法,下列敘述不正確的是(C)
```
A 構造方法允許重載
B 子類默認調用父類的無參構造方法
C 子類不被允許調用父類的構造方法
D 在同一個類中定義的重載構造方法可以互相調用
```
5. 對于子類的構造方法說明,下列敘述中不正確的是(C)
```
A 子類默認調用父類的無參構造器
B 子類可以在自己的構造方法中使用super關鍵字來調用父類指定的構造方法
C 在創建子類對象的時,將先執行調用自父類的無參構造方法,然后再執行自己的構造方法
D 子類不但可以調用父類的無參構造方法,也可以調用父類的有參構造方法
```
6. 有關 Java 中的類和對象,以下說法錯誤的是(B)
```
A 同一類的所有對象都擁有相同的特征和行為
B 類和對象一樣,只是說法不同
C 對象是具有屬性和行為的實體
D 類規定了對象擁有的特征和行為
```
7. 在Java中,包的推薦命名規范不正確的是(BD)
```
A java 的包名都是小寫單詞組成的
B java 的包名首字母大寫
C java 的包名采用的是域名的倒序
D java 的包名用圓括號包括
```
8. 如下Java代碼的輸出結果為(C)
```
public class Student {
public void Student() {
System.out.println("構造學生對象");
}
public static void main(String[] args) {
Student student = new Student();
}
}
```
```
A 輸出:構造學生對象
B 編譯錯誤
C 正確運行,但是什么也不輸出
D 輸出:"構造學生對象"
```
9. 下面中哪兩個可以在A的子類中使用(AC)
```
public class A {
protected int method1(int a, int b) {
return 0;
}
}
```
```
A public int method1(int a, int b) {return 0;}
B private int method1(int a, int b) {return 0;}
C private int method1(int a, long b) {return 0;}
D public short method1(int a, int b) {return 0;}
```
10. 在下方的代碼中,BitUtils 和 SomeApp 分別放在不同的包中,當需要在 SomeApp 中的 main 方法中調用 BitUtils 中的 process方法時,即(1)處需要填寫的代碼是(C)
```java
package util;
public class BitUtils {
public static void process(byte[] b) {
// ... something ...
}
}
package app;
public class SomeApp {
public static void main(String[] args) {
byte[] bytes = new byte[256];
// (1)
}
}
```
```
A process(bytes);
B BitUtils.process(bytes);
C util.BitUtils.process(bytes);
D 在SomeApp中無法調用BitUtils中的方法;
```
11. 當類中的一個成員方法被下面哪個修飾符修飾后,該方法只能在本類中被訪問(B)
```
A public B private C final D default
```
12. 在 Java 中,以下程序的運行結果是(A)
```
public class Person {
String name;
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.name);
}
}
```
```
A 輸出:null
B 正常運行,但不會輸出任何內容
C 編譯出錯,不能運行
D 能運行,但運行時會出現異常
```
13. 下列哪個不是單例模式的要點(B)
```
A 某個類只能有一個實例
B 某個類可以有一個實例
C 單例模式必須自行創建實例
D 必須自行向整個系統提供自行創建的實例
```
14. 下列關于 Java 中接口的說法不正確的是(C)
```
A 接口中方法的訪問修飾符默認為 public
B 接口中的方法如果寫成 void test(); 的形式,默認是抽象方法
C 實現接口的類中在重寫接口中方法時訪問修飾符可以為 protected
D 當類實現接口時,需要實現接口中所有的抽象方法,否則需要將該類設置為抽象類
```
15. 下列關于 instanceof 說法不正確的是(C)
```
A instanceof 的返回值為 true 和 false
B instanceof 可以用來判斷對象是否可滿足某個特定類型
C 可以通過"A instanceof B"表示 A 類可以轉型為B類
D instanceof 可放在if語句的條件表達式中
```
## 二、閱讀題(共 2 題,每題 5 分)
1. 下面 Java 代碼的運行結果是()
```
public class Penguin {
private String name; // 名字
private int health; // 健康值
private String sex; // 性別
public void Penguin() {
name = "QQ";
health = 10;
sex = "雄性";
}
public void print() {
System.out.println("名字是" + name);
System.out.println("健康值是" + health);
System.out.println("性別是" + sex);
}
public static void main(String[] args) {
Penguin pgn = new Penguin();
pgn.print();
}
}
```
```
名字是:null
健康值是:0
性別是:null
```
2. 下面 Java 代碼的運行結果是()
```
public class Father {
static {
System.out.println("父類靜態構造");
}
{
System.out.println("父類構造塊");
}
public Father () {
System.out.println("父類構造方法");
}
}
public class Son extends Father {
static {
System.out.println("子類靜態構造");
}
{
System.out.println("子類構造塊");
}
public Son () {
System.out.println("子類構造方法");
}
public static void main(String[] args) {
Son s1 = new Son();
Son s2 = new Son();
}
}
```
```
父類靜態構造
子類靜態構造
父類構造塊
父類構造方法
子類構造塊
子類構造方法
父類構造塊
父類構造方法
子類構造塊
子類構造方法
```
## 三、簡述題(共 3 題,每題 10 分)
1. 請簡述方法重載與方法重寫的區別。
```
方法重載:滿足以下條件的兩個方法我們稱之為方法重載(Overload)。
1. 在同一個類中
2. 方法名相同
3. 方法參數列表不同(參數類型不同、參數個數不同,參數順序不同,與參數名稱無關)
注意:方法重載與訪問修飾符無關,與返回值類型無關。
方法重寫:滿足以下條件的方法我們稱之為方法重寫(Override)。
1. 在繼承父類的子類中
2. 子類方法名與父類相同
3. 子類方法參數列表與父類相同
4. 子類方法訪問修飾符必須比父類訪問范圍要大
5. 子類方法返回值類型如下:
基礎數據類型必須保持一致
引用數據類型必須與父類返回值類型一致,或者是其的派生類
```
2. 請簡述抽象類與接口的區別。
```
1. 聲明
抽象類是類,使用 abstract + class 關鍵字來聲明,接口使用 interface 關鍵字來聲明
2. 構造方法
抽象類含有構造方法,接口沒有構造方法。
抽象類里的構造方法并不能實例對象,而是提供給其子類在實例對象時調用,完成初始化操作。
3. 方法
接口在JDK1.7之前只能包含抽象方法,在JDK1.8之后可以包含靜態方法和默認方法(default修飾)
接口所有方法訪問修飾符只能為public,可以省略。抽象方法,可以省略abstract關鍵字。
抽象類中所有普通方法訪問修飾符沒有限制。
抽象類中抽象方法必須使用abstract修飾,不可省略,訪問修飾符不能為private。
4. 屬性
抽象類中可以包含成員變量與靜態變量。
接口中只能包含靜態常量,默認為 public static final 類型,必須初始賦值。
5. 繼承與實現
一個類只能繼承一個抽象類,重寫抽象方法,使用extends關鍵字。
一個接口可以繼承多個接口,使用extends關鍵字。
一個類可以實現多個接口,重寫抽象方法,使用implements關鍵字。
```
3. 請寫出任意一種單例設計模式的代碼。
```
public class HungrySingleton {
private HungrySingleton () {}
private static HungrySingleton instance = new HungrySingleton();
public static HungrySingleton getInstance() {
return instance;
}
}
public class LazySingleton {
private LazySingleton() {}
private static LazySingleton instance;
public static LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
```
## 四、編程題(共 3 題,每題 10 分)
1. 定義圖形 Shape 類、圓 Circle 類和矩形 Rectangle 類完成以下代碼輸出。
```
圓的面積為 38.465
矩形的面積為 30.0
```
```
public abstract class Shape {
public abstract double area();
}
public class Circle extends Shape {
private static final double PI = 3.14;
private double round;
public double area() {
return PI * this.getRound() * this.getRound();
}
// constructor
// getter/setter...
}
public class Rectangle extends Shape {
private double length;
private double width;
public double area() {
return this.getLength() * this.getWidth();
}
// constructor
// getter/setter...
}
public class Test {
public static void main(String[] args) {
Shape circle = new Circle(3.5);
Shape rectangle = new Rectangle(6.0, 5.0);
System.out.println("圓的面積為" + circle.area());
System.out.println("矩形面積為" + rectangle.area());
}
}
```
2. 定義教師 Teacher 類、學生 Student 類以及班級 Clazz 類完成以下代碼輸出。
```
30歲的張揚老師正在403教室給三年級二班的10名同學上數學課。
上課的同學有20歲的張三、21歲的李四、22歲的王五和23歲的趙六。
```
```
public class Teacher {
private String name;
private int age;
private String subject;
public void teaching(Clazz clazz) {
System.out.print(this.getAge() + "歲的" + this.getName() + "老師正在給");
System.out.print(clazz.getRoom() + clazz.getGrade() + clazz.getName() + "的");
System.out.print(clazz.getNum() + "名同學上" + this.getSubject() + "課" );
System.out.print("上課的同學有:" + clazz.studentInfo());
}
// constructor
// getter setter...
}
public class Student {
private String name; // 姓名
private int age; // 年齡
// constructor
// getter setter ...
}
public class Clazz {
private String room; // 教室
private String grade; // 年級
private String name; // 班級名稱
private Student[] students = new Student[10]; // 學生們
private int num; // 實際學生數量
// 此方法不考慮學生排滿溢出的情況
public void addStudent(Student student) {
for (int i = 0; i < students.length; i++) {
if (students[i] == null) {
students[i] = student;
num++;
break;
}
}
}
// constructor
// getter setter ...
public String studentsInfo() {
String info = "";
for (int i = 0; i < students.length; i++) {
info += students[i].getAge() + "的" + students[i].getName() + " ";
}
return info;
}
}
public class Test {
Teacher zhang = new Teacher(35, "張揚", "數學");
Clazz clazz = new Clazz("403教室", "三年級", "二班");
Student s1 = new Student(20, "張三");
Student s2 = new Student(21, "張四");
Student s3 = new Student(22, "張五");
Student s4 = new Student(23, "張六");
clazz.addStudent(s1);
clazz.addStudent(s2);
clazz.addStudent(s3);
clazz.addStudent(s4);
zhang.teaching(clazz);
}
```
3. 編寫三個系別的學生類:英語系、計算機系以及文學系。定義一個可容納 5 個學生類數組,初始學生成績等信息,按照綜合成績從低到高排序輸出。各系總分評測標準如下:
```
英語系:演講 50%、期中考試 25%、期末考試 25%
計算機系:操作能力 40%、英語寫作 20%、期中考試 20%、期末考試 20%
文學系:演講 35%、作品 35%、期中考試 15%、期末考試 15%
```
```
public abstract class Student {
private int middle; // 期中
private int end; // 期末
public abstract int calcTotal();
// constructor
// getter setter
}
public class EnglishStudent extends Student {
private int speech; // 演講
// constructor
// getter setter
@Override
public int calcTotal() {
return (int) (0.5 * this.getSpeech() + 0.25 * this.getMiddle() + 0.25 * this.getEnd());
}
@Override
public String toString() {
return "EnglishStudent{綜合成績=" + this.calcTotal() +
", 演講=" + this.getSpeech() +
", 期中=" + this.getMiddle() +
", 期末=" + this.getEnd() +
'}';
}
}
public class ComputerStudent extends Student {
private int operate; // 操作
private int writing; // 寫作
// constructor
// getter setter
@Override
public int calcTotal() {
return (int) (0.4 * this.getOperate() + 0.2 * this.getWriting()
+ 0.2 * this.getMiddle() + 0.2 * this.getEnd());
}
@Override
public String toString() {
return "ComputerStudent{綜合成績=" + this.calcTotal() +
", 操作=" + this.getOperate() +
", 寫作=" + this.getWriting() +
", 期中=" + this.getMiddle() +
", 期末=" + this.getEnd() +
'}';
}
}
public class LiteratureStudent extends Student {
private int speech; // 演講
private int works; // 作品
// constructor
// getter setter
@Override
public int calcTotal() {
return (int) (0.35 * this.getSpeech() + 0.35 * this.getWorks()
+ 0.15 * this.getMiddle() + 0.15 * this.getEnd());
}
@Override
public String toString() {
return "LiteratureStudent{綜合成績=" + this.calcTotal() +
", 演講=" + this.getSpeech() +
", 作品=" + this.getWorks() +
", 期中=" + this.getMiddle() +
", 期末=" + this.getEnd() +
'}';
}
}
public class Test {
public static void main(String[] args) {
Student[] students = new Student[] {
new LiteratureStudent(70, 90, 100, 80),
new EnglishStudent(90, 70, 90),
new ComputerStudent(70, 70, 70, 70),
new ComputerStudent(80, 90, 90, 70),
new EnglishStudent(80, 80, 80)
};
Arrays.sort(students, Comparator.comparingInt(Student::calcTotal));
for (int i = 0; i < students.length; i++) {
System.out.println(students[i]);
}
}
}
```
- 階段一 Java 零基礎入門
- 步驟1:基礎語法
- 第01課 初識
- 第02課 常量與變量
- 第03課 運算符
- 第04課 選擇結構
- 第05課 循環結構
- 第06課 一維數組
- 第08課 方法
- 第09課 數組移位與統計
- 第10課 基礎語法測試
- 第09課 基礎語法測試(含答案)
- 步驟2:面向對象
- 第01課 類和對象
- 第02課 封裝
- 第03課 學生信息管理
- 第04課 繼承
- 第05課 單例模式
- 第06課 多態
- 第07課 抽象類
- 第08課 接口
- 第09課 內部類
- 第10課 面向對象測試
- 第10課 面向對象測試(含答案)
- 步驟3:常用工具類
- 第01課 異常
- 第02課 包裝類
- 第03課 字符串
- 第04課 集合
- 第05課 集合排序
- 第06課 泛型
- 第07課 多線程
- 第08課 輸入輸出流
- 第09課 案例:播放器
- 第10課 常用工具測試(一)
- 第10課 常用工具測試(一)(答案)
- 第10課 常用工具測試(二)
- 第10課 常用工具測試(二)(答案)
- 階段二 從網頁搭建入門 JavaWeb
- 步驟1:HTML 與 CSS
- 第01課 HTML 入門
- 第01課 HTML 入門(作業)
- 第02課 CSS 入門
- 第02課 CSS 入門(作業)
- 第03課 CSS 布局
- 第03課 CSS 布局(作業)
- 步驟2:JavaScript 與前端案例
- 第01課 JavaScript 入門
- 第01課 JavaScript 入門(作業)
- 第02課 仿計算器
- 第03課 前端油畫商城案例
- 第04課 輪播圖
- 第05課 網頁搭建測試
- 第05課 網頁搭建測試(含答案)
- 步驟3:JavaScript 教程
- 入門
- 概述
- 基本語法
- 數據類型
- 概述
- 數值
- 字符串
- undefined, null 和布爾值
- 對象
- 函數
- 數組
- 運算符
- 算術運算符
- 比較運算符
- 布爾運算符
- 位運算符
- 運算順序
- 語法專題
- 數據類型的轉換
- 錯誤處理機制
- 標準庫
- String
- Date
- Math
- DOM
- 概述
- Document 節點
- 事件
- EventTarget 接口
- 事件模型
- 常見事件
- 階段三 數據庫開發與實戰
- 步驟1:初始數據庫操作
- 第01課 數據類型
- 第02課 表的管理
- 第03課 數據管理
- 第04課 常用函數
- 第05課 JDBC 入門
- 第06課 Java 反射
- 第07課 油畫商城
- 第08課 數據庫基礎測試
- 步驟2:MyBatis 從入門到進階
- 第01課 IntelliJ IDEA 開發工具入門
- 第02課 Maven 入門
- 第03課 工廠模式
- 第04課 MyBatis 入門
- 第05課 MyBatis 進階
- 第06課 商品信息管理
- 第07課 MyBatis 基礎測試
- 步驟3:Redis 數據庫與 Linux 下項目部署
- 第01課 Linux 基礎
- 第02課 Linux 下 JDK 環境搭建及項目部署
- 第03課 Redis 入門
- 階段四 SSM 到 Spring Boot 入門與綜合實戰
- 步驟1:Spring 從入門到進階
- 第01課 Spring 入門
- 第02課 Spring Bean 管理
- 第03課 Spring AOP
- 第04課 基于 AspectJ 的 AOP 開發
- 第05課 JDBC Template
- 第06課 Spring 事務管理
- 第07課 人員管理系統開發
- 第08課 Spring 從入門到進階測試
- 步驟2:Spring MVC 入門與 SSM 整合開發
- 第01課 Spring MVC 入門與數據綁定
- 第02課 Restful 風格的應用
- 第03課 SpringMVC 攔截器
- 第04課 辦公系統核心模塊
- 步驟3:Spring Boot 實戰
- 第01課 Spring Boot 入門
- 第02課 校園商鋪項目準備
- 第03課 校園商鋪店鋪管理
- 第04課 校園商鋪商品管理及前臺展示
- 第05課 校園商鋪框架大換血
- 步驟4:Java 面試
- 第01課 面試準備
- 第02課 基礎面試技巧
- 第03課 Web基礎與數據處理
- 第04課 主流框架