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