class Piece 
{
  protected int changes = 3;
}
class Piece0 extends Piece
{
  public Piece0()
  {
    int i = new Piece().changes;//这里出错是访问限制
    super.changes;              //可是这里问什么不报错咧
    
  }
  
}
super.changes为什么能访问protected的变量。

解决方案 »

  1.   

    public class ProctedTest {    protected int value = 1;
    }class SubClass extends ProctedTest {    public SubClass() {
            int value = new ProctedTest().value;
            int supervalue = super.value;
        }
    }这个代码没报错啊。
      

  2.   

    它是继承父类的成员,然后再赋值才可以
    像这样Piece0 p = new Piece();
    p.changes = 3;
    这样才不报错
    可是super.changes为什么也可以呢
      

  3.   

    类别         类内部   同一包内   子类   包外部类 
    public      允许      允许      允许    允许 
    private     允许     不允许    不允许  不允许 
    protected   允许      允许     允许    不允许 
    friendly    允许      允许     不允许  不允许 
      

  4.   

    super.changes为什么就可以了,它访问了protected申明的变量
      

  5.   

    从编译的角度上来说,假设Piece和Piece0在同一个里面
    int i = new Piece().changes;//这句是没错的,只是新建了一个父类对象,changes也是可见的
    super.changes;              //这句话是错的,super.changes只是一个变量,编译器会报错super.changes=1;才是一句完整的赋值语句
    至于protected,就是同包中可见,只有Piece和Piece0不在同包里才会报错
      

  6.   

    我没有把问题描述全面,对不起,Piece和Piece0不在同一个包里面。
    super.changes=1;为什么不会有错,这样访问和Piece0 p = new Piece();
    p.changes = 3;有什么区别吗,其实我是想问这个
      

  7.   

    super返回的是父类。。父类访问自己类里声明的变量怎么会报错呢
    没区别
      

  8.   

    报错如下:
    Main.java:10: 不是语句    super.changes;              //可是这里问什么不报错咧
             ^
    1 错误
      

  9.   


    super.changes=1 //给父类的changes赋值为1
    p.changes = 3;//给子类Piece对象p的changes属性赋值为3
    因为是protected修饰符,所以子类可以继承这个属性