Java期末梳理【超实用】

大学所用教材《Java语言基础教程》李东明 张丽娟 主编 开卷考!笔试原题在下方

下方“Java学习思维导图1.0”下载链接 https://download.csdn.net/download/qq_41587612/12135450

我根据教材手动整理了“Java学习思维导图”,基本覆盖全书。第一章完全展开后如图 ↓

未来我还将持续更新、扩展,若哪天我转行不干了,就会在此写上“停更”两个字!

每个版本の下载链接都永久有效,不会因为下一个版本的发布而删除。

正在进行の学习路线:尚学堂+《深入理解计算机系统 [美]Randal E.Bryant和David O’ Hallaron著》

未来将会结合以上所学知识谱写知识总结。

作者の期末原题(考试时间较紧,要笔速快且简洁,可带电脑)

一、简述题(40分)

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. 初始化完毕后,将堆内存中的地址值赋给引用变量。

二、编程题(60分,使用Java语言)

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();
        }
    }
}

发布了45 篇原创文章 · 获赞 143 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_41587612/article/details/104081639