企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
> 考试说明:本次测试卷一共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]); } } } ```