java – 继承后的受保护成员行为.

我对保护标识符有一些疑问.在K.Sierra的Sun认证 Java程序员学习指南的第一章中,我发现了以下信息:

“一旦子类 – 包外继承受保护的成员,该成员(由子类继承)对子类外的任何代码都是私有的,除了子类的子类.”

我提供了反映上述陈述的示例代码,对我来说绝对清楚.

// Parent class
package package1;

import package2.Child;
public class Parent {

    protected int i = 5;

}

// Child class
package package2;

import package1.Parent;

public class Child extends Parent {

    // variable 'i' inherited

}


package package2;

public class Neighbour {

    public void protectedTesting(){
        Child child = new Child();
        System.out.println(child.i); // no access
    }
}

我已经开始尝试并进行了一些小改动 – 将Neighbor移到package1.并且可以访问“i”变量,这对我来说有点令人惊讶,因为它不符合语句“对子类之外的任何代码变为私有”

更改后的邻居类:

package package1;

import package2.Child;

public class Neighbour {

    public void protectedTesting(){
        Child child = new Child();
        System.out.println(child.i); // access!
    }
}

请向我澄清一下.谢谢.

解决方法

简而言之,protected是包私有的,也是子类可见的.甚至JLS对此也是模糊的( JLS §6.6.2):

A protected member or constructor of an object may be accessed from outside the package in which it is declared only by code that is responsible for the implementation of that object.

它指定在包外部,只有子类可以访问受保护的成员.这意味着您还可以访问包中的变量.它的措辞很差,但真正的是受保护的成员具有包级别可见性以及子类级别的可见性.

也可以看看:

> This related question
> Java Trail用于访问控制

相关文章

Java中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...