Java经典笔试题—day08

🔎选择题

(1)下列选项中关于Java中super关键字的说法正确的是()

A.super关键字是在子类对象内部指代其父类对象的引用
B.super关键字不仅可以指代子类的直接父类,还可以直接指代父类的父类
C.子类通过super关键字只能调用父类的方法,而不能调用父类的属性
D.子类通过super关键字只能调用父类的属性,而不能调用父类的方法

A

B. super 关键字只能指代子类的直接父类, 不能指代父类的父类
C, D. 通过 super 关键字既可以调用父类的方法, 也可以调用父类的属性
在这里插入图片描述

(2)A派生出子类B,B派生出子类C,并且在java源代码中有如下声明:

A a0=new A();
A a1=new B();
A a2=new C();

以下哪个说法是正确的?

A.第1行,第2行和第3行的声明都是正确的
B.第1,2,3行都能通过编译,但第2,3行运行时出错
C.第1,2行能通过编译,但第3行编译出错
D.只有第1行能通过编译

A

继承具有传递性
在这里插入图片描述

(3)以下说法错误的是()

A.数组是一个对象
B.数组不是一种原生类
C.数组的大小可以任意改变
D.在Java中,数组存储在堆中连续内存空间里

C

A. 数组是一个对象 (int[] nums = new int[n])
B. 数组是原生类, 可以有整型(int[])数组, 字符型(char[])数组, 字符串型(String[])数组…
C. 数组的大小一经定义就不能改变(不会自动扩容)
D. new 出来的对象默认存储在堆中, 因为数组是连续的, 所以数组存储在堆中的连续内存空间里

(4)Test.main() 函数执行后的输出是()

public class Test {
	public static void main(String [] args){
		System.out.println(new B().getValue());
	}
	static class A{
		protected int value;
		public A(int v) {
			setValue(v);
		}
		public void setValue(int value) {
			this.value = value;
		}
		public int getValue() {
			try{
				value++;
				return value;
			} catch(Exception e) {
				System.out.println(e.toString());
			} finally {
				this.setValue(value);
				System.out.println(value);
			}
			return value;
		}
	}

	static class B extends A{
		public B() {
			super(5);
			setValue(getValue() - 3);
		}
		public void setValue(int value){
			super.setValue(2 * value);
		}
	}
}

A.11 17 34
B.22 74 74
C.6 7 7
D.22 34 17

D

建议调试一下该代码, 以便加深印象
-------------------------------------------------------------------------------
需要注意的是此处实例化的是 A 的子类 B, 默认执行的是子类的方法
new B().getValue()
拆分成2部分, 1. new B() 2.getValue()
-------------------------------------------------------------------------------
执行 new B() 操作
super(5)
调用父类的构造方法, 执行 setValue() 方法, 此处执行的是子类的 setValue()
value 的值变为 10
setValue(getValue() - 3)
先执行 getValue(), 因为子类没有重写父类的 getValue() 方法, 所以执行的是父类的 getValue() 方法
执行 getValue() 操作
value++, value 的值变为 11, 最后返回 11
但是下面有 finally, 就先去执行了 finally 的 setValue(), 此处的 setValue() 依旧是调用子类的 setValue()
value 的值变为 22
打印 22
返回 getValue() 的结果 11 到 setValue(getValue() - 3), 变为 setValue(11 - 3)
调用子类的 setValue()
value 的值变为 16
-------------------------------------------------------------------------------
执行 getValue() 操作
value++ , value 的值变为 17, 最后返回 17
但是下面有 finally, 就先去执行了 finally 的 setValue(), 此处的 setValue() 依旧是调用子类的 setValue()
value 的值变为 34
打印 34
返回 getValue() 的结果 17 并输出
-------------------------------------------------------------------------------
在这里插入图片描述

(5)关于Java的异常处理机制的叙述哪些正确?

A.如果程序发生错误及捕捉到异常情况了,才会执行finally部分
B.其他选项都不正确
C.当try区段的程序发生异常且被catch捕捉到时,才会执行catch区段的程序
D.catch部分捕捉到异常情况时,才会执行finally部分

C

A, D. finally 不论怎样都会被执行
C. 当 catch() 捕获到异常才会执行 catch 区段的程序

(6)如何跳出Array的forEach循环?()

A.break
B.return true
C.return false
D.以上都不是

A

B, C. 当返回值为 void, int, String… 时, 就会产生错误

(7)一个以”.java”为后缀的源文件 ( )

A.只能包含一个类,类名必须与文件名相同
B.只能包含与文件名相同的类以及其中的内部类
C.只能有一个与文件名相同的类,可以包含其他类
D.可以包含任意类

C

可以包含多个类, 但只能有一个与文件名相同的类

(8)如下Java语句

double x = 3.0;
int y = 5;
x /= --y;

执行后, x的值是()

A3
B.0.6
C.0.4
D.0.75

D

--y是将 y 的值先进行 -1 操作, 因此 x = 3 .0 / 4 = 0.75

(9)下列代码运行后输出结果为()

public class Test1 {
    static int cnt = 6;
    static {
        cnt += 9;
    }
    public static void main(String[] args) {
        System.out.println("cnt =" + cnt);
    }
    static {
        cnt /= 3;
    }
}

A.cnt=5
B.cnt=2
C.cnt=3
D.cnt=6

A

执行顺序: 静态代码块 > 构造块 > 构造方法
在这里插入图片描述

