01 以下程序执行的结果是?
考点:JAVA程序的执行顺序。
class X{
Y y=new Y();
public X(){
System.out.print("X");
}
}
class Y{
public Y(){
System.out.print("Y");
}
}
public class Z extends X{
Y y=new Y();
public Z(){
System.out.print("Z");
}
public static void main(String[] args) {
new Z();
}
}
Java程序的执行顺序如下:
1)初始化父类静态变量、静态代码块
2)初始化子类静态变量、静态代码块
3)初始化父类普通成员变量、代码块、执行父类构造方法
4)初始化子类成员变量、代码块、子类构造方法
public class Test{
public static Test t1 = new Test();//静态变量
//构造块 {
System.out.println("blockA");
}
//静态块
static {
System.out.println("blockB");
}
public static void main(String[] args){
Test t2 = new Test();
}
}
构造代码块:类中直接用{}定义,每一次创建对象时执行。
1 静态域 :首先执行,第一个静态域是一个静态变量 public static Test t1 = new Test(); 创建了Test 对象,会执行构造块代码,所以输出blockA。然后执行第二个静态域(即静态代码块)输出blockB。
2 main():Test t2 = new Test()执行,创建Test类对象,只会执行构造代码块(创建对象时执行),输出blockA。
3 构造代码块只会在创建对象时执行,没创建任何对象了,所以没输出
4 构造函数:使用默认构造函数,没任何输出
所以输出结果为ABA
public class MyThead extends Thread{
public static void main(String[] args) {
MyThead t=new MyThead();
MyThead s=new MyThead();
t.start();
System.out.println("one.");
s.start();
System.out.println("two.");
}
public void run() {
System.out.println("Thread");
}
}
C:程序运行可能结果是:one.two.Thread Thread
D:程序运行结果不稳定
分析:
两个start方法之后一共三个线程就绪:主线程,线程s,线程t,处于就绪状态中的线程并没有开始运行,至于什么时候开始运行,取决于取决于JVM里线程调度器的调度。 start()是开启线程,等待获得时间片,一到获得时间片就执行。所以可能一开启就获得了时间片执行,也有可能等到two输出后才获得了时间片。所以BC都可能,所以D也正确。
线程状态:
在Java当中,线程通常都有五种状态,创建、就绪、运行、阻塞和死亡: 第一是创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。 第二是就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。 第三是运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。 第四是阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个事件的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。 第五是死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。 调用start()后,线程会被放到等待队列,等待CPU调度,并不一定要马上开始执行,只是将这个线程置于可动行状态。然后通过JVM,线程Thread会调用run()方法,执行本线程的线程体。先调用start后调用run。
答案:BCD
03 下面说法正确的是?
考点:Java方法和类
分析:
答案:AB
04 执行以下代码输出的结果是?
考点:Java异常处理
public class Demo{
public static void main(String args[]){
int num = 10;
System.out.println(test(num));
}
public static int test(int b){
try
{
b += 10;
return b;
}
catch(RuntimeException e)
{
}
catch(Exception e2)
{
}
finally
{
b += 10;
return b;
}
}
}
解析:
1:无论try是否发生异常,finally语句都会执行。
2:如果try/catch中包含控制转移语句(return、continue、break),finally都会在这些控制语句前执行。
3:如果try/catch中有System.exit(0)退出JVM,或Daemon线程退出(也就是线程被中断或kill),finally语句不会执行 。
一句话:针对本题目中,因为finally中有return语句,所以该return会把try中的return覆盖掉,try中并不会执行return,而是程序跳转到finally中执行b+=10,之后再走finally的return,所以本题目的结果为30,如果finally中没有return,则返回的为20,因为finally只能修改引用类型的数据,无法修改值类型的。
05 判断结果
考点:Java基本数据类型,类型转换
解析:
首先==与equals是有明显区别的。
==强调栈中的比较,可以理解为地址比较,equals强调对象的内容比较
String s=“hello”;会在栈中生成hello字符串,并存入字符串常量池中。
String t=“hello” ;创建时,会在字符串常量池中寻找,当找到需要的hello时,不进行字符串的创建,引用已有的。
所以,s==t返回true,s.equals(t)也是true。
char c[]={'h','e','l','l','o'};
c==s这个是不存在的,==两边类型不同
t.equals(c)这个语句在anObject instanceof
String这步判断不会通过,也就是cha[] 压根不能与String相比较,类型不是相同的。返回false,答案为B
06 程序的执行结果
考点:Java多态,输出结果
class Base{
public void method(){
System.out.println("Base");
}
}
class Son extends Base{
public void method() {
System.out.println("Son");
}
public void methodB(){
System.out.println("SonB");
}
}
public class Test01{
public static void main(String[] args) {
Base base = new Son();
base.method();
base.methodB();
}
}
解析:编译看左边,运行看右边。意思编译时候,看左边有没有该方法,运行的时候结果看,所以结果为D 。
07 Servlet生命周期
Servlet的生命周期一般可以用三个方法来表示:init():仅执行一次,负责在装载Servlet时初始化Servlet对象
- service() :核心方法,一般HttpServlet中会有get,post两种处理方式。在调用doGet和doPost方法时会构造servletRequest和servletResponse请求和响应对象作为参数。destory():在停止并且卸载Servlet时执行,负责释放资源。初始化阶段:Servlet启动,会读取配置文件中的信息,构造指定的Servlet对象,创建ServletConfig对象,将ServletConfig作为参数来调用init()方法。所以选ACD。B是在调用service方法时才构造的。
全部评论