前言
这篇文章主要针对的是笔试题中出现的通过查看代码执行结果选择正确答案题材。
正式进入题目内容:
1、(单选题)下面代码的输出结果是什么?
public class Base {
private String baseName = "base";
public Base (){
callName();
}
public void callName(){
System.out.println(baseName);
}
static class Sub extends Base {
private String baseName = "Sub";
public void callName(){
System.out.println(baseName);
}
}
public static void main(String argn[]){
Base b = new Sub();
}
}
A、null B、Sub C、base
题目解析:这道题主要考察的是java面向对象的基本特征之多态特性以及一个类的加载顺序。首先我们要明白一个类的加载顺序,如果是存在有父类和子类继承关系的情况下,一个类文件的加载顺序是怎么样子的呢?
加载顺序如下:
(1)、父类的静态变量,再加载父类的静态代码块,静态方法除外;
(2)、子类的静态变量,再加载子类的静态代码块,静态方法除外;
(3)、父类的非静态变量、再加载父类的非静态代码块;
(4)、父类的构造函数;
(5)、子类的非静态变量,再加载子类的非静态代码块;
(6)、子类的构造函数。
其中步骤(1)和(2)是在类进入到连接阶段的时候就执行了,而不是等到通过new 实例化对象的时候才执行。
其次是多态特征的问题,Base b = new Sub();它是一种多态性的表现,声明是Base类型,而运行是Sub类型。题目中,callNam()方法是Sub类重写Base类中的方法,而不是扩展的方法。
当Base b = new Sub();操作时,按照类文件加载顺序,会先执行Base的无参构造调用callName()方法,如果子类没有重写callName()方法,那么则执行父类的callName()方法,如果子类重写了callName()方法,则执行子类的,遵循这个原则 :“如果子类没有,则从父类查找”。但是此时子类的非静态变量还未赋值,因此输出结果为null,选择A。
2、(单选题)下面代码的输出结果是什么?
public class Test{
public static int a = 1;
public static void main(String argn[]){
int a = 10;
a++;
Test.a++;
Test t = new Test();
System.out.println("a = "+a+" t.a = "+t.a);
}
}
A、a = 10 t.a = 3
B、a = 11 t.a = 2
C、a = 12 t.a = 1
D、a = 11 t.a = 1
题目解析:这道题考察的是成员变量和局部变量的差异以及自增运算符。我们来分析main方法中执行结果,按照执行顺序,代码执行是从上到下,在main方法中定义一个变量a,那么这里的变量a是局部变量,它的生命周期在这个main方法体中,会随着方法体被调用而调用,调用完毕而销毁。执行到第二步,进行了自增操作,a++,是先赋值在自增,那么操作结束后a的值为11,则排除A和C,继续往下走,执行到Test.a++;操作结果相当于是给类中的成员变量a进行了+1操作,而后new了Test的实例对象,再通过实例对象.a变量,相当于是调用类中的成员变量,因此结果为2,选B。
3、(单选题)下面代码的输出结果是什么?
class Foo{
final int i;
int j;
public void doSomethind(){
System.out.println(++j + i);
}
}
A、0 B、1 C、2 D、不能执行,因为编译有误
题目解析:这道题主要考察的是对final修饰符的掌握程度。因为final修饰符修饰的变量为常量,因此如果定义某成员变量或者局部变量为final类型的时候,一定要进行初始化。选D。
4、(单选题)下面代码的输出结果是什么?
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 Test{
public static void main(String[] args) {
Base b = new Son();
b.method();
b.methodB();
}
}
A、Base SonB
B、Son SonB
C、Base Son SonB
D、编译不通过
题目解析:这道题主要考察的是多态的知识点。Base b = new Son();是多态的表现形式,父类对象调用了子类创建了Son对象。b调用的method()方法就是调用了子类重写的method()方法,而此时b还是属于Base对象,b调用的methodB()方法时,Base类中没有该方法,因此会编译不通过,选D。
5、(单选题)下面代码的输出结果是什么?
public class Test{
static String x = "1";
static int y = 2;
public static void main(String[] args) {
static int z = 3;
System.out.println(x+y+z);
}
}
A、3 B、123 C、13 D、程序有编译错误
题目解析:这道题考察的是static关键字的知识点。static修饰的变量为静态变量,该静态变量是与类一一对应的,只要该类被加载了,那么静态变量就能被使用。但是static关键字不能修饰局部变量,因此在程序编译时报出,选D。