为什么在没有子类中的完全限定名称的情况下可以访问静态方法?

时间:2011-11-16 20:09:46

标签: java static

以下代码演示了名为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();
    }
}

这在继承方面有点混乱,因为最终方法不能被继承,因此不应该直接被它的子类访问。如上所示的最终静态方法如何从其子类中直接访问?

5 个答案:

答案 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对象来访问静态方法