java访问权限的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java访问权限的问题相关的知识,希望对你有一定的参考价值。

java访问权限的问题

背景:

关于java中的四种访问修饰符,public ,default ,protected ,private的作用范围本以为很熟悉了,但碰到了这样一段代码:

package pac1;

public class Parent {

    protected int i;
    protected class Inner{
       
    }
}

package pac2;

import pac1.Parent;

public class Child extends Parent {
    public static void main(String args[]){
        new Child().i=0;
        Inner i = new Parent().new Inner();
    }
}

问题

代码的意思是,父类与子类不在一个包,父类中有protected的内部类,现在想在子类中生成父类中内部类对象。但是发现报这错误:

Error:(8, 28) java: Inner()可以在pac1.Parent.Inner中访问protected

思考

protected的访问权限是这说的,同一个包下是可以随意访问的,其他包下只有之类可以访问。的确Inner i = new Parent().new Inner();左边是没有问题的,但是右边是内部类生成方法,为什么不能访呢?
原来我在这里只考虑了Parent和Child的包位置和继承关系,而没有考虑内部类和Child也是不同包,而Inner的构造函数访问权限不为public,因此在不同包又没有继关系的Child是不能生成Inner的。

解决

  1. 其实报的错误就说了问题的原因,Inner()所在的包为pac1.Parent.Inner,修饰符为protected,因此说Inner()可以在pac1.Parent.Inner中访问protected,也就是同包才能访问。说明多思考报的错误也是很重要的。

  2. 知道原因了,只需要将Inner构造函数改为publi就可以了。


以上是关于java访问权限的问题的主要内容,如果未能解决你的问题,请参考以下文章

访问嵌套片段的文本字段

Java访问权限控制中,友好变量或方法能在类内部、本包中使用,不能在子类及包外使用,但请看下面代码:

Android 逆向Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )(代码片段

访问控制

java四种权限修饰符的区别

在活动中访问片段?