企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## [protected](https://lingcoder.gitee.io/onjava8/#/book/08-Reuse?id=protected) 即然你已经接触到继承,关键字**protected**就变得有意义了。在理想世界中,仅靠关键字**private**就足够了。在实际项目中,却经常想把一个事物尽量对外界隐藏,而允许派生类的成员访问。 关键字**protected**就起这个作用。它表示“就类的用户而言,这是**private**的。但对于任何继承它的子类或在同一包中的类,它是可访问的。”(**protected**也提供了包访问权限) 尽管可以创建**protected**属性,但是最好的方式是将属性声明为**private**以一直保留更改底层实现的权利。然后通过**protected**控制类的继承者的访问权限。 ~~~ // reuse/Orc.java // The protected keyword class Villain { private String name; protected void set(String nm) { name = nm; } Villain(String name) { this.name = name; } @Override public String toString() { return "I'm a Villain and my name is " + name; } } public class Orc extends Villain { private int orcNumber; public Orc(String name, int orcNumber) { super(name); this.orcNumber = orcNumber; } public void change(String name, int orcNumber) { set(name); // Available because it's protected this.orcNumber = orcNumber; } @Override public String toString() { return "Orc " + orcNumber + ": " + super.toString(); } public static void main(String[] args) { Orc orc = new Orc("Limburger", 12); System.out.println(orc); orc.change("Bob", 19); System.out.println(orc); } } ~~~ 输出: ~~~ Orc 12: I'm a Villain and my name is Limburger Orc 19: I'm a Villain and my name is Bob ~~~ `change()`方法可以访问`set()`方法,因为`set()`方法是**protected**。注意到,类**Orc**的`toString()`方法也使用了基类的版本。