黑马程序员技术交流社区

标题: 请教两个java问题 [打印本页]

作者: 张凯    时间: 2012-7-13 06:19
标题: 请教两个java问题
本帖最后由 张凯 于 2012-7-13 17:55 编辑

第一题:(答案F)
Given the following method signatures from ArrayList:
boolean add(E e)
protected void removeRange(int fromIndexInclusive, int toIndexExclusive)
int size()
and given:







Java代码  
1.2. import java.util.*;  
2.3. public class MyUtil extends ArrayList {  
3.4. public static void main(String[] args) {  
4.5. MyUtil m = new MyUtil();  
5.6. m.add("w"); m.add("x"); m.add("y"); m.add("z");  
6.7. m.removeRange(1,3);  
7.8. System.out.print(m.size() + " ");  
8.9. MyUtil m2 = new MyUtil2().go();  
9.10. System.out.println(m2.size());  
10.11. }  
11.12. }  
12.13. class MyUtil2 {  
13.14. MyUtil go() {  
14.15. MyUtil m2 = new MyUtil();  
15.16. m2.add("1"); m2.add("2"); m2.add("3");  
16.17. m2.removeRange(1,2);  
17.18. return m2;  
18.19. } }  



What is the result?

A. 1 1

B. 1 2

C. 2 1

D. 2 2

E. An exception is thrown at runtime.

F. Compilation fails due to a single error.

G. Compilation fails due to multiple errors.



第二题:(答案:F)

Given:





Java代码  
1.1. public class Hose <E extends Hose> {  
2.2. E innerE;  
3.3. public static E doStuff(E e, Hose<E> e2) {  
4.4. // insert code here  
5.5. }  
6.6. public E getE() {  
7.7. return innerE;  
8.8. } }  

Which can be inserted, independently at line 4, for the code to compile? (Choose all that apply.)

A. return e;

B. return e.getE();

C. return e2;

D. return e2.getE();

E. return new Hose().getE();

F. Compilation fails regardless of which return is inserted.





请大家帮忙解释下原因,多谢啦!


--------------------------------------------------------------------------------
问题补充:第一题:removeRange是protected方法没错,但是在MyUtil2中调用这个方法的还是MyUtil的对象呀。MyUtil m2 = new MyUtil(); .......; m2.removeRange(1,2); 这跟在MyUtil自己的main方法中调用不是一样的吗?
比如这样:

class A {
  protected void foo() {}
}
class B extends A {
}
class C {
  void bar() {
    B b = new B();
    b.foo(); // 这里也是在子类之外,却是可以调用的。
  }
}

第2题:
如果去掉static的话,答案是AD,好费解哦,为什么是AD呢?
还请大家多多帮忙!
作者: 温少邦    时间: 2012-7-13 07:05
第一题:
removeRange是protected方法
只有子类或者在同一个包时才能调用protected方法
在MyUtil中可以调用是因为MyUtil是ArrayList的子类
而MyUtil2类不是ArrayList的子类也不和ArrayList在一个包
所以不能调用removeRange方法

第二题:
如果去掉static,这个方法要返回一个泛型E
A:return e;
//e本身就是E 明显可以

B. return e.getE();
//E类型是Hose类型的子类,所以继承到了getE方法,
//但是没有指定泛型,所以getE也只会返回Hose类型

C. return e2;
//e2是Hose类型的 不可以

D. return e2.getE();
//getE方法返回构造Hose时用的那个泛型,
//e2构造时用的是Hose<E>,返回的类型就是E

E. return new Hose().getE();
//同上,new Hose时没有指定泛型,
//如果这里改成new Hose<E>().getE()就可以

F. Compilation fails regardless of which return is inserted.
//有static的话,插入什么都是编译失败了
作者: 程潇    时间: 2012-7-13 08:28
本帖最后由 jeffreyno1 于 2012-7-13 08:30 编辑

1.removeRange是ArrayList类的protected方法,决定了调用它的范围只能是ArrayList本类、同一包中的类或子类。
MyUtil2类和ArrayList类不在同一包中,也不是ArrayList的子类,故在MyUtil2类中无法调用ArrayList的protected方法。
虽然MyUtil2类的成员函数go中定义了一个ArrayList的子类MyUtil的对象,但该对象既不存在于ArrayList的子类,也不在和ArrayList同一包的类中,只能访问ArrayList的public方法,ArrayList的protected方法对它是不可见的。

2.若去掉static的话,就只关注方法的返回值类型即可,由于doStuff方法的返回值类型为E,只要满足返回E类型的值即可。
选项A:return e;
        e是来自于doStuff(E e, Hose<E> e2)中的参数e,因其是E类型的,故满足
选项D:return e2.getE();
        e2也是来自于doStuff方法传进来的参数Hose<E> e2,而getE()的返回值类型也是E,故e2.getE()最终返回的也是一个E类型的值,也满足要求
作者: 张凯    时间: 2012-7-13 17:53
温少邦 发表于 2012-7-13 07:05
第一题:
removeRange是protected方法
只有子类或者在同一个包时才能调用protected方法

恩,谢谢了
作者: 陈振兴    时间: 2012-7-13 19:10
哥们这题真够深的啊!看了半天了,真够倒腾的!
我半个多小时就看了第一道题!
对于protected同包可见+不同包的子类可见,我也测试了,这个题是例外的。
我是放在同一个包下,而且我也试了将MyUtil2 extends MyUtil,方法还是不可见的。
我觉得应该是在爷爷辈中的方法ptotected后,孙子辈就无法使用方法了。
提示的错误Unresolved compilation problem: (编译时就报错,更加说明此方法不会被子子类调用)
        The method removeRange(int, int) from the type ArrayList is not visible。这个错误就不需要看了,既然编译失败,运行当然失败。
这个题考主要考的是protected方法调用,我查了老半天了,都没找见确切答案,你再找找,关键字就是父类的protected方法在子子类中如何实现,
还要注意一点的是,当MyUtil2 extends MyUtil并且在一个包下的时候,你的答案是什么!这个了解深透了,编程上的这些类的调用就无大碍了。
我先撤了,明天再看看第二题,查查第一题的出处。
顶!

作者: 陈振兴    时间: 2012-7-15 17:21
这个问题提的特别好,我找到答案了,比较深奥!(没办法贴,太长了,我把地址贴上面)
Java中的访问控制修饰符有四个级别,但属protected最复杂。如果问大家,protected修饰符作用,大家会说“在子类与同包中可以访问这个成员”,当然在自己类中也是可的,但你真的理解了吗?不信,先看看下面这些实例,看你是否也是这样想的(其中注释掉的是不能编译的,大家最好把这些代码放在eclipse中再看,不然你会晕的^_^):
“主题:protected,你真的理解了吗?”
地址:http://www.iteye.com/topic/662442
然后我在发个贴,让更多的人了解此类知识!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2