为什么我们在java中有受保护的访问说明符?

时间:2013-12-03 12:53:49

标签: java oop protected

受保护是首选但不公开的示例情况是什么? 有人可以用例子详细说明吗? 我已经看过公共,私人和受保护的聊天(see here)。

6 个答案:

答案 0 :(得分:6)

protected的主要用途是子类重写一个方法,该方法提供一些您不希望暴露给外部类的内部细节。考虑像

这样的类
class BaseAlgorithm {
     run() {
        commonStepOne();
        subclassSpecificStepTwo();
     }

     protected abstract subclassSpecificStepTwo();
}

没有人应该致电subclassSpecificStepTwo,所以公开它是没有意义的。

答案 1 :(得分:3)

简而言之,protected意味着该方法(例如)只能在子类和定义它的包中访问。

Modifier    | Class | Package | Subclass | World
————————————+———————+—————————+——————————+———————
protected   |  ✔    |    ✔    |    ✔     |   ✘
————————————+———————+—————————+——————————+———————

更多信息:

答案 2 :(得分:0)

如果方法受到保护,则可以在同一个包中或从不同包的子类

中访问它

查看oracle docs

答案 3 :(得分:0)

问题是关于用法和用例,所以,我有一个例子。

考虑一个抽象类,它要求它的子类实现一些方法,它不是它的公共API的一部分,只在这个类或它的子类中使用。

我们不能使用私有修饰符,我们不希望将此方法公开。

因此,protected关键字使我们的API清晰,并防止封装破坏。

您需要代码示例吗?

答案 4 :(得分:0)

所有这些private, public, protected or no-access modifiers(default)只是一个以良好组织的方式进行编码的概念。

您可以从here找到一些好的信息。你正在寻找答案。

但是没有这样的保护,使用Java中的任何修饰符隐藏信息

考虑以下代码

public class ProtectedPrivacy{

 private String getInfo1(){
 return "private"; 
 }

 protected String getInfo2(){
 return "protected"; 
 }

 String getInfo3(){
 return "default"; 
 }

 public String getInfo4(){
 return "public"; 
 }
}  

您可以违反的任何访问级别如下

public class BreakModifires{

public static void main(String[] args) throws Exception {
   ProtectedPrivacy protectedPrivacy = new ProtectedPrivacy();
   Method method = protectedPrivacy.getClass().getDeclaredMethod("getInfo*", null);
   method.setAccessible(true);
   Object result = method.invoke(protectedPrivacy);
   System.out.println(result.toString());
  }
}       

答案 5 :(得分:0)

public类成员代表所有可能的未来衍生物和类的子衍生物对所有宇宙作出承诺该类将以某种方式支持特定功能。

protected受保护的成员仅代表本身向任何派生的类发出承诺,它将以某种方式支持特定功能;该类别的衍生工具可以自由决定是否希望利用该功能,或提供任何可以使用该功能的公共方法。

public promises对子类和protected绑定的原因不在于,如果子类不受其父级公开承诺的约束,那么代码就没有办法对Animal的引用可以安全地在其上调用MakeNoise,而无需知道它是否是一个不需要MakeNoise成员的类型。相反,如果一个类有一个受保护的成员,那么成员可以被调用的唯一方法是通过super。如果Animal实施了受保护的DetectSmells成员且Cat支持该成员但Fish未支持,Fish不支持该方法的事实不会影响SiameseCat能够调用super.DetectSmells(),因为它知道superCat而不是Fish