Java经典笔试题—day08

简介: 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;
}
• 1
• 2
• 3
• 4
• 5
• 6
• 7

📢题目链接

链接: 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月前
|
存储 安全 Java
冒死潜入某个外包公司获得的珍贵Java基础笔试题(附答案)
冒死潜入某个外包公司获得的珍贵Java基础笔试题(附答案)
54 0
|
9月前
|
SQL 存储 数据管理
Java经典笔试题—day13
Java经典笔试题—day13
|
9月前
|
机器学习/深度学习 SQL 关系型数据库
Java经典笔试题—day14
Java经典笔试题—day14
|
9月前
|
Java
Java经典笔试题—day12
Java经典笔试题—day12
|
9月前
|
算法 Java 数据库
Java经典笔试题—day11
Java经典笔试题—day11
|
9月前
|
存储 安全 Java
Java经典笔试题—day10
Java经典笔试题—day10
126 0
|
9月前
|
Java
Java经典笔试题—day09
Java经典笔试题—day09
|
9月前
|
存储 Java 数据安全/隐私保护
Java经典笔试题—day07
Java经典笔试题—day07
|
9月前
|
人工智能 Java BI
Java经典笔试题—day06
Java经典笔试题—day06
|
9月前
|
Java
Java经典笔试题—day05
Java经典笔试题—day05