Java 外企面试若干题
1Which of the following fragments might cause errors? (5%)
A. String s = “Gone with the wind”;
String t = ” good “;
String k = s + t;
可以,String重载了+ 运算符
B. String s = “Gone with the wind”;
String t;
t = s[3] + “one”;
不可以,s[3]表示的是字符串数组s,而这里是字符串s。
C. String s = “Gone with the wind”;
String standard = s.toUpperCase();
可以
D. String s = “home directory”;
String t = s – “directory”;
不可以,String没有重载-运算符
2 public class Parent { (5%)
public int addValue( int a, int b) {
int s;
s = a+b;
return s;
}
}
class Child extends Parent {
}
Which methods can be added into class Child?
A. int addValue( int a, int b ){// do something…}
不行,访问权限不行默认为default
B. public void addValue (){// do something…}
可以,另外一种方法
C. public int addValue( int a ){// do something…}
可以,另外一种方法,当有同一种方法名时,以变量的个数的不同,选择方法,重载
D. public int addValue( int a, int b )throws MyException {//do something…}
不可以,异常在父类中不存在,所以抛出不行
E.public int addValue(int a,int b){//do something}
可以,重写了父类的方法
3 Given: (5%)
Exhibit:
public class Main { public static void stringReplace(String text) { text = text.replace('j', 'i'); } public static void bufferReplace(StringBuffer text) { text = text.append("C"); } public static void main(String[] args) { String textString = new String("java"); StringBuffer textBuffer = new StringBuffer("java"); stringReplace(textString); bufferReplace(textBuffer); System.out.println(textString + textBuffer); } } /*运行结果: javajavaC */
String类是不可变的类,是final类,而StringBuffer类是可以修改的,修改的是对象本身(个人理解,不对,请指教,谢谢)
What is the output?
4.对于
int a =4;
1).a+=(a++);
先a++,所以右边的值为4,之后左边的a=5,所以结果为a+5=9
2).a+=(++a);
先++a,所以右边的值为5,并且a=5,所以结果为a+5=10
以下编译出错:
3).(a++)+=a;
4).(a++)+=(a++);
5).(a++)+=(++a);
以下只能在C++中才能编译通过:
6).(++a)+=a;
先执行++a,此时a=5,之后该式子的右边的值为5,所以结果为a+5=10
7).(++a)+=(a++);
先执行左边的++a,a就变为5,之后执行a++,所以此式右边为5,之后a为6,所以结果就是a+5=11
8).(++a)+=(++a);
先执行++a,之后a=5,在执行++a,a=6,此时式子的右边的值为6,所以结果为a+6=12
总结:由于++的运算优先级高于+=,所以式子中先执行++的运算,之后在执行+=。
扩展:
9).a=(a++)+a
先执行a++,之后a=5,此时第一个括号的值为a,而此时第二个括号的式子的值为5,之后从右向左赋值给a,所以结果为a+5=10
10).a=(a++)+(a++)
先执行a++,之后a=5,此时第一个括号的值为a,在执行a++,之后a=6,而此时第二个括号的式子的值为5,之后从右向左赋值给a,所以结果为a+5=11
11).a=(a++)+(++a)
先执行a++,之后a=5,此时第一个括号的值为a,在执行++a,之后a=6,而此时第二个括号的式子的值为6,之后从右向左赋值给a,所以结果为a+5=11
12).a=(++a)+a
先执行++a,之后a=5,此时第一个括号的值为a,而此时第二个括号的式子的值为5,之后从右向左赋值给a,所以结果为a+5=10
13).a=(++a)+(a++)
先执行++a,之后a=5,此时第一个括号的值为a,在执行a++,之后a=6,而此时第二个括号的式子的值为5,之后从右向左赋值给a,所以结果为a+5=11
14).a=(++a)+(++a)
先执行++a,之后a=5,此时第一个括号的值为a,在执行++a,之后a=6,此时第二个括号的式子的值为6,之后从右向左赋值给a,所以结果为a+6=12
code:
#include<stdio.h> #include<iostream> using namespace std; int main() { int a = 4; a += (a++); printf("%d\n", a); a = 4; a += (++a); printf("%d\n", a); a = 4; (++a) += a; printf("%d\n", a); a = 4; (++a) += (a++); printf("%d\n", a); a = 4; (++a) += (++a); printf("%d\n", a); a = 4; a = (a++) + a; printf("%d\n", a); a = 4; a = (a++) + (a++); printf("%d\n", a); a = 4; a = (a++) + (++a); printf("%d\n", a); a = 4; a = (++a) + a; printf("%d\n", a); a = 4; a = (++a) + (a++); printf("%d\n", a); a = 4; a = (++a) + (++a); printf("%d\n", a); return 0; } /* 9 10 10 11 12 9 10 11 10 11 12 */
以上仅是个人浅见,路过的大牛,请指教,谢谢。