在Java中受保护的访问修饰符(Protected access modifier in Java)

2019-08-21 14:49发布

我有一个小麻烦了解Java中的受保护的访问修饰符(或它背后的设计)。 我认为这意味着通过继承含有一个抽象成员的类的对象包访问和访问。

我写了下面的示例代码。 我看到,如果取消注释该注释掉线产生编译错误。 为什么我可以通过第二个而不是通过在二第一对象的第二对象访问亲?

package first;

public class First {

    protected void pro(){
        System.out.println("Can see protected method");
    }

}

package first;

public class InFirst {


    public static void main(String[] args){
        First fst = new First();
        fst.pro();
    }

}

package second;

import first.First;

public class Second extends First {

    public static void main(String[] args){

        First fst = new First();

//      fst.pro();

        Second sec = new Second();
        sec.pro();

    }
}

Answer 1:

该网页链接@MadProgrammer给出了一个体面的解释:

“受保护的修饰符指定了构件只能在其自己的封装件内被访问的(与包专用),此外,通过它的类的另一个包的子类。”

这意味着受保护的构件必须直接通过任其在定义的类或所述类同时还相应的包内的子类进行访问。 这并不一定意味着你可以通过所述类的子类中创建表示类的实例访问受保护的成员。 重点是相关程序包。

这里是你的例子:

package first; // Current package

First fst = new First(); // from package first and does not extend anything
fst.pro();

试图从中包装问题访问成员? 第一

在(亚)类的,它包含上述部件,或它的父类,其继承了部件,同样的包中定义? 是的, First是定义package first ,所以protected成员可以访问由Firstpackage first

package second; // Current package

First fst = new First(); // from package first and does not extend anything
fst.pro();

试图从中包装问题访问成员? 第二

在(亚)类的,它包含上述部件,或它的父类,其继承了部件,同样的包中定义? 否, First定义在package first ,所以protected使得从不可访问部件Firstpackage second

package second; // Current package

Second sec = new Second(); // from package second and extends First from package first
sec.pro();

试图从中包装问题访问成员? 第二

在(亚)类的,它包含上述部件,或它的父类,其继承了部件,同样的包中定义? 是的, Second ,其在定义package second ,继承了构件First ,所以protected构件是可访问的从Secondpackage second

为清楚起见,更多的例子:

package first; // Current package

Second sec = new Second(); // from package second and extends First from package first
sec.pro();

试图从中包装问题访问成员? 第一

在(亚)类的,它包含上述部件,或它的父类,其继承了部件,同样的包中定义? 是的, Second继承了构件First ,这是在所定义package first ,所以protected构件是可访问的从Secondpackage first

package first; // Current package

Third third = new Third(); // from package third and extends Second from package second,
                           // which extends First from package first
third.pro();

试图从中包装问题访问成员? 第一

在(亚)类的,它包含上述部件,或它的父类,其继承了部件,同样的包中定义? 是的, Third继承了构件Second ,它继承它从First其中该构件被定义( package first ),所以protected构件是可访问的从Thirdpackage first



Answer 2:

这里有一个图表,显示的访问级别。 你代码属于在可转换的R(参考)的情况下的图中 也就是说,在另一个包的子类引用不允许访问。



Answer 3:

Java中的protected成员

同一套餐的(它像默认)

它是在sameclass,它的子类,也非子类进行访问。(它像默认)你甚至可以访问使用父母或子女参考protected成员。

外套餐 -

它只是伊茨子类,在这里最重要的一点是访问使用必须是相同的子类的那个仅供参考



Answer 4:

在同一封装内的保护装置分享范围其他类。 因为二是在不同的包“second.Second”,它不能.PRO()中第一存取。

如果你的“第一”的包名下创建的第二 - 它会再工作。



文章来源: Protected access modifier in Java