我的问题是关于“受保护的”访问修饰符。
我知道它的功能,但我不知道什么时候需要使用它。从概念上讲,类中的方法可以分为: 构造函数 setter/getters 来自客户端(即其他类)的方法 内部方法(来自类中的其他方法)
我的问题是关于“受保护的”访问修饰符。
我知道它的功能,但我不知道什么时候需要使用它。从概念上讲,类中的方法可以分为: 构造函数 setter/getters 来自客户端(即其他类)的方法 内部方法(来自类中的其他方法)
你用protected
什么时候
abstract
。请注意,protected
方法类似于public
方法,一旦您将它们放入,只要您支持您的库,它们就需要保留。与可以自由删除的私有方法不同,protected
方法仍然是类接口的一部分。
当您需要做一些未在公共 API 中公开但仍需要被子类覆盖的内部工作时,请使用它。
当您希望后代类看到超类的字段/方法时,您需要使用受保护的访问修饰符,但您不希望其他类看到这些。
我发现它有用的一种情况是当超类的方法打算调用子类的方法时,例如
public abstract class SuperClass
public final void exposedMethod {
hiddenMethod();
}
abstract protected void hiddenMethod();
}
public class SubClass extends SuperClass {
protected void hiddenMethod() { }
}
在这种情况下exposedMethod
,需要处理诸如日志记录和重试逻辑之类的事情,而hiddenMethod
实际的方法实现是
受保护方法的主要用途是当一个类期望其派生类用自己的特性覆盖该方法,并调用基类版本。
例如
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()
}
}
java api 中的许多类都使用受保护的构造函数,因此您只能拥有来自其他对象的对象实例。示例:图形类。它有一个受保护的构造函数,获取 Graphics 类副本的一种方法是使用一个 Image 对象来调用 getGraphics()。
您应该始终封装您的代码以将访问限制为满足所需的确切访问级别。当您只需要允许访问包内的代码或其子类时,请使用 protected 修饰符。我不明白你的意思...
从概念上讲,类中的方法可以分为: 构造函数 setter/getters 来自客户端(即其他类)的方法 内部方法(来自类中的其他方法)
只需将访问修饰符放在您需要标记为“受保护”的前面。