下面是两段代码:(一):package pkg1;public class A{
protected void go(){
System.out.println("A");
}
}
//==================================================请注意A,B两类不同包
package pkg2;import pkg1.A;public class B extends A{
public void test(){
A a = new A();
a.go();//B是A的子类,在B类中调用父类A的protected方法会有问题吗?
}
}
(二):package pkg1;
import pkg2.B;public class A{
protected void go(){
System.out.println("A");
} public void test(){
B b = new B();
b.go();//B是A的子类,在父类A类中调用子类B的protected方法会有问题吗?
}
}//==================================================请注意A,B两类不同包package pkg2;import pkg1.A;public class B extends A{

}
请选择:A. (一)编译通过,(二)编译通过
B. (一)编译通过,(二)编译不通过
C. (一)编译不通过,(二)编译通过
D. (一)编译不通过,(二)编译不通过

解决方案 »

  1.   

    b
    protect是保护的类型只能在子类总使用
      

  2.   

    b
    protected可以被同包下和子类访问
      

  3.   

    选C
    A a = new A();
    a.go();//B是A的子类,在B类中调用父类A的protected方法会有问题吗?
    这里不能用A的对象a调用go()只能用this.go()调用。B不能看到A的方法,只能看到super的方法。不是所有的A都是他父亲,他只能用自己从自己父亲那里继承过来的go方法。
      

  4.   

    当然super.go()也可以,反正只能访问他新爹的方法,他叔叔的不行。
      

  5.   

    我记得应该是C,protect方法new出来的自身对象是不能用的,子类对象可以用,具体啥原因的忘了
      

  6.   

    B extends A : 在子类B的作用范围内,只能调用本子类B定义的对象的protected方法(该方法从父类A中继承而来)。而不能调用其他A类对象的protected方法。
      

  7.   


    选C
    1、B继承了A,但是创建A的对象是不能调用A中受保护的方法的。只能在子类和同包下的才可以。
    不过在B中可以用this调用;new A().go()不行
    2、编译通过,B继承了A。b调用a中的方法当然是可以的,不管是啊B类中调用还是new B().go()都是可以的。
      

  8.   

    C 你不知道B类有没有覆盖A类中的方法
      

  9.   

    是吗?那你把B类改成:public class B extends A{
    protected void go(){;}
    }这样B还是继承了A,只不过覆盖了go方法。你再在A类中new B().go(),看看效果
      

  10.   

    有没有人知道在JVM内部,是如何看待protected访问控制符的。我想问问B类的方法表中会不会有 父类A的protected的方法签名
      

  11.   

    protected —— 受保护访问控制符,不叫“继承访问控制符”。那么保护什么,保护的是方法调用的作用域范围。 哪个对象调用了继承来的protected方法,就只能在这个对象所属的当前类中或当前类继承protected方法的父类中调用。
      

  12.   

    不过我觉得protected确实不是JVM解释的,而是由编译器首先来判断语法是否正确。毕竟代码1连编译都无法通过吗。
      

  13.   

    回答的很清楚
    至于
    根据继承特性,你在B中重写了go()方法,在new的过程中将调用本类的go()
    而protected---只有同一个包或者其子类调用也并不冲突
      

  14.   

    CTL+C CTL+V可以搞定答案!
    另外面试这种问题真的很无聊,哪家做软件这么较真!都是用publc和private
    这么细粒度啊安全机制谁会考虑,你在考虑这个的时候,人家四五套软件已经出来了!
    考虑的公司早倒闭了!
      

  15.   

    这里其实牵涉到不少概念与定义,protected包外仅子类可见泛泛而谈不足以描述实际使用的一些复杂情况就第一例而言,编译不通过
    A a = new A();
    a.go();1.包外子类中调用的protected方法,这里是指调用这个动作发生所处在的类,是B,它是A的子类,没错
    2.引用a,这是一个关键对象,因为是它invoke了protected方法go,它的type是A,B没有参与它的实现(因为是子类,反之A是参与了B的实现,如果类型是B,那B也自然是参与了其实现)第二个条件没有达到,所以编译不通过