题目
选自牛客网
1.运行下面代码,输出的结果是()
class A {
public A() {
System.out.println(“class A”);
}
{ System.out.println(“I’m A class”); }
static { System.out.println(“class A static”); }
}
public class B extends A {
public B() {
System.out.println(“class B”);
}
{ System.out.println(“I’m B class”); }
static { System.out.println(“class B static”); }
public static void main(String[] args) {
new B();
}
}
A.class A static
class B static
I’m A class
class A
I’m B class
class B
B.class A static
I’m A class
class A
class B static
I’m B class
class B
C.class A static
class B static
class A
I’m A class
class B
I’m B class
D.class A static
class A
I’m A class
class B static
class B
I’m B class
正确答案:A
官方解析: 关于Java程序初始化顺序:
父类的静态代码块
子类的静态代码块
父类的普通代码块
父类的构造方法
子类的普通代码块
子类的构造方法
按照这个顺序,答案选择A
2.以下哪一个不是赋值符号?
A.+=
B.<<=
C.<<<=
D.>>>=
在Java中,
+=
,<<=
, 和>>>=
都是复合赋值操作符,它们分别用于执行加法后赋值、左移位后赋值和无符号右移位后赋值。然而,<<<=
并不是一个有效的Java操作符,因为Java中没有这样的操作符定义。因此,正确答案是C
。这些复合赋值操作符提供了一种更简洁的方式来更新变量的值。例如,
a += b
等价于a = a + b
,a <<= b
等价于
a = a << b
,而a >>>= b
等价于a = a >>> b
。这些操作符使得代码更紧凑,同时也提高了代码的可读性。在Java中,
>>>=
是一个无符号右移操作符,这意味着当一个数右移时,左边的空位会被0填充,而不论原来的数是正数还是负数。这与有符号右移操作符>>
不同,>>
会保持原来的符号位,即正数的左边空位填充0,负数的左边空位填充1。因此,对于选项:
- A.
+=
是一个有效的赋值操作符。- B.
<<=
也是一个有效的赋值操作符,执行左移位后赋值。- C.
<<<=
不是一个有效的Java操作符。- D.
>>>=
同样是一个有效的赋值操作符,执行无符号右移位后赋值。选项C是正确答案。
3.下面代码的运行结果为:()
import java.io.;
import java.util.;
public class foo{
public static void main (String[] args){
String s;
System.out.println(“s=” + s);
}
}
A.代码得到编译,并输出“s=”
B.代码得到编译,并输出“s=null”
C.由于String s没有初始化,代码不能编译通过
D.代码得到编译,但捕获到 NullPointException异常
正确答案:C 在Java中,局部变量不像实例变量或类变量那样有默认初始化值。在上述代码中,String
s是在main方法中声明的局部变量,但它没有被显式初始化。因此,当尝试在System.out.println语句中使用s时,Java编译器将抛出一个编译错误,指出变量s可能尚未初始化。这是因为Java编译器要求所有局部变量在使用之前必须被初始化,以确保不会出现意外的空指针异常。如果s被初始化为null或其他值,则代码将能够编译并运行。但在给定的代码片段中,s没有初始化,因此编译器将阻止代码编译,直到这个问题被解决。
4.java用()机制实现了线程之间的同步执行
A.监视器
B.虚拟机
C.多个CPU
D.异步调用
正确答案:A
在Java中,线程之间的同步执行主要通过监视器锁(Monitor
Lock)机制实现,这通常体现在java.lang.Object
类中的wait()
,notify()
, 和notifyAll()
方法,以及synchronized
关键字的使用上。监视器锁是Java虚拟机(JVM)提供的一种锁机制,用于控制多线程对共享资源的访问。当一个线程进入一个由
synchronized
关键字修饰的方法或代码块时,它会自动获取该方法或代码块所属对象的监视器锁。如果该对象的锁已被其他线程持有,那么当前线程将被阻塞,直到锁被释放。当线程退出synchronized
块或方法时,它会释放锁,允许其他等待的线程获取锁并进入代码执行。
wait()
,notify()
, 和notifyAll()方法也是通过监视器锁机制实现的。这些方法只能在同步代码块或方法中调用,因为它们依赖于对象的监视器锁。当线程调用
wait()时,它会释放当前对象的锁并进入等待状态,直到其他线程调用
notify()或
notifyAll()来唤醒它。
notify()方法只会唤醒一个等待的线程,而
notifyAll()`会唤醒所有等待的线程。因此,选项A(监视器)是正确的答案,Java使用监视器锁机制实现了线程之间的同步执行。这种机制确保了线程的安全性和数据的一致性,避免了多线程环境下的竞态条件和死锁问题。
5.()运算符把其操作数中所有值为0和所有值为1的位分别在结果的相应中设置1和0
A.&
B.|
C.!
D.~
正确答案:D
~
(按位取反运算符)。按位取反运算符
~
会对操作数的每一位进行取反操作。如果操作数的某一位是0,那么结果的该位就是1;如果操作数的某一位是1,那么结果的该位就是0。选项解释:
- A.
&
(按位与运算符):只有当操作数的对应位都是1时,结果的该位才是1。- B.
|
(按位或运算符):只要操作数的对应位中至少有一个是1,结果的该位就是1。- C.
!
(逻辑非运算符):用于逻辑运算,不是按位操作。- D.
~
(按位取反运算符):对操作数的每一位进行取反。因此,只有
~
运算符符合题目描述,将操作数中所有值为0的位设置为1,所有值为1的位设置为0。
总结
坚持就是胜利,相信自己,加油!