对于protected的变量和方法,其所有子类都应该可以访问,不论是否在同一个package中。看朱仲杰的“java2全方位学习”中有如下例子:package package1;public class A
{
        protected int p1;
        
        protected static void p2() {}
        protected void p3() { }
}存为为a.java文件,放在package1文件夹中。package package2;import package1.A;public class D extends A
{
        public D()
        {
                A a = new A();
                a.p1=1;
                a.p2();
                A.p2();
                a.p3();
                p1=1;
                p2();
                p3();
        }
}存为d.java,放在package2文件夹中。
package1和package2都在同一个文件夹中。编译a.java,通过。编译d.java,报错:
package2\d.java:10: p1 可以在 package1.A 中访问 protected
                int i = a.p1;//a.p1=1;
                         ^
package2\d.java:13: p3() 可以在 package1.A 中访问 protected
                a.p3();
                 ^
2 错误到底protected的访问控制是什么?d为a的子类, 为什么不能访问类a中标记为protected的变量和方法?

解决方案 »

  1.   

    大小写错了吧····A.java和D.java
      

  2.   

    应该不是 protected的关系吧,为什么 A.p2();就能访问呢?
      

  3.   

    huihui0103() ( ) 信誉:100  2006-08-02 22:55:00  得分: 0  
     
     
       应该不是 protected的关系吧,为什么 A.p2();就能访问呢?
      
     
    A.p2()是类方法。
      

  4.   

    问题出在“a.”上 
    把a.去掉就可以了,既然已经继承了A,那么D中自然就可以使用A中的变量和方法
      

  5.   

    A a = new A();
                    a.p1=1;
                    a.p2();
                    A.p2();
                    a.p3();
    这不是继承的用法
      

  6.   

    protected的东西
    无论是否同一个包
    只要继承便可使用的
    对不对???
    D d = new A();
    d.***();
      

  7.   

    我是这样想的,A、D有继承关系,在D中使用类A生成的对象的protected方法和变量应该是可以的,这个问题好像涉及到两个类之间访问控制限定符究竟是怎样定义的。
      

  8.   

    应用A类中protected方法和变量,必须是D类,即A的子类的实例来引用的,用A的实例是不行的(因为这里的实例与A类不在同一个包里)。
    A.p2()能访问,是因为p2()是static方法,用类就可以直接访问的。所以没有报错。
      

  9.   

    这是protected成员访问限制的一个特殊情况 -- 当子类和父类不在相同包下,在子类中通过父类引用类型(注意是父类类型引用)的一个实例(注意是实例)去访问父类中的protected实例方法或变量,是不允许的.