Java小题狂练

  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)初始化子类成员变量、代码块、子类构造方法

初始化步骤:
1.父类静态变量                      本题无
2.父类静态代码块                  本题无
3.子类静态变量                      本题无
4.子类静态代码块                  本题无
5.父类非静态变量                    输出“y”
6.父类非静态代码块                本题无
7.父类构造函数                        输出“x”
8.子类非静态变量                    输出“y”
9.子类非静态代码块                本题无
10.子类构造函数                      输出“z”
所以输出:yxyz
考点:JAVA程序的执行顺序。
 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();
    }
}
静态域:用staitc声明,jvm加载类时执行,仅执行一次
构造代码块:类中直接用{}定义,每一次创建对象时执行。
执行顺序优先级:静态域,main(),构造代码块,构造方法。
1 静态域 :首先执行,第一个静态域是一个静态变量 public static Test t1 = new Test(); 创建了Test 对象,会执行构造块代码,所以输出blockA。然后执行第二个静态域(即静态代码块)输出blockB。
2 main():Test t2 = new Test()执行,创建Test类对象,只会执行构造代码块(创建对象时执行),输出blockA。
3 构造代码块只会在创建对象时执行,没创建任何对象了,所以没输出
4 构造函数:使用默认构造函数,没任何输出
所以输出结果为ABA
02 以下程序说法正确的是?
考点:多线程
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");
	}
}
A:编译失败
B:程序运行可能结果为:one.Thread two.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方法和类

A:JAVA程序的main方法必须写在类里面
B:JAVA程序中可以有多个名字为main方法
C:JAVA程序中类名必须与文件名一样
D:JAVA程序的main方法中,如果只有一条语句,可以不用{}(大括号)括起来

分析:

java是强类型语言,所有的方法必须放在类里面,包括main
java中可以有多个重载的main方法,只有public static void main(String[]args){}是函数入口
内部类的类名一般与文件名不同
函数都必须用{}括起来,不管是一条语句还是多条语句

答案: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基本数据类型,类型转换

假设有以下代码String s = "hello";String t = "hello";char c [ ] = {'h','e','l','l','o'};下列选项中返回false的语句是?
A:s.equals (t);
B:t.equals (c);
C:s==t;
D:t.equals (new String ("hello"));

解析:

首先==与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();
	    }
	}
A:Base SonB
B:Son SonB
C:Base Son SonB
D:编译不通过

解析:编译看左边,运行看右边。意思编译时候,看左边有没有该方法,运行的时候结果看,所以结果为D 。

07 Servlet生命周期

Servlet的生命周期可分为初始化阶段,运行阶段和销毁阶段三个阶段,以下过程属于初始化阶段是
A:加载Servlet类及.class对应的数据
B:创建servletRequest和servletResponse对象
C:创建ServletConfig对象
D:创建Servlet对象
解析:

Servlet的生命周期一般可以用三个方法来表示:init():仅执行一次,负责在装载Servlet时初始化Servlet对象

  1. service() :核心方法,一般HttpServlet中会有get,post两种处理方式。在调用doGet和doPost方法时会构造servletRequest和servletResponse请求和响应对象作为参数。destory():在停止并且卸载Servlet时执行,负责释放资源。初始化阶段:Servlet启动,会读取配置文件中的信息,构造指定的Servlet对象,创建ServletConfig对象,将ServletConfig作为参数来调用init()方法。所以选ACD。B是在调用service方法时才构造的。





全部评论