以下代码演示了名为SubClass
的子类可以直接访问名为 staticMethod 的最终静态同步方法。无需将其与其类名相关联。
package synchronizedpkg;
class SuperClass
{
public final static synchronized void staticMethod()
{
System.out.println("Method called.");
}
}
final class SubClass extends SuperClass
{
public void woof()
{
staticMethod();
}
}
final public class Main
{
public static void main(String[] args)
{
new SubClass().woof();
}
}
这在继承方面有点混乱,因为最终方法不能被继承,因此不应该直接被它的子类访问。如上所示的最终静态方法如何从其子类中直接访问?
答案 0 :(得分:2)
静态方法就像实例方法一样继承。来自section 8.4.8 of the JLS:
C类继承自其直接超类,并且直接超级接口超类的所有非私有方法(无论是否为抽象)以及在与C相同的包中使用默认访问权限进行公共,保护或声明的超级接口,并且都不会被覆盖(§8.4.8.1)也没有通过集体声明隐藏(§8.4.8.2)。
这并没有说明只继承实例方法。
答案 1 :(得分:2)
你的理解是错误的:
这在继承方面有点令人困惑,因为这是一个决赛 方法不能被继承,因此不应该直接 由它的子类访问。如何显示最终的静态方法 以上可以从其子类直接访问?
最终方法不能重写,或者在静态方法隐藏的情况下,它仍然是继承的。如果你想阻止子类看到它,那么你必须使它私有。
因此,它是可见的,因此您可以访问它。它是会员,因此您无需对其进行限定。
答案 2 :(得分:1)
来自Understanding Instance and Class Members:
“Java编程语言支持静态方法和静态变量。静态方法在其声明中具有静态修饰符,应该使用类名调用,而不需要创建类的实例,如
ClassName.methodName(args)
注意: 您还可以使用对象引用(如
)来引用静态方法instanceName.methodName(args)
但这是不鼓励的,因为它没有说明它们是类方法。“
因此,您可以从继承它的实例或其类名调用静态方法。这意味着,对于所有意图和目的,您可以将上述方法想象为不是静态的,并且您可以正常继承它。
编辑:对于最终修饰符,这只意味着该方法不能在子类中重写。我可以看到,你没有这样做,所以它不会影响结果。你可以阅读这个here。
答案 3 :(得分:1)
静态意味着对所有对象都相同。因此,如果使用对象引用或类引用调用它并不重要,因为它对于每个对象都是相同的。
示例:假设您有老师教授所有年级的所有学生。因此,如果一年级学生打电话给她的一年级老师,二年级学生打电话给她的二年级老师,或者其他人打电话给她的学校老师,这并不重要。他们都是指同一位老师。
学生可以通过姓名推荐她,其他每个学生都可以知道他正在引用她。但是来自校外的人,如果他们不得不提及她,就必须说出学校的名字和老师的名字。
即使在java中它也是如此。 Java可能是唯一与现实世界场景相关的语言。希望这有助于..... :)。
答案 4 :(得分:0)
static
表示类级别,它与类的对象无关,您不需要n对象来访问静态方法