权限修饰符

关于Java权限修饰符的理解:
 
 
        Java权限修饰符分为:private、(缺省)、protected、public。
 
 
        对于Java权限修饰符的理解:权限修饰符用来限定所修饰的类的成员在不同类中的可见性,注意这里只提到了类这个字,没有涉及到对象,对象只是我们去访问属性或者调用方法时的一个指针,我们通过这个指针来访问属性或者调用方法,但是属性和方法到底能不能被成功访问和调用,关键看当前你在哪个类中进行该访问或者调用操作。例如,
        如果属性或方法是private的,那么并非任何时候用对象调用的时候,通过对象.xx的形式都点不出来,只要在声明该属性或方法的类中,就可以直接通过对象.xx的形式访问此被private修饰的属性或方法。在String类的源码中,重写equals()方法时,就是这样用的(注意被private修饰的coder,和return后面的this.coder == aString.coder)。
    private final byte coder;    

    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        return (anObject instanceof String aString)
                && (!COMPACT_STRINGS || this.coder == aString.coder)
                && StringLatin1.equals(value, aString.value);
    }
        再如,Object中用protected修饰的clone()方法。用protected修饰的方法似乎可以被子类对象所访问,当你这样思考时,你就又忘记了前面说的,对于权限修饰符的可见性,只是对类而言,与对象毫无关系。永远遵循权限修饰符用来限定所修饰的类的成员在不同类中的可见性。
        protected表示该方法的可见性为:Object类内部、与Object类同包的所有类、以及继承Object类的那个子类。即使到了这一步,你可能仍然会不解,为什么我的IED仍然报错说该方法不可见。其实这里你应该可以联想到,当你试图在另一个类中通过对象.xx的形式调用一个私有方法或属性时,报的也是这个错误。很显然这是由于可见性导致的。
 
        你可以这样理解:每一个不与Object类在同一个包中的继承Object类的子类,都被Object类告知,你继承的clone()方法只对你这个子类可见。因此,我们无法在别的类中调用这个继承了Object类的子类继承的clone()方法,只能在这个子类内部调用自己继承的clone()方法。即使Object类是每个类的父类,但是所有不与Object类在同一个包中的继承Object类的子类都一样,都被Object类告知了上面这句话。其效果大致是这样的:只要和Object类不再同一个包中的其他类,相当于都有一份属于自己的私有的clone()方法。
        当然如果重写了clone()方法,效果就会有所不同,这意味着你不再是去拿Object类中的clone()方法了,你有了一份自己的clone()方法,那么根据你重写该方法时使用的权限修饰符,重写的这个方法会有自己的可见性范围。
原文地址:https://www.cnblogs.com/mryx/p/15725659.html