java子类的对象为什么不能访问父类的protected变量?

java子类的对象为什么不能访问父类的protected变量?

相关代码

package Chapter6.Chapter6A;
// 父类代码
public class Chapter6exp {
    int age = 5;
    protected String name = "zzz";
    private void f() {};
    public String city = "QD";
}

子类代码, 位于不同包内

package Chapter6;
import Chapter6.Chapter6A.Chapter6exp;

class C extends Chapter6exp {
    C() {
        // this.city;
        // this.name;
    }
}

public class Human {
    public static void main(String args[]) {
        C c = new C();
        // c.city; 只能取到city(public)

    }
}

在子类内部可以取到protected和public变量是我预期的, 但是为什么实例化的对象取不到protected了?

阅读 5.2k
3 个回答

肯定是可以的. 你这不是一个语句啊, 语法错误. 作左值, 作右值都是可以的.

this.name = "new";
this.city = this.name;

你的问题应该是: 为什么子类没有把父类的protected字段暴露出去. protected是说, 该字段可以在父类, 父类同包内的类, 以及子类中访问, 注意是"子类中", 也就是子类的方法里. 对子类的使用者来说, 又要通过包访问规则来访问子类的字段了. 而父类的protected字段, 此时是不会暴露给子类的使用者的.

你可以在子类中访问父类的protected成员,但是Human并不是Chapter6exp子类啊。在C类中访问是没有问题的。

protected成员可以在同一个包中或子类中访问,Human显然两个条件都不符合。

补充:

就类用户而言, 这是private的, 但对于任何继承于此类的导出类或其他任何位于同一个包内的类来说, 它却是可以访问的
  • 《java编程思想》p138
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题