技术栈

2019-02-12——Java 修饰符

2019-02-13  本文已影响0人  烟雨乱平生

在Java中,修饰符分为四种:

关于四种修饰符的访问权限:

修饰符 内部类 同包 子类 外部包
public Y Y Y Y
protected Y Y Y
default Y Y
private Y

这种权限关系表适用于类的所有成员属性,当然也有例外,比如内部类:

public class A {

    private B b;

    private void t(){
        String value = b.value;
    }

    private class B{
        private String value;
    }
}

这里只讨论修饰符的访问权限,可以看到对于B类的私有属性value在该类的外部访问了,即打破了private属性只能在类内部访问的规则。

为什么外部类能够访问内部类的私有属性?
这是因为编译器会生成一个package scope的access方法,该方法是一个get方法并且该方法是一个synthetic性质的方法。
所以外部类对内部类的私有属性的访问就相当于调用了一个get方法,大概情形如下:

public class A {

    private B b;

    private void t(){
        String value = b.getValue();
    }

    private class B{
        private String value;
        public String getValue(){
            return value;
        }
    }
}

所以看起来外部类访问内部类的私有属性打破了private的访问权限规则,其实并非如此,而是由编译器提供了一个可以由外部类访问的get方法。外部类通过这个方法访问内部类的私有属性。

上一篇下一篇

猜你喜欢

热点阅读