protected修饰符是什么意思?

34

我正在阅读书籍Java编程语言(第三版)

在第3.5章中,它用以下话语说明了protected修饰符:

更准确地说,除了在类本身内部和在相同包中的代码中可访问外,受保护的成员还可以通过与至少与该类相同类型的对象引用(即类的类型或其子类型的引用)从类中访问。

这些话让我困惑,在两个方面:

1. 受保护的成员可以被同一包中的代码访问吗? 我之前所知道的是受保护的成员只能被子类访问...

2. 我不明白受保护的成员还可以通过 ...是什么意思,谁能解释一下?


http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html。protected 表示该属性/方法可以在包内以及子类型中被访问。 - aishwarya
1
这是一个简单的“备忘单”,解释了protected和其他访问修饰符。链接 - aioobe
你之前所谓的“已知”其实是不正确的,这本书才是正确的。 - user207421
6个回答

22
  1. 是的,protected 成员可以从类本身、类的子类和同一包中的所有类中访问(无论这些类是否为子类)。如果你之前不知道最后一部分,那么你刚刚学到了新东西。

  2. 这意味着你可以使用这些成员;如果一个成员不可访问,这意味着当你尝试使用它时会得到编译器错误。


对于第二个语句:当最初声明protected int status;并在以后访问它时,它不会抛出错误。因为它的默认值会自动设置为0。所以当它不可访问时,status将始终为0 - Janaka R Rajapaksha
@JanakaRRajapaksha 成员变量的默认值与可访问性无关。 - Jesper
假设我从一开始就声明了它。现在我试图从不可访问的类(x)或方法(x)中访问它。由于它不可访问,当从可访问的地方输出时,它将具有其默认值。根据您的第二个语句,我期望会出现错误,但实际上并没有。它只是简单地给出0作为它的默认值。所以代码在“x”中是无用的。 - Janaka R Rajapaksha
在同一包中的兄弟类可以通过引用访问彼此的受保护成员。例如,扩展org.my.Base类的org.my.Derived1和org.my.Derived2可以通过其他类型的引用访问彼此的受保护成员。但是,也扩展org.my.Base的com.another.Derived3除非Derived3被转换为com.my.Base,否则无法从Derived1或Derived2访问其受保护成员。C#不允许这样做,请参见https://learn.microsoft.com/en-us/archive/blogs/ericlippert/why-cant-i-access-a-protected-member-from-a-derived-class。 - Jose Quijada

15

在Java中,protected表示该成员可以被同一包中的任何类以及子类访问,即使它们在其他包中。

注意:

protected访问修饰符可在包内和包外通过继承来访问

例如,B (在另一个包中)扩展了A,并且A有一个受保护的整数x; 它可以在B类中使用。


@ZarEAhmer,您能否将您的注释作为自己的答案或评论发布,而不是作为编辑,并解释一下您所说的“它的实例变量”是什么意思? - Solomon Ucko

2

1) 是的,受保护的成员可以被同一包中的类访问。这是Java的工作方式。

2) 这意味着子类可以访问它们。


0
我不明白“受保护成员也可以从……访问”是什么意思,有人能解释一下吗?
例如,你有一个对象A和一个对象B,它们都是同一个类的实例。如果对象A有对对象B的引用,那么它将能够查询对象B的受保护属性和方法。受保护修饰符是在类级别上强制执行的,而不是在对象级别上。在某些情况下,这可能会很方便。

0

以下是答案

  1. 是的。类的受保护成员(实例变量和方法)可以被同一包中的其他类访问,也可以被扩展包含要访问的成员的此类的任何其他类访问。在同一规范中,他们还提供了表格,其中访问级别严格增加,提供了前一级别中允许的所有访问:private -> package -> protected -> public

  2. 由于类X的受保护成员(实例变量/状态和方法/行为)是作为X的子类Y1、Y2、Y3的一部分继承和可见的,并且可能进一步下降到下一个级别,因此类型为X或Y1、Y2、y3的任何对象引用都可以用于访问该受保护成员。


0

就像公共和私有之间的区别一样。你可以从公共类中访问所有内容,而从私有类中访问的内容较少。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接