受保护的修饰符是什么意思?

我正在阅读“Java编程语言”第3版 。

在第3.5章中,它使用以下单词说明了protected修饰符:

更确切地说,除了可以在类本身内访问以及在同一个包中编码之外,还可以通过对象引用从类访问受保护的成员,该对象引用至少与类的类型相同,类的类型的引用或其中一个亚型。

两个方面让我感到困惑:

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

2.我不明白a protected member can also be accessed from ...意思是,任何人都可以向我解释一下吗?

  1. 是的,可以从类本身,类的子类以及类的同一个包中的所有类访问protected成员(如果它们是子类,则无关紧要)。 如果你以前不知道最后一部分,那么你刚刚学到了新东西。

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

在Java中, protected表示成员可以被同一个包中的任何类和子类访问,即使它们位于另一个包中。

注意

 A protected variable is not visible outside the package 

例如,B扩展A,A具有受保护的int x; 它可以在类B中使用。但不能使用其实例变量进行访问

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

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

我不明白受保护的成员也可以从…访问…意味着,任何人都可以向我解释一下吗?

例如,您有一个对象A和一个对象B,它们都是同一个类。 如果对象A具有对它的引用,则对象A将能够查询对象B的受保护属性和方法。 受保护的修饰符在类级别强制执行,而不是在对象级别强制执行。 在某些情况下,这可以派上用场。

这是答案

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

  2. 由于类X的受保护成员(实例变量/状态和方法/行为)被inheritance并且作为X的子类的一部分可见,例如Y1,Y2,Y3,并且可以进一步向下到下一级,任何对象引用类型X或Y1,Y2,y3可用于访问受保护的成员。

只需将其视为公共与私人之间。 您可以从公共类访问所有内容,而不是从私有类访问。