加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 05:54:33 所属栏目:Java 来源:网络整理
导读:我对保护标识符有一些疑问.在K.Sierra的Sun认证 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用于访问控制

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读