Java经典笔试题
1.下面代码的运行结果为:()
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
2.下面程序的运行结果是什么()
class HelloA {
public HelloA() {
System.out.println("HelloA");
}
{ System.out.println("I'm A class"); }
static { System.out.println("static A"); }
}
public class HelloB extends HelloA {
public HelloB() {
System.out.println("HelloB");
}
{ System.out.println("I'm B class"); }
static { System.out.println("static B"); }
public static void main(String[] args) {
new HelloB();
}
}
考查静态语句块、构造语句块(就是只有大括号的那块)以及构造函数的执行顺序。
对象的初始化顺序:(1)类加载之后,按从上到下(从父类到子类)执行被static修饰的语句;(2)当static语句执行完之后,再执行main方法;(3)如果有语句new了自身的对象,将依次执行构造代码块、构造器(两者可以说绑定在一起)。
答案:
static A
static B
I'm A class
HelloA
I'm B class
HelloB
3.下面是People和Child类的定义和构造方法,每个构造方法都输出编号。在执行new Child(“mike”)的时候都有哪些构造方法被顺序调用?请选择输出结果 ( )
class People {
String name;
public People() {
System.out.print(1);
}
public People(String name) {
System.out.print(2);
this.name = name;
}
}
class Child extends People {
People father;
public Child(String name) {
System.out.print(3);
this.name = name;
father = new People(name + ":F");
}
public Child() {
System.out.print(4);
}
}
A232 B 32 C 432 D 132
父类有多个构造函数时,该如何选择调用呢?
第一个规则:(1)子类的构造过程中,必须调用其父类的构造方法。(2)一个类,如果我们不写构造方法,那么编译器会帮我们加上一个默认的构造方法(就是没有参数的构造方法),但是如果你自己写了构造方法,那么编译器就不会给你添加了。
第二个规则:(3)但是如果在子类构造方法中我们并没有显示的调用基类的构造方法,如:super(); 这样就会调用父类没有参数的构造方法。如果子类的构造方法中既没有显示的调用基类构造方法,而基类中又没有无参的构造方法,则编译出错,所以,通常我们需要显示的:super(参数列表),来调用父类有参数的构造函数,此时无参的构造函数就不会被调用。
总之,一句话:子类没有显示调用父类构造函数,不管子类构造函数是否带参数都默认调用父类无参的构造函数,若父类没有则编译出错。
答案:D
4.下面代码的运行结果为:()
public class IntegerTest {
public static void main(String[] args) {
Integer i1 = 10;
int i = 10;
Integer i2 = new Integer(10);
Integer i3 = 10;
Integer i4 = 200;
Integer i5 = 200;
System.out.println(i1==i);
System.out.println(i1==i2);
System.out.println(i1==i3);
System.out.println(i4==i5);
}
答案:
true (Integer会自动拆箱为int,所以为true)
false(i1会自动装箱为一个包装类<new一个新的>,i2也是new的,所以地址不相同)
true(i1自动装箱后由于值在-128——127,因此会被Java放在Integer常量池中,而i3再次赋值时会直接从常量池中取得<不用new了>,因此从与i1的地址就是相同的)
false(i4自动装箱后为一个包装类<没在-128——127之间>,i5也就会直接new一个新的Integer了,因此两者地址不相同)