面试题
在32位系统下运行以下程序,可能的输出结果为( ) 1. int main () { int i,a[5]; for (i=0;i<=30;i++) { a[i]=0; printf("%d:hello\n",i); } printf("%d:hello world",i); return 0; }
正确答案: C
三十行的 i:hello (i∈[0,30]) 和一行 30:hello world
三十行的 i:hello (i∈[0,30]) 和一行 31:hello world
多行的 i:hello (i∈[0,30] )
多行的 i:hello (i∈[0,31])
解析: 数组越界: 下面的代码执行不到
2.
Java创建对象的说法正确的有()
正确答案: A B C D
用new语句创建对象,是最常见的创建对象的方法。
运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
调用对象的clone()方法。
运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。
3下列代码的输出结果是_____
1
2
boolean b=true?false:true==true?false:true;
System.out.println(b);
解析:booleanb=true?false:true==true?false:true;
true?false:(true==true)?false:true;
true?false:((true==true)?false:true);
false
4.如下代码,执行test()函数后,屏幕打印结果为()
public class Test2
{
public void add(Byte b)
{
b = b++;
}
public void test()
{
Byte a = 127;
Byte b = 127;
add(++a);
System.out.print(a + " ");
add(b);
System.out.print(b + "");
}
}
答案:-128 127
jiexi:这里简单说明两点:
1.b = b++;这一操作并未改变b的值,
2.++a先是触发拆箱操作Byte.byteValue,得到基本类型的值127,然后执行+1操作,使得值变为-128,最后触发装箱操作Byte.valueOf将value=-128的Byte对象赋值给a。
下面通过反编译得到字节码详细说明++a的执行过程:
// 源代码
public static void main(String[] args) {
Byte a = 127;
++a;
}
// 字节码
public static void main(java.lang.String[]);
Code:
0: bipush 127 // 将一个byte型常量值推送至操作数栈栈顶
2: invokestatic #2 // 自动装箱:访问栈顶元素,作为函数实参传入静态方法Byte.valueOf(byte),
// 返回value值为127的Byte对象的地址,并压栈
5: astore_1 // 将栈顶数值赋值给局部变量表中下标为1的引用型局部变量a,栈顶数值出栈。此时a对应的byte值为127。
6: aload_1 // 局部变量表中下标为1的引用型局部变量a进栈
7: invokevirtual #3 // 自动拆箱,访问栈顶元素a,调用实例方法a.byteValue获取a所指Byte
// 对象的value值,并压栈
10: iconst_1 // int型常量值1进栈
11: iadd // 依次弹出栈顶两int型数值1(0000 0001)、127(0111 1111)
//(byte类型自动转型为int类型)相加,并将结果128(1000 0000)进栈
12: i2b // 栈顶int值128(1000 0000)出栈,强转成byte值-128(1000 0000),并且结果进栈
13: invokestatic #2 // 自动装箱:访问栈顶元素,作为函数实参传入静态方法Byte.valueOf(byte),
// 返回value值为-128的Byte对象的地址,并压栈
16: astore_1 // 将栈顶数值赋值给局部变量表中下标为1的引用型局部变量a,栈顶数值出栈。此时a对应的byte值为-128。
17: return
}