我用的是visual studio.net中的J#进行编译
下面的2个文件在一个工程中
文件1:
package shuai.mypackage;public class A
{
protected  int i = 3;
}
文件2:
public class B extends A
{
static void f()
{
A a= new A();
a.i = 0;
}
public static void main(String[] args)
{
f();
}
}
错误是:不能访问a.i。如果将文件1中的i定义成static protected  int i = 3;就没有问题,为什么?
该怎么使用package中的protected成员?

解决方案 »

  1.   

    protected成员不能通过类名直接访问,你可以通过A的函数来访问,修改的Class A如下:
    public class A
    {
    protected  int i = 3;
    public void int setI(int parm)
       {
         this.i=parm;
       }
    public int getI()
      {
        return this.i;
      }
    }然后在Class B中,你可以通过setI(int parm)和getI()来访问和修改i的值
      

  2.   

    在A中你可以给一个public的方法
    public int getI()
    {
      return i;
    }
    就可以轻松搞定!
      

  3.   

    这不是protected的问题,你该看看static的部分,即使把 i 声明成public,如果不是static的变量,也不能在static的块中调用。
      

  4.   

    如果定义一个public方法来获得i的话,为什么不把i声明成private呢?
    那么protected的优势(除了在本package中)又在哪里呢?
    TO cuilichen(fjfjfjfj):
       把 i 声明成public好用
      

  5.   

    package中的protected成员在包外访问时跟private是一样的,不可见
    你extends A以后,只能访问B里面的i
      

  6.   

    对于继承机制的理解错误,i已经通过继承存在与B类的对象中,想要访问i应该直接用B生成对象并操作i
    在main中生成另一个A对象,此对象与B生成的对象没有任何关系!
      

  7.   

    再请教各位,static protected int i;的时候i的属性不也是package吗?
    为什么可以访问A的对象里面的i?
      

  8.   

    static protected int i;的时候i的属性不也是package吗?
    -------------------------------------------------------
    静态成员,包括变量,函数!他们是属于类的,不属于某个特定的对象实例的。