Java中的受保护的访问修饰符

B M*_*B M 10 java protected access-modifiers

我在理解java中的受保护访问修饰符(或其背后的设计)时遇到了一些麻烦.我认为这意味着包访问和访问通过继承包含抽象成员的类的对象.

我写了以下示例代码.我看到如果取消注释,注释掉的行会产生编译错误.为什么我可以通过Second中的Second对象访问pro,但不能通过Second中的First对象访问pro?

package first;

public class First {

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

}
Run Code Online (Sandbox Code Playgroud)
package first;

public class InFirst {


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

}
Run Code Online (Sandbox Code Playgroud)
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();

    }
}
Run Code Online (Sandbox Code Playgroud)

Rya*_*yan 16

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

"protected修饰符指定只能在自己的包中访问该成员(与package-private一样),此外,还可以在另一个包中通过其类的子类访问."

这意味着受保护的成员必须直接通过它所定义的类或所述类的子类来访问,同时也在相应的包中.它并不一定意味着您可以通过在所述类的子类中创建的所述类的实例来访问受保护的成员.重点是所涉及的包装.

以下是您的示例:

package first; // Current package

First fst = new First(); // from package first and does not extend anything
fst.pro();
Run Code Online (Sandbox Code Playgroud)

试图从哪个包中访问有问题的成员?第一

(子)类是否包含所述成员或其父类,它继承了该成员,是否在同一个包中定义?是的,First被定义在package first,所以protected成员是从访问Firstpackage first.

package second; // Current package

First fst = new First(); // from package first and does not extend anything
fst.pro();
Run Code Online (Sandbox Code Playgroud)

试图从哪个包中访问有问题的成员?第二

(子)类是否包含所述成员或其父类,它继承了该成员,是否在同一个包中定义?不,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();
Run Code Online (Sandbox Code Playgroud)

试图从哪个包中访问有问题的成员?第二

(子)类是否包含所述成员或其父类,它继承了该成员,是否在同一个包中定义?是的,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();
Run Code Online (Sandbox Code Playgroud)

试图从哪个包中访问有问题的成员?第一

(子)类是否包含所述成员或其父类,它继承了该成员,是否在同一个包中定义?是的,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();
Run Code Online (Sandbox Code Playgroud)

试图从哪个包中访问有问题的成员?第一

(子)类是否包含所述成员或其父类,它继承了该成员,是否在同一个包中定义?是的,Third继承了构件Second,它继承它从First其中该构件被定义(package first),所以protected部件是从访问Thirdpackage first.