题目
选自牛客网述
1.下面有关java基本类型的默认值和取值范围,说法错误的是?
A.字节型的类型默认值是0,取值范围是-27—27-1
B.boolean类型默认值是false,取值范围是true\false
C.字符型类型默认是0,取值范围是-2^15 —2^15-1
D.long类型默认是0,取值范围是-263—263-1
正确答案
- C. 字符型(
char
)类型默认是0,取值范围是-2^15 —2^15-1。
- 解释:
char
类型的默认值实际上是\u0000
,取值范围是从0到2^16-1。
2.以下哪些jvm的垃圾回收方式采用的是复制算法回收
A.新生代串行收集器
B.老年代串行收集器
C.并行收集器
D.新生代并行回收收集器
E.老年代并行回收收集器
F.cms收集器
正确答案:AD
在Java虚拟机(JVM)中,不同的垃圾回收器采用不同的算法来管理内存。复制算法是一种常用的垃圾回收算法,它主要用于新生代的垃圾回收。下面是针对每个选项的分析:
A. 新生代串行收集器(Serial Collector)
- 采用复制算法。新生代串行收集器使用复制算法来回收新生代内存。
B. 老年代串行收集器(Serial Old Collector)
- 不采用复制算法。老年代串行收集器通常使用标记-整理算法。
C. 并行收集器(Parallel Collector)
- 新生代部分采用复制算法。并行收集器在新生代使用复制算法,在老年代使用标记-整理算法。
D. 新生代并行回收收集器(Parallel Scavenge Collector)
- 采用复制算法。新生代并行回收收集器使用复制算法来回收新生代内存。
E. 老年代并行回收收集器(Parallel Old Collector)
- 不采用复制算法。老年代并行回收收集器通常使用标记-整理算法。
F. CMS收集器(Concurrent Mark Sweep Collector)
- 不采用复制算法。CMS收集器主要针对老年代,使用标记-清除算法。
解释
复制算法通常用于新生代,因为新生代中的对象生命周期较短,大部分对象很快就会被回收。复制算法通过将新生代划分为两个相等的部分(通常称为From
Space和To Space),在每次垃圾回收时将存活的对象复制到另一个空间中,而原来的区域则被清空。标记-整理算法和标记-清除算法通常用于老年代,因为老年代中的对象生命周期较长,对象存活率较高,不适合频繁复制。
因此,选项A和D是采用复制算法进行垃圾回收的。
3.下面哪些类可以被继承? Java.lang.Thread、java.lang.Number、java.lang.Double、java.lang.Math、 java.lang.ClassLoader
A.Thread
B.Number
C.Double
D.Math
E.ClassLoader
正确答案:ABE
选项分析
A.
java.lang.Thread
- 可以被继承。
Thread
类不是最终类,因此可以被继承。B.
java.lang.Number
- 可以被继承。虽然
Number
类是一个抽象类,但是它可以被继承。实际上,Integer
、Float
、Double
等数值类型都是继承自Number
类的。C.
java.lang.Double
- 不可以被继承。
Double
类是最终类(final
),因此不能被继承。D.
java.lang.Math
- 不可以被继承。
Math
类是最终类(final
),因此不能被继承。E.
java.lang.ClassLoader
- 可以被继承。
ClassLoader
类不是最终类,因此可以被继承。正确答案
- A.
java.lang.Thread
- B.
java.lang.Number
- E.
java.lang.ClassLoader
解释
Thread
类不是最终类,因此可以被继承。Number
类虽然是一个抽象类,但它可以被继承,例如Integer
、Float
和Double
类都是继承自Number
类。ClassLoader
类不是最终类,因此可以被继承。
4.在java中,已定义两个接口B和C,要定义一个实现这两个接口的类,以下语句正确的是()
A.interface A extends B,C
B.interface A eimplements B,C
C.class A implements B,C
D.class A implements B,implements C
正确答案:C
在Java中,要定义一个类实现两个接口,正确的语法是使用
class
关键字,并在类定义后面使用implements
关键字列出要实现的所有接口。接口列表应该用逗号分隔。选项分析
A.
interface A extends B, C
- 错误。这个选项定义了一个接口
A
,它扩展了接口B
和C
。这不是实现接口的正确语法。B.
interface A implements B, C
- 错误。这个选项同样定义了一个接口
A
,但使用了implements
关键字,这是不正确的。implements
关键字用于类实现接口。C.
class A implements B, C
- 正确。这个选项定义了一个类
A
,它实现了接口B
和C
。这是正确的语法。D.
class A implements B, implements C
- 错误。这个选项试图实现两次接口
C
,这是无效的语法。
代码示例
下面是一个简单的代码示例来展示如何定义一个类实现两个接口:
// 假设我们有两个接口 B 和 C
interface B {
void methodB();
}
interface C {
void methodC();
}
// 定义一个类 A 实现接口 B 和 C
class A implements B, C {
@Override
public void methodB() {
System.out.println("Method B is called.");
}
@Override
public void methodC() {
System.out.println("Method C is called.");
}
}
public class Main {
public static void main(String[] args) {
A obj = new A();
obj.methodB();
obj.methodC();
}
}
在这个示例中,类 A
成功实现了接口 B
和 C
。
5.以下代码执行后输出结果为( )
public class ClassTest{
String str = new String("hello");
char[] ch = {'a','b','c'};
public void fun(String str, char ch[]){
str="world";
ch[0]='d';
}
public static void main(String[] args) {
ClassTest test1 = new ClassTest();
test1.fun(test1.str,test1.ch);
System.out.print(test1.str + " and ");
System.out.print(test1.ch);
}
}
A.hello and dbc
B.world and abc
C.hello and abc
D.world and dbc
正确答案:A
代码分析
- 初始化变量:
String str = new String("hello"); char[] ch = {'a', 'b', 'c'};
- 方法调用:
test1.fun(test1.str, test1.ch);
- 方法内部:
public void fun(String str, char ch[]) {
str = "world";
ch[0] = 'd'; }
- 字符串参数:
str
被赋值为"world"
。但在Java中,字符串是不可变的,所以这里的str
是一个新的局部变量,不会影响到原始的str
变量。- 数组参数:
ch[0]
被赋值为'd'
。数组是可变的,所以改变数组的内容会影响到原始数组。
- 输出结果:
System.out.print(test1.str + " and ");
System.out.print(test1.ch);
输出结果分析
- 字符串输出:原始的
str
变量仍然保持为"hello"
,因为在方法fun
中对str
的修改并没有影响到原始的str
。- 数组输出:原始的
ch
数组的第一个元素被修改为'd'
,所以在输出时会看到'd'
。最终输出
- 字符串输出:
"hello"
- 数组输出:
"dbc"