我的问题是关于“受保护的”访问修饰符。
我知道它的功能,但我不知道何时需要使用它。 从概念上讲,类中的方法可以分为: 建设者 制定者/吸气 客户使用的方法(即其他类) 内部方法(从类中的其他方法使用)
答案 0 :(得分:9)
时使用
protected
abstract
。请注意,protected
方法与public
方法类似,只要您将它们放入其中,只要您支持您的库,它们就需要保留。与您可以自由删除的私有方法不同,protected
方法仍然是您班级界面的一部分。
答案 1 :(得分:6)
当您需要执行一些未在公共API中公开但仍需要被子类覆盖的内部内容时使用它。
答案 2 :(得分:3)
当您希望后代类看到超类的字段/方法时,您需要使用受保护的访问修饰符,但是您不希望其他类看到这些。
答案 3 :(得分:3)
我发现它有用的一种情况是当超类的方法用于调用子类的方法时,例如
public abstract class SuperClass
public final void exposedMethod {
hiddenMethod();
}
protected void hiddenMethod();
}
public class SubClass extends SuperClass {
protected void hiddenMethod() { }
}
在这种情况下,exposedMethod
负责记录和重试逻辑,而hiddenMethod
是实际的方法实现
答案 4 :(得分:1)
您应始终封装代码以限制访问,以满足所需的准确访问级别。当您只需要允许访问包中的代码或其子类时,请使用protected修饰符。我不明白你的意思......
从概念上讲,类中的方法可以分为:构造函数setters / getters从客户端使用的方法(即其他类)内部方法(从类中的其他方法使用)
只需将访问修饰符放在您需要标记为“受保护”的位置前面。
答案 5 :(得分:1)
java api中的许多类都使用受保护的构造函数,因此您只能拥有来自其他对象的对象实例。示例:Graphics类。它有一个受保护的构造函数,获取Graphics类副本的方法是让一个Image对象调用getGraphics()。
答案 6 :(得分:0)
受保护方法的主要用途是当一个类期望其派生类使用自己的特性覆盖该方法时,以及调用基类版本。
E.g。
public class Base
{
public void doStuff()
{
a(); b(); c();
}
protected void a(){ //does something
}
protected void b(){ //does something
}
protected void c(){ //does something
}
}
...
public class Derived extends Base
{
protected void b()
{
// Does something different before the original functionality.
super.b(); // Calls the original functionality
// Does something different after the original functionality.
}
}
...
public class Main
{
public static void main(String args[])
{
Base b = new Derived();
b.doStuff(); // Calls b.a(), ((Derived)b).b(), b.c()
}
}