有两个包;
第一个包com. one 中的 Stu.java 文件内容:package com.one;public class Stu {
   public int x;
   protected int y;}
第二个包com. two 中的 CollStu.java文件中内容:
package com.two;
import com.one.*;
public class CollStu extends Stu {
  String another;
  protected int z;
}class Test {

public static void main(String[] args) {
CollStu c = new CollStu();
c.another = "";
c.x = 1;
c.y = 1;             //编译错误
        c.z = 2;
}

}
CollStu 从 父类 Stu 继承 了 Stu中可以访问的成员 ,实例变量 y声明为 protected,应该可以被
子类CollStu 继承 ,但是为什么在IDE 中 用 "c ." 的形式点不出来y ,而且那一行会编译错误? 
既然 父类中的y已经被 子类继承,成为子类的成员,那就可以想子类中定义的其他成员一样用了,它们都被认为是子类的成员。所以,为什么同样是protected 声明 ,z可以引用 ,y就不行了呢?  

解决方案 »

  1.   

    lz先搞明白 public  protected  private的区别。
      

  2.   

     y声明为 protected表示该属性子类可见,Test又不是子类,自然看不见了。
    z可以引用,是因为protected的作用域还包含同一个包,属性同一个包可见。
      

  3.   

    protected指的是在子类中可被调用
    你Test是子类么?
      

  4.   

    但是java的书上说,继承关系,子类从父类继承的父类中的成员,可以和子类的定义的成员一样使用。我是这么想的,CollStu 从Stu 中继承 y ,相当于在 子类中有 proteccted int y 。而 子类Stu 和 Test类 是在同样一个包中。所以应该能访问
      

  5.   


    可是“ c.y”  c是对子类 CollStu 的引用,不是对父类的引用 。而子类CollStu继承了 Stu中的y ,而且 CollStu 和test类又都是在同一个包里,所以这样想,我觉得可以用
      

  6.   

    其实你不用想那么多。
    class Test{
    private int i=5;
    }
    class Test2{
    public static void main(String[] args) {
    Test t=Test();
    //这里你觉得可以直接t.i;调用么?原理一样的。
    }
    }