两道java面试题,十万火急

1
 public class Tester {
2
  public static void main(String[] parms) {
3
  int i = 10;
4
  i == 10 ? equals10() : notEqual10();
5
  } // main()
6
  
7
  private static int equals10() {
8
  System.out.println("result is 10");
9
  return 10;
10
  } // equals10()
11
  
12
  private static int notEqual10() {
13
  System.out.println("result is NOT 10");
14
  return -1;
15
  } // notEqual10()
16
 } // Tester

A. result is 10.
B. result is NOT 10.
C. result is 10
result is NOT 10.
D. compile with an error.

这道题为什么选D?能帮着解释一下么?

1
 class A {
2
  static A createA() {
3
  return new A();
4
  } // createA()
5
String message() {
6
return “Message from A”;
7
}
8
 } // A
9
  
10
  
11
 public class Tester {
12
  public static void main(String[] parms) {
13
  A aVar = null;
14
  System.out.println(aVar.createA().message());
15
  } // main()
16
 } // Tester

A. compile successfully, but run with a NullPointerException.
B. compile with error.
C. Compile successfully and the output is:
Message from A
D. compile successfully, but run with error at line 13.

为什么选C呢?aVar已经是null了为什么还能输出内容?

抱歉,打错了一个tag……重新来

第二问:
同样根据JLS第三版,[url=http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.12]15.12小节[/url],在问题中的这个表达式中:
[code="java"]aVar.createA()[/code]
aVar变量的类型(注意,是编译时就能判明的变量类型而不是运行时才能判明的实例实际类型)是A,所以A类型上所有名字为createA、参数列表为空的方法都被认为是潜在合适的成员,无论它是静态方法还是实例方法;接下来进行最合适的方法分析,发现潜在合适的成员只有一个,就是静态方法的createA(),所以选用了它。调用静态方法不需要对象实例,所以aVar是否为null并不影响代码行为——在这个例子里它的行为总是等同于A.createA()。

1.第一题编译的时候说不是语句
个人觉得是不是:java "变量申明不是真正的语句"
2.第二题aVar已经是null了,那是一开始而已。
System.out.println(aVar.createA().message());

()里面不是有createA()产生一个对象实例,再调用message()方法了么。。

个人观点:
第一题:在使用三元运算时,必须用在赋值语句中,否则编译报错。
第二题:createA()是 A 的静态方法,是属于类的,在类加载时,已经创建,所以用类名和对象名都可以调用,即使对象为空。但普通方法则是在对象产生时产生,如果代码段“aVar.createA().message()”改成 “aVar.message()”肯定就会报 nullpointException 了。
说的不是很清晰,希望下面高手呈上详解。

第一题:
i == 10 ? equals10() : notEqual10();
表达式 “i == 10”的值是boolean。而后面函数返回的却是int。

第二题:
同样需要学习。呵呵

问题很简单,阅读相关文档就能马上明白。

第一问:
根据[url=http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html]Java语言规范第三版[/url]的[url=http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.8]14.8小节[/url],“表达式语句”的语法规定如下:
[code=""]ExpressionStatement:
StatementExpression ;

StatementExpression:
Assignment
PreIncrementExpression
PreDecrementExpression
PostIncrementExpression
PostDecrementExpression
MethodInvocation
ClassInstanceCreationExpression[/code]
也就是说,一个“表达式语句”由一个“语句表达式”与一个分号构成。其中,“语句表达式”包括赋值表达式、前缀与后缀的自增/自减表达式、方法调用表达式、创建类实例表达式。“? :”三元表达式不在其中,不能独自作为“语句表达式”使用,因而代码有编译错误。

第二问:
同样根据JLS第三版,[url=http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.12]15.12小节[/url],在问题中的这个表达式中:
[code="java"]aVar.createA()[/url]
aVar变量的类型(注意,是编译时就能判明的变量类型而不是运行时才能判明的实例实际类型)是A,所以A类型上所有名字为createA、参数列表为空的方法都被认为是潜在合适的成员,无论它是静态方法还是实例方法;接下来进行最合适的方法分析,发现潜在合适的成员只有一个,就是静态方法的createA(),所以选用了它。调用静态方法不需要对象实例,所以aVar是否为null并不影响代码行为——在这个例子里它的行为总是等同于A.createA()。

嗯就这样……