如果在 main() 方法前面添加上一个构造方法, 结果也仍然是5
在这里插入图片描述

(10)以下程序的运行结果是()

public class Increment {
    public static void main(String args[]) {
        int a;
        a = 6;
        System.out.print(a);
        System.out.print(a++);
        System.out.print(a);
    }
}

A.666
B.667
C.677
D.676

B

第一次打印 a = 6
第二次打印 a = 6, 然后 a 的值++变为7
第三次打印, a = 7

🔎编程题

🥝两种排序方法

题目描述

考拉有n个字符串字符串,任意两个字符串长度都是不同的。
考拉最近学习到有两种字符串的排序方法:

1.根据字符串的字典序排序。例如:
“car” < “carriage” < “cats” < "doggies < “koala”

2.根据字符串的长度排序。例如:
“car” < “cats” < “koala” < “doggies” < “carriage”

考拉想知道自己的这些字符串排列顺序是否满足这两种排序方法,考拉要忙着吃树叶,所以需要你来帮忙验证。

输入描述

输入第一行为字符串个数n(n ≤ 100) 接下来的n行,每行一个字符串,字符串长度均小于100,均由小写字母组成

输出描述

如果这些字符串是根据字典序排列而不是根据长度排列输出"lexicographically",
如果根据长度排列而不是字典序排列输出"lengths",
如果两种方式都符合输出"both",否则输出"none"

在这里插入图片描述
解题思路

根据题意进行模拟即可

  • 字典序注意事项
    • 如果前一个字符串的第 i 个字符比当前字符串的第 i 个字符小即可结束比较, 并进入下一轮比较
    • 如果前一个字符串的第 i 个字符比当前字符串的第 i 个字符大, 即可直接判断这些字符串排列顺序不是字典序
import java.util.Scanner;

public class Main1 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        while(scan.hasNextLine()) {
            int n = scan.nextInt();
            scan.nextLine();

            String[] strs = new String[n];
            for(int i = 0; i < n; i++) strs[i] = scan.nextLine();

            boolean flag1 = isDic(strs);
            boolean flag2 = isLen(strs);
            if(flag1 && !flag2) System.out.println("lexicographically");
            else if(!flag1 && flag2) System.out.println("lengths");
            else if(flag1 && flag2) System.out.println("both");
            else System.out.println("none");
        }
    }

    private static boolean isDic(String[] strs) {
        //判断字典序
        int n = strs.length;
        for (int i = 1; i < n; i++) {
            int index = 0;
            // 判断两个字符串的最小长度
            int minLen = Math.min(strs[i].length(),strs[i - 1].length());
            while(index < minLen) {
                char cur = strs[i].charAt(index), pre = strs[i - 1].charAt(index);
                if(pre < cur) {
                    break;
                } else if(pre > cur) {
                    return false;
                }
                index++;
            }
            if(index == minLen && strs[i].length() < strs[i - 1].length()) return false;
        }
        return true;
    }
	// 判断长度
    private static boolean isLen(String[] strs) {
        int n = strs.length;
        for (int i = 1; i < n; i++) {
            if (strs[i].length() < strs[i - 1].length()) return false;
        }
        return true;
    }
}

也可以将判断字典序改写成系统自带得判断 compareTo() 方法

private static boolean isDic(String[] strs) {
       int n = strs.length;
       for (int i = 1; i < n; i++) {
           if(strs[i].compareTo(strs[i - 1]) < 0) return false;
       }
       return true;
}

📢题目链接
链接: link


🥝求最小公倍数

题目描述

正整数 a 和正整数 b 的最小公倍数,是指能被 a 和 b 整除的最小的正整数。
请你求 a 和 b 的最小公倍数。
比如输入5和7,5和7的最小公倍数是35,则需要返回35。

输入描述

输入两个正整数

输出描述

输出最小公倍数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解题思路

求解 a 和 b 得最小公倍数
可以用 (a, b) 得乘积 除 (a, b) 得最大公约数
利用辗转相除法求解 (a, b) 得最大公约数

  • 以 4, 6 为例

    • 4 * 6 = 24
    • 4, 6 得最大公约数是 2
    • 24 / 2 = 12
  • 辗转相除法

    • 以除数和余数反复做除法运算, 当余数为0时, 此时得除数就是最大公约数
    • 辗转相除法用于求解两个正整数得最大公约数
    • 以 1997 和 615 为例
      • 1997 ÷ 615 = 3(余 152)
      • 615 ÷ 152 = 4(余 7)
      • 152 ÷ 7 = 21(余 5)
      • 7 ÷ 5 = 1(余 2)
      • 5 ÷ 2 = 2(余 1)
      • 2 ÷ 1 = 2(余 0)
      • 所以 1997 和 615 得最大公约数为 1
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        while(scan.hasNextInt()) {
            int A = scan.nextInt();
            int B = scan.nextInt();

            System.out.println(getNum(A,B));
        }
    }
    //求最小公倍数
    private static long getNum(int A,int B) {
        long a = A,b = B;
        int x = A % B;
        if(x == 0)  return Math.min(a,b);
        while(x != 0) {
        	// A 变成了除数
            A = B;
            // B 变成了余数
            B = x;
            x = A % B;
        }

        return (a * b) / B;
    }
}

📢题目链接
链接: link


🔎结尾

创作不易,如果对您有帮助,希望您能点个免费的赞👍
大家有什么不太理解的,可以私信或者评论区留言,一起加油

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值