大学所用教材《Java语言基础教程》李东明 张丽娟 主编 开卷考!笔试原题在下方
下方“Java学习思维导图1.0”下载链接https://github.com/PigeonIsSmart/JavaXMind.git
我根据教材手动整理了“Java学习思维导图”,基本覆盖全书。完全展开后如图 ↓
未来我还将持续更新、扩展。
每个版本の下载链接都永久有效,不会因为下一个版本的发布而删除。
作者の期末原题(考试时间较紧,要笔速快且简洁,可带电脑)
1. 什么叫抽象类?抽象类跟接口有什么区别?(5分)P110
用abstract关键字修饰的类称抽象类。
区别:①接口不存在最高层,而类的最高层为Object类
②一个类只能继承一个抽象类(单继承);一个类可实现多个接口
③抽象类及成员具有与普通类一样的访问权限;接口的访问权限有public和默认权限,接口中成员的访问权限皆为public
④抽象类中可声明成员变量,其值可变;接口中只能声明常量
⑤抽象类中可声明抽象方法、普通成员方法、构造方法;接口中只能声明抽象方法
2. java中,你所知道的集合有哪些(接口或类)?他们之间有什么关系?(5分)P164
3. 函数重写和函数重载有什么不同?各自有什么样的要求?(5分)P102-103
函数重写/覆盖Override:在子类中根据需要对从父类中继承来的方法进行重写,其中参数和返回值类型都相同,(子类中的)重写方法不能使用比(父类中的)被重写方法更严格的访问权限。不能抛出新的检查异常 or 比(父类中)被重写方法申明更加宽泛的检查型异常。
函数重载Overload:在同一类中存在两个及以上的同名方法,这些同名方法根据参数列表的不同来区分,与返回值类型无关。不同的参数形式包括有无参数、参数类型、参数个数及参数顺序。对访问修饰符没有要求。可以抛出不同的异常。
4. toString()和equals()函数的作用是什么?什么时候应该重写它们?(5分)
Object的toString()方法返回一个字符串,这个字符串的格式是固定的:类名@十六进制的hashcode值。默认情况下的数据对我们来说没有意义,一般建议重写该方法来显示我们要的对象属性。
public boolean equals(String str)比较当前字符串对象的实体是否与参数str指定字符串的实体相同(如果是基本数据类型比较的是值,如果是引用数据类型比较的是地址),若相同,返回值为true,否则为false。默认情况下比较的是两对象的内存地址,而我们实际应用中往往需要比较两对象的属性值,所以需要重写equals()。
5. 面向对象的三个特点?以及你对三个特点的理解?(5分)
封装:指将某事物的属性和行为包装到对象中,这个对象只对外公布需要公开的属性和行为,而这个公布也是可以有选择性的公布给其它对象。在java中能使用private、protected、public三种修饰符或不用(即默认defalut)对外部对象访问该对象的属性和行为进行限制。
继承:子对象可以继承父对象的属性和行为,即父对象拥有的属性和行为,其子对象也就拥有了这些属性和行为。这非常类似大自然中的物种遗传。
多态:指允许不同类的对象对同一消息作出响应。比如同样的加法,把两个时间加在一起和把两个整数加在一起肯定完全不同。又比如,同样的选择编辑-粘贴操作,在字处理程序和绘图程序中有不同的效果。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
6. try、catch、finally语句块中代码的作用及三个关键字的有效组合使用?(5分)
try:用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。出现异常后的内容不再被执行,跳到catch里执行,一般记录异常日志或对出现异常所引起的问题做一定的修复。
catch:用于捕获try语句块中发生的异常。
finally:该语句块总是会被执行。它主要用于回收在try块里打开的物理资源(如数据库连接、网络连接和磁盘文件)。只有finally块执行完成之后,才会回来执行try或者catch块中的return或者throw语句;如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。
throw:用于抛出异常。
throws:用在方法签名中,用于声明该方法可能抛出的异常。
try{
可能产生异常的功能代码
}catch(ExceptionType e){
对异常类型e的处理
}finally{
必执行,释放进程使用的资源。一般拿来做一些善后清理工作,不是必须存在的。
}
7. 列举String类和Math类的常用方法及作用?(5分)P115、135
//String类的常用方法
public int length( ); 求字符串长度
public char charAt(int index); 返回串对象下标index处的字符
public int indexOf(String s); 从头字符开始检索,返回首次出现s的索引位置
public String substring(int begin); 返回从下标begin开始到串尾的子串
public String substring(int begin, int end); 返回从下标begin开始到end-1结束的子串
//Math类的常见方法
Math.abs(a); 取绝对值
Math.ceil(a); 向上取整,结果是double类型
Math.floor(a); 向下取整,结果是double类型
Math.max(a,b); 两参数a和b中取最大值
Math.min(a,b); 两参数a和b中取最小值
Math.round(); 四舍五入数字。double类型的数字四舍五入之后是long类型,float类型的数字四舍五入之后是int类型
Math.random(); 生成随机数,结果在0~1之间,含0不含1
Math.pow(int a,int b); 幂运算,a的b次方
Math.sqrt(int a); 开根号,根号a
8. 描述一个对象的实例化过程?(5分)
例如:Cat cat = new Cat();
1. JVM会根据指定路径读取Cat.class文件,并加载进内存,有父类(如:Animal)的情况下,会先加载父类的.class文件(即Animal.class)。
2. 在堆内存开辟空间,分配地址。
3. 在对象空间中,对对象的属性进行默认初始化。
3.1 调用对应构造函数进行初始化,这个例子中,调用的就是无参构造函数;
3.2 在构造函数中,第一行会先调用父类中的构造函数进行初始化;
3.3 父类初始化完毕后,再对子类属性进行显式初始化。
4. 进行子类构造函数的特定初始化。
5. 初始化完毕后,将堆内存中的地址值赋给引用变量。
1. 求n!结果中零的个数(2<=n<=100000),例如5!=120,零的个数是1个。(15分)
package Usual;
import java.math.BigInteger;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
System.out.println("输入一个整数n(2<=n<=100000):");
Scanner input = new Scanner(System.in);
int n = input.nextInt();
if (n >= 2 && n < 100000) {
int count = 0;
char[] array = factorial(n).toString().toCharArray();
for (char f : array) {
if (f == '0') {
count++;
}
}
System.out.println(n + "!" + "有" + count + "个0");
} else {
System.out.println("所输入的内容不符合要求!");
}
}
public static BigInteger factorial(int n) {
BigInteger result = new BigInteger("1");
for (int j = 1; j <= n; j++) {
BigInteger num = new BigInteger(String.valueOf(j));
result = result.multiply(num);
}
return result;
}
}
2. 求1945到2018之间的非素数。(15分)
package Usual;
public class Test {
public static void main(String[] args) {
System.out.println("1945到2018间的非素数:");
for (int i = 1945; i <= 2018; i++) {
for (int j = 2; j <= i / 2; j++) {
if (i % j == 0) {
System.out.println(i);
break;
}
}
}
}
}
3. 在控制台中输入一个有大写字母的字符串,然后输出出现次数最多的字母及数量。(15分)日常无视老师出题不严谨
package Usual;
import java.util.Scanner;
import static java.lang.Character.toLowerCase;
public class Test {
public static void main(String[] args) {
System.out.println("请输入一行带有大写字母的英文字符串:");
Scanner input = new Scanner(System.in);
String s = input.nextLine();
char[] c = s.toCharArray();
int[] count = new int[c.length];
//把每个对应的值以及次数存下来
for (int i = 0; i <= c.length - 1; i++) {
char mid = c[i];
for (int j = 0; j <= c.length - 1; j++) {
if (mid == toLowerCase(c[j]))
count[i]++;
}
}
//取出count数组的最大值,并且得到下标
int index = 0;
int max = 0;
for (int i = 0; i <= c.length - 1; i++) {
if (max <= count[i]) {
max = count[i];
index = i;
}
}
System.out.println("出现最多的字符是:" + c[index] + ";出现次数是:" + count[index]);
}
}
4. 设计类MyShape实现运行时输出以下图形,其中数字n是奇数。(15分)代码自编,如有优化,欢迎交流!
当n=3时 当n=5时
*** *** ***** *****
* * *** ***
*** *** * *
*** ***
***** *****
package Usual;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
System.out.print("请输入一个奇数:");
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int t = 0, p = 1;
//上半部分菱形
for (int i = (n + 1) / 2; i > 0; i--) {
for (int j = 1; j <= 2 * n + 1; j++) {
if (j <= n - 2 * t || j > n + 2 * t + 1) {//(2n+1)-(n-2t)=n+2t+1
System.out.print("*");
} else {
System.out.print(" ");
}
}
t += 1;
System.out.println();
}
//下半部分菱形
for (int i = (n - 1) / 2; i > 0; i--) {
for (int j = 1; j <= 2 * n + 1; j++) {
if (j <= n - 2 * (i - 1) || j > n + 2 * i - 1) {//(2n+1)-(n-2i+2)=n+2i-1
System.out.print("*");
} else {
System.out.print(" ");
}
}
System.out.println();
}
}
}