一、 选择题(每道题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] + " ");//输出数组 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 }