关于Java静态及其访问修饰符

时间:2017-05-01 22:10:35

标签: java static access-modifiers

如果静态成员未在Java中继承,那么为什么访问修饰符(private,protected ...)适用于它们?

也许,我对“继承”一词并不是100%明确: 当他们说“静态不继承”时,他们的意思是“不可见”或“不能重新定义/重新实现”或两者兼而有之?

当谈到静态类成员时,访问修饰符仅意味着可见性,在谈论普通类成员时可见性以及重新实现的可能性是否正确?

你能不能提供一些例子来说明静电,比如私人有意义吗?

由于

PS:现在我认为声明“Java中的静态变量不是继承的,它们只存在于声明它们的类中”在这个论坛上传播(例如:What are the rules dictating the inheritance of static variables in Java?)IS不正确

Java语言规范#8.4.8声明:

8.4.8继承,覆盖和隐藏

C类从其直接超类继承超类的所有具体方法m(静态和实例),其中所有以下都是真的:

m是C的直接超类的成员。 m是与C相同的包中的公共,受保护或声明的包访问。 在C中声明的方法没有签名是m的签名的子签名(第8.4.2节)。

3 个答案:

答案 0 :(得分:2)

  

如果静态成员不是在Java中继承的,那么为什么要访问修饰符   (私人的,受保护的......)适用于他们吗?

谁说静态成员无法被关注,请参阅JLS (§Example 8.2-2). example

在Java中,“静态”只表示访问此字段/方法不需要任何对象。

private ”只是一个访问修饰符,这意味着以下字段/方法无法在其外部访问,并且只能由此类本身或任何内部类访问。

只有从子类中继承的超类的“静态”方法才能从下面的JLS摘录中理解:

  

如果一个C类声明或继承静态方法m,那么就说m   隐藏任何方法m',其中m的签名是子签名   (§8.4.2)m'的签名,在超类和   C的超级接口,否则C中的代码可以访问。

所以,基本上你不能覆盖一个静态方法,但如果它没有被子类隐藏,你当然可以继承一个静态方法。

阅读以下JLS section (§8.4.8.2. Hiding (by Class Methods))关于隐藏类方法的内容。

此外,您可以从here阅读Java的继承教程,以下是同一页面摘要的屏幕截图

enter image description here

答案 1 :(得分:0)

会员可见性适用于子类。 From Oracle,他们在提及static成员时,将其应用于包裹的其余部分或“世界”的其余部分。

如果您创建了private static成员,则说明这是该特定类的成员独占。然后,您可以在可见性链上工作:

  • private最不可见,
  • <no modifier>(或受包保护的)是第二个最不可见的,
  • protected是第二最明显的,
  • public最明显。

我没有看到有人真正使用protected static成员,即使它是有效的Java。惯例规定,这应该是一个可见的常数(在这种情况下,它可能是public),或者是一个小于可见的测试暴露常数(这可以证明包保护的可见性。

答案 2 :(得分:0)

类中的static成员只是意味着它将在类的所有对象之间共享。不会为该类的每个实例实例化一个新变量。

Access修饰符控制Java中变量的可见性。对于静态成员和非静态成员,访问修饰符的含义是相同的。它与静态成员无关。

关于您的问题,在静态变量中使用访问修饰符意味着:

private static count:静态成员计数仅对定义它的类可见。但是,如果继承定义此静态变量的类,则继承的类无法直接访问它。仅当超类为其定义了count,或者访问修饰符更改为getterpublic

时,才能访问protected.