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