题目
选自牛客网
1.下面有关JDK中的包和他们的基本功能,描述错误的是?
A.java.awt: 包含构成抽象窗口工具集的多个类,用来构建和管理应用程序的图形用户界面
B.java.io: 包含提供多种输出输入功能的类
C.java.lang: 包含执行与网络有关的类,如URL,SCOKET,SEVERSOCKET
D.java.util: 包含一些实用性的类
正确答案:C
- A. java.awt:这个选项是正确的。
java.awt
包确实包含了用于构建和管理应用程序图形用户界面的基本类和接口。- B. java.io:这个选项也是正确的。
java.io
包提供了文件和数据的各种输入/输出操作所需的类和接口。- C. java.lang:这个选项是错误的。
java.lang
包并不是包含网络相关的类,而是包含了构成 Java 语言核心 API 的类,比如Object
,String
,Integer
,System
等。网络相关的类实际上位于java.net
包中,例如URL
,Socket
, 和ServerSocket
。- D. java.util:这个选项是正确的。
java.util
包包含了大量实用工具类,如集合框架类(例如List
,Set
,Map
),以及Date
,Calendar
,Random
等其他常用类。
2.下面的Java赋值语句哪些是有错误的 ()
A.int i =1000;
B.float f = 45.0;
C.char s = ‘\u0639’;
D.Object o = ‘f’;
E.String s = “hello,world\0”;
F.Double d = 100;
正确答案:BF
F. Double 是java定义的类,double是java定义的数据类型 B. float f = 45.0;
错误。这是因为默认情况下,小数字面量被视为 double 类型。为了赋值给 float 类型的变量,需要使用 f 或 F 后缀,例如
float f = 45.0f; 或者使用强制类型转换 float f = (float)45.0;。
3.以下哪几种方式可用来实现线程间通知和唤醒:( )
A.Object.wait/notify/notifyAll
B.ReentrantLock.wait/notify/notifyAll
C.Condition.await/signal/signalAll
D.Thread.wait/notify/notifyAll
正确答案:AC
在Java中,线程间的同步和通信可以通过不同的机制来实现。下面是对每个选项的分析:
A. Object.wait/notify/notifyAll
- 正确。
wait()
,notify()
, 和notifyAll()
方法是Object
类的方法,可以用于实现线程间的同步和通信。这些方法通常在一个对象的监视器锁(monitor lock)上使用,该锁由
synchronized
关键字获取。B. ReentrantLock.wait/notify/notifyAll
- 错误。
ReentrantLock
类本身并没有wait()
,notify()
, 或notifyAll()
方法。ReentrantLock
是一个可重入的互斥锁,它不支持这些特定的同步方法。C. Condition.await/signal/signalAll
- 正确。
Condition
接口提供了比Object
的wait()
,notify()
, 和notifyAll()
更高级别的同步功能。await()
,signal()
, 和signalAll()
分别对应于
wait()
,notify()
, 和notifyAll()
。Condition
对象通常与
ReentrantLock
结合使用,因为ReentrantLock
提供了newCondition()
方法来创建
Condition
实例。D. Thread.wait/notify/notifyAll
- 错误。
Thread
类并没有wait()
,notify()
, 或notifyAll()
方法。这些方法属于Object
类,而不是Thread
类。
4.执行以下程序后的输出结果是()
public class Test {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operator(a, b);
System.out.println(a + "," + b);
}
public static void operator(StringBuffer x, StringBuffer y) {
x.append(y); y = x;
}
}
A.A,A
B.A,B
C.B,B
D.AB,B
正确答案:D
首先,我们有
StringBuffer
类型的两个变量a
和b
,分别初始化为 “A” 和 “B”。接下来,在
main
方法中调用了operator
方法,传递了a
和b
作为参数。在
operator
方法内部:
x.append(y);
这一行将y
的内容附加到x
的末尾。由于x
初始值为 “A”,y
的初始值为 “B”,所以执行完这一行后x
的值变为 “AB”。y = x;
这一行将x
的引用赋给了y
。这意味着现在y
指向了x
所指向的同一个StringBuffer
对象。但是需要注意的是,
StringBuffer
是一个值类型(对象),而非原始类型。当我们将y
设置为x
的引用时,这并不会改变在main
方法中b
变量所引用的对象。回到
main
方法,当我们打印a
和b
的值时:
a
在调用operator
方法后被修改为 “AB”,因此a
的值为 “AB”。b
的值仍然是 “B”,因为在operator
方法中改变y
的引用并不会影响到main
方法中的b
变量。因此,最终输出结果为
"AB,B"
。
5.下列说法正确的是
A.在类方法中可用this来调用本类的类方法
B.在类方法中调用本类的类方法可直接调用
C.在类方法中只能调用本类的类方法
D.在类方法中绝对不能调用实例方法
正确答案:B
A. 在类方法中可用 this 来调用本类的类方法
- 错误。
this
关键字通常用于引用当前对象的实例,而在类方法(静态方法)中无法访问非静态成员(包括this
)。因此,不能使用this
来调用类方法(静态方法)。B. 在类方法中调用本类的类方法可以直接调用
- 正确。在类方法(静态方法)中可以直接调用本类的其他类方法(静态方法),无需使用任何特殊的语法。
C. 在类方法中只能调用本类的类方法
- 错误。类方法不仅可以调用本类的其他类方法,还可以调用其他类的类方法,甚至可以调用静态变量等。
D. 在类方法中绝对不能调用实例方法
- 错误。虽然类方法不能直接访问非静态成员(包括实例方法),但在某些情况下,可以通过创建类的实例并使用该实例来调用实例方法。但这不是直接调用,而是通过创建实例间接调用。