如果静态成员未在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节)。
答案 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的继承教程,以下是同一页面摘要的屏幕截图
答案 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
,或者访问修饰符更改为getter
或public
protected.