我在Avo类中有一个实例变量,包ger1,带有受保护的修饰符。

package ger1;

public class Avo {
    protected int i = 1;
}


然后我有一个类Pai,它位于ger2包中,扩展了Avo并按实例访问该变量,到目前为止很正常...

package ger2;

public class Pai extends Avo {
    public Pai() {
        i++
    }
}


但是凯西·塞拉(Kathy Sierra)的书中提到了受保护的成员:“一旦包外的子类继承了受保护的成员,则该成员(由子类继承)对于子类外部的任何代码都是私有的,但子类的子类除外。子类。”

但是,如果我尝试通过类Pai的实例访问该成员,那是允许的!但是,Filho类必须位于Avo的同一软件包中。为什么这个?这是正常的?

package ger1;

import ger2.Pai;

public class Filho {
    public Filho() {
        Pai pai = new Pai();
        pai.i++;
    }
}

最佳答案

这是预期的行为。 “受保护”是指在子类中可见,即使它们在单独的程序包中也是如此。

编辑:另请参阅此问题
 In Java, difference between default, public, protected, and private

09-13 04:00