java的SCJP中的一道题

来源:百度知道 编辑:UC知道 时间:2024/05/16 16:15:59
Question 23
Given:
11. static classA {
12. void process() throws Exception { throw new Exception(); }
13. }
14. static class B extends A {
15. void process() { System.out.println(”B “); }
16. }
17. public static void main(String[] args) {
18. A a=new B();
19. a.process();
20.}
What is the result?
A. B
B. The code runs with no output.
C. An exception is thrown at runtime.
D. Compilation fails because of an error in line 15.
E. Compilation fails because of an error in line 18.
F. Compilation fails because of an error in line 19.

答案给了是 F,是不是错了??A B类都是静态内部类。。。。。。
那为什么是19行呢?为什么不是15行????

答案是F
因为没有捕捉异常,所以编译不通过
=================
为什么不是15行。
因为B继承自A,A是父类。
第18行创建一个A的实例,因为B继承自A,B可以向上转型为A,所以调用的自然是A的构造器。假设这里改为:A a=new String(); 肯定就会报错了,因为String看起来不像A,而B看起来像A。对吧。
这里考的是继承 那一块的知识。
============
另外这里的A,B两个类,你完全可以不考虑是在这个类里,可以考虑成他们分别是两个独立的文件里,效果一样的。这就是封装,不会将内部的实现暴露给你,所以你创建实例时出错了,自然是在你创建语句行出错。

好像不太对,如果加上try catch 块,出来的答案是B.也就是说,调用的还是B的process方法.
正确答案是:如果一个方法被重写,但是你使用多态引用来引用具有重写方法的子类型对象,编译器就会认为你正在调用该方法的超类型版本.如果超类型版本声明一个检验异常,但是重写的子类型方法没有这么做,那么编译器仍然认为你正在调用一个声明了异常的方法.