t6
- 下列1234注释标注的哪行代码有错?( )
A.1 B.2 C.3 D.4
class Animal{
int m=100;
Animal(){m=20;}
Animal(int m){
this.m=m;//1
}
}
class Dog extends Animal{
Dog(){
m=100;
super(2);//2
}
Dog (int m){
super();//3
this.m=m;//4
见t4解析,super和this必须放在构造方法的首句
t7
- 下列哪个是正确的?( )
A.线程被创建,在JVM管理的线程队列立刻就有这个线程。
B.当一个线程进入中断状态后,它被放在JVM管理的线程队列中的最前面排队等待CPU资源
C.一个线程从死亡状态可以再回到中断状态
D.线程调用start()方法可以使一个线程成为可运行的,但是它不一定立即开始运行
A线程被创建后,该线程仅处于新建状态,此时由 JVM 为其分配内存,并未进入线程队列。(需要start以进入就绪状态)
B 理解1 中断状态只是一个标志位,只是告诉线程你该中断了。除非你的循环条件里含有检测这个标志位的代码,否则没用,这个线程不会立刻停止。
理解2:中断了都结束了。
C线程死亡以后,生命周期结束。被回收。
D就绪状态=可运行的状态!=运行状态
线程生命周期
当线程被创建并启动以后,既不是一启动就进入了执行状态,也不是一直处于执行状态。
在线程的生命周期中,它要经过新建、就绪、运行、和死亡5 种状态。线程启动以后,不可能一直"霸占"着 CPU 独自运行,所以CPU 需要在多条线程之间切换,于是线程状态也会多次在运行、阻塞之间切换。
#新建状态(NEW)
使用 new 关键字创建了一个线程之后,该线程就处于新建状态。
此时仅由 JVM 为其分配内存,并初始化其成员变量的值。
#就绪状态(RUNNABLE)
调用了start()方法之后,该线程处于就绪状态。
JVM会为其创建方法调用栈和程序计数器,等待调度运行。
就绪状态又称为可运行状态。(可以运行,但不一定正在运行)
#运行状态(RUNNING)
如果处于就绪状态的线程获得了 CPU,开始执行 run()方法的线程执行体,则该线程处于运行状态。
#阻塞状态(BLOCKED)
阻塞状态是指线程因为某种原因放弃了 cpu 使用权,暂时停止运行。直到线程再次进入就绪(runnable)状态,才有机会再次获得 cpu timeslice 转到运行(running)状 态。
阻塞的情况分三种:
等待阻塞
运行(running)的线程执行 o.wait()方法,JVM 将该线程放入等待队列(waitting queue) 中。
同步阻塞
运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则 JVM 把该线程放入锁池(lock pool)中。
其他阻塞(sleep/join)
运行(running)的线程执行 Thread.sleep()或 t.join()方法,或者发出了 I/O 请求时, JVM 会把该线程置为阻塞状态。
当sleep()状态超时、join()等待线程终止或者超时、或者 I/O 处理完毕时,线程重新转入可运行(runnable)状态。
#线程死亡(DEAD)
线程会以下面三种方式结束,结束后就是死亡状态。
正常结束
run()或 call()方法执行完成,线程正常结束。、
异常结束
线程抛出一个未捕获的 Exception 或 Error。
调用 stop
直接调用该线程的stop()方法来结束该线程—该方法通常容易导致死锁,不推荐使用。
t8
8.下列条件语句中,功能与其他语句不同的是( )
A if (a)printf(" %d\n", x); else printf(" %d\n", y);
B if (a == 0)printf(" %d\n", y); else printf(" %d\n", x);
C if (a != 0)printf(" %d\n", x); else printf(" %d\n", y);
D if (a == 0)printf(" %d\n", x); else printf(" %d\n", y);
t9
- 下列【代码】注释标注的代码的结果是( )
public class Main{
public static void main(String args[ ]){
String hello=“你好”;
String testOne=“你”+“好”;
String mimi=hello;
System.out.println(hello==testOne);//【代码】
}}
A. 代码有错 B. true C. false D. 以上都不对
常量字符串相加
如: temp=“AB”+“CD”;,会被编译优化。
编译时就已经确定其值,与temp="ABCD"等价。
变量字符串相加
String temp1 = “AB”;
String temp2 = “CD”;
String str = temp1 + temp2;
在底层调用的是StringBuilder类中的构造方法及append()方法实现:
String str = new StringBuilder().append(temp1).append(temp2).toString();
String.intern 用法
总结
等号右边只要有变量,就会在堆中new一个新对象。
等号右边全是常量,则在编译时创建在常量池中。
t10
- 下列【代码】注释标注的代码的输出结果为( )
public class E{
public static void main(String args[ ]){
Stack stack= new Stack();
stack.push(1);
stack.push(2);
int m=stack.pop();
System.out.printf(“%d:%d”, m, stack.size());//【代码】
}
}
A.1: 2 B. 2: 2 C. 1 :1 D.2:1