如果Java为您提供与默认访问相同的访问权限,那么Java中“受保护”字的含义是什么?

时间:2013-10-16 19:07:03

标签: java default encapsulation protected

有人能解释我为什么需要“受保护”这个词? 如果我理解正确,

  

默认访问:在同一个包中的类中可用。

     

受保护的访问权限:相同包中的默认访问权限+可用于继承的类   (子类)在任何包中。基本上,我们得到相同的   同一个包中的默认访问权限。

那我什么时候应该使用它?只是为了代码的风格?从继承的角度来标记你将使用它吗? 谢谢。

package firstPack;

public class First {
    protected int a;
    protected void Chat(){
        System.out.println("Here I am");
    }
}


package secondPack;  

import firstPack.First;

public class Second extends First{
    public static void main(String [] args){
        First f=new First();
//      f.Chat();
//      System.out.println(f.a);
    }
}

我用这段代码来测试它。它不起作用。

3 个答案:

答案 0 :(得分:2)

protected表示所有子类都可见,而不仅仅是同一个包中的子类。

答案 1 :(得分:0)

protected修饰符:相同包中的其他类或其他类访问 引用它们的类的子类(即相同的包或不同的包)。

参考

enter image description here

答案 2 :(得分:0)

您的测试代码的问题在于您尝试访问First类实例的受保护成员并通过First类引用。请注意,由于Second类与First不在同一个包中,因此它无法访问任何基类实例的受保护字段,但可以访问其自己的字段继承自First类(包括protected个)。像

这样的东西
First f = new First();
f.chat();//chat is protected in base class.

不会在Second类中编译,但类似

public void test() {
    a = 1;  // have access to inherited protected field or 
    chat(); // methods of base class 
}

public static void main(String[] args) {
    Second f = new Second();
    f.chat();
    System.out.println(f.a);
}

没关系,因为第二类可以访问其继承的成员。

请注意main方法中的代码只能放在Second类中,因为只有与First相同的包中的派生类或类才能访问其受保护的成员。因此,如果此代码将放在其他类中,如

class Test{
    public static void main(String[] args) {
        Second f = new Second();
        f.chat();
        System.out.println(f.a);
    }
}

它将无法编译(无法访问受保护的成员,因为Test未扩展或与First不在同一个包中。)