7

我的问题是关于“受保护的”访问修饰符。

我知道它的功能,但我不知道什么时候需要使用它。从概念上讲,类中的方法可以分为: 构造函数 setter/getters 来自客户端(即其他类)的方法 内部方法(来自类中的其他方法)

4

7 回答 7

16

你用protected什么时候

  • 你的类是为继承而设计的——你希望你的库的用户继承你正在设计的类。很多时候上课会abstract
  • 该类为其派生类提供了其他类不能看到的特殊功能- 您知道派生类必须有权访问否则为私有的信息,或者
  • 派生类必须为基类提供功能- 有关使用受保护方法的信息,请参阅模板方法模式

请注意,protected方法类似于public方法,一旦您将它们放入,只要您支持您的库,它们就需要保留。与可以自由删除的私有方法不同,protected方法仍然是类接口的一部分。

于 2013-07-11T13:55:50.293 回答
11

当您需要做一些未在公共 API 中公开但仍需要被子类覆盖的内部工作时,请使用它。

于 2013-07-11T13:53:16.940 回答
5

当您希望后代类看到超类的字段/方法时,您需要使用受保护的访问修饰符,但您不希望其他类看到这些。

于 2013-07-11T13:53:44.540 回答
4

我发现它有用的一种情况是当超类的方法打算调用子类的方法时,例如

public abstract class SuperClass
    public final void exposedMethod {
        hiddenMethod();
    }

    abstract protected void hiddenMethod();
}

public class SubClass extends SuperClass {
    protected void hiddenMethod() { }
}

在这种情况下exposedMethod,需要处理诸如日志记录和重试逻辑之类的事情,而hiddenMethod实际的方法实现是

于 2013-07-11T13:55:00.730 回答
2

受保护方法的主要用途是当一个类期望其派生类用自己的特性覆盖该方法,调用基类版本。

例如

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()
    }
}
于 2013-07-11T13:54:29.670 回答
2

java api 中的许多类都使用受保护的构造函数,因此您只能拥有来自其他对象的对象实例。示例:图形类。它有一个受保护的构造函数,获取 Graphics 类副本的一种方法是使用一个 Image 对象来调用 getGraphics()。

于 2013-07-11T13:55:12.593 回答
1

您应该始终封装您的代码以将访问限制为满足所需的确切访问级别。当您只需要允许访问包内的代码或其子类时,请使用 protected 修饰符。我不明白你的意思...

从概念上讲,类中的方法可以分为: 构造函数 setter/getters 来自客户端(即其他类)的方法 内部方法(来自类中的其他方法)

只需将访问修饰符放在您需要标记为“受保护”的前面。

于 2013-07-11T13:54:53.557 回答