class Piece { protected int changes = 3; } class Piece0 extends Piece { public Piece0() { int i = new Piece().changes;//这里出错是访问限制 super.changes; //可是这里问什么不报错咧
public class ProctedTest { protected int value = 1; }class SubClass extends ProctedTest { public SubClass() { int value = new ProctedTest().value; int supervalue = super.value; } }这个代码没报错啊。
它是继承父类的成员,然后再赋值才可以 像这样Piece0 p = new Piece(); p.changes = 3; 这样才不报错 可是super.changes为什么也可以呢
从编译的角度上来说,假设Piece和Piece0在同一个里面 int i = new Piece().changes;//这句是没错的,只是新建了一个父类对象,changes也是可见的 super.changes; //这句话是错的,super.changes只是一个变量,编译器会报错super.changes=1;才是一句完整的赋值语句 至于protected,就是同包中可见,只有Piece和Piece0不在同包里才会报错
我没有把问题描述全面,对不起,Piece和Piece0不在同一个包里面。 super.changes=1;为什么不会有错,这样访问和Piece0 p = new Piece(); p.changes = 3;有什么区别吗,其实我是想问这个
}class SubClass extends ProctedTest { public SubClass() {
int value = new ProctedTest().value;
int supervalue = super.value;
}
}这个代码没报错啊。
像这样Piece0 p = new Piece();
p.changes = 3;
这样才不报错
可是super.changes为什么也可以呢
public 允许 允许 允许 允许
private 允许 不允许 不允许 不允许
protected 允许 允许 允许 不允许
friendly 允许 允许 不允许 不允许
int i = new Piece().changes;//这句是没错的,只是新建了一个父类对象,changes也是可见的
super.changes; //这句话是错的,super.changes只是一个变量,编译器会报错super.changes=1;才是一句完整的赋值语句
至于protected,就是同包中可见,只有Piece和Piece0不在同包里才会报错
super.changes=1;为什么不会有错,这样访问和Piece0 p = new Piece();
p.changes = 3;有什么区别吗,其实我是想问这个
没区别
Main.java:10: 不是语句 super.changes; //可是这里问什么不报错咧
^
1 错误
super.changes=1 //给父类的changes赋值为1
p.changes = 3;//给子类Piece对象p的changes属性赋值为3
因为是protected修饰符,所以子类可以继承这个属性