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
*/

以上仅是个人浅见,路过的大牛,请指教,谢谢。

原文地址:https://www.cnblogs.com/xiaoxian1369/p/2228260.html