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

时间:2013-04-11 00:48:00

标签: 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");
    }

}

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();

    }
}

4 个答案:

答案 0 :(得分:15)

webpage @MadProgrammer链接给出了一个不错的解释:

  

“protected modifier指定只能访问该成员   在它自己的包中(与package-private一样),另外,通过   另一个包中其类的子类。“

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

以下是您的示例:

package first; // Current package

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

尝试从哪个包中访问相关成员? 第一次

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

package second; // Current package

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

尝试从哪个包中访问相关成员? 第二

包含所述成员的(子)类或它继承该成员的父类是否在同一个包中定义? 不,First已在package first中定义,因此protected会使First中的package 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成员可以Second访问package second 1}}。

为清晰起见,更多示例:

package first; // Current package

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

尝试从哪个包中访问相关成员? 第一次

包含所述成员的(子)类或它继承该成员的父类是否在同一个包中定义? 是的,Second继承了Firstpackage first定义的成员,因此可以protected中的Second访问package 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();

尝试从哪个包中访问相关成员? 第一次

包含所述成员的(子)类或它继承该成员的父类是否在同一个包中定义? 是的,ThirdSecond继承成员,该成员从First继承成员,其中成员已定义(package first),因此protected成员可以Third中的package first访问。

答案 1 :(得分:1)

protected vs. default这是显示访问级别的图表。您的代码属于图中Convertible中的R(参考)案例。也就是说,不允许在另一个包中的子类中引用。

答案 2 :(得分:1)

java中的受保护成员

相同的包 - (它表现得像默认)

可以在同一类,它的子类以及非子类中访问它(它的行为类似于默认值) 您甚至可以使用父或子引用访问受保护的成员。

外包装 -

只有itz子类才能访问它,这里最重要的一点是所使用的引用必须是同一个子类  仅

答案 3 :(得分:0)

protected表示可以访问同一个包中的其他类。因为Second在另一个包'second.Second'中,所以它不能首先访问.pro()。

如果您在“first”的包名下创建了Second,那么它将起作用。