为什么我可以从子实例访问我的超类的静态方法?

时间:2015-09-05 20:48:03

标签: java static-methods

为什么可以从子实例访问我的超类的静态方法?

error: 2014

我同意从父类的实例访问父类的静态方法。但是如果我实例化一个子类,那么访问父类的静态上下文是很奇怪的。

PS

在实例上调用静态方法有什么好处?

2 个答案:

答案 0 :(得分:3)

它被称为继承。子类继承父类的public个成员,包括static个方法。重要的是static方法没有绑定到任何实例。你可以这么做:

UtilImpl.fun();
AbstractUtil.fun();

就编译器而言,它是一回事。唯一的区别是你的代码创建了对象,但这些对象与调用方法的方式无关(加上@Dici在评论中说你也应该从编译器那里得到警告)。

答案 1 :(得分:3)

在Java中,允许使用实例变量调用静态方法。这在JLS section 8.4.3.2中定义,引用:

  

声明为static的方法称为类方法。

     

始终在不引用特定对象的情况下调用类方法。

在这种情况下,Java实际上会丢弃您使用的实例并调用静态方法。

Example 15.12.4.1-1通过以下方式表达:

  

计算目标引用然后因为该目标而被丢弃   调用模式是静态的,不检查引用   是否为null:

class Test1 {
    static void mountain() {
        System.out.println("Monadnock");
    }
    static Test1 favorite(){
        System.out.print("Mount ");
        return null;
    }
    public static void main(String[] args) {
        favorite().mountain();
    }
}
     

打印:

Mount Monadnock
     

这里的favorite()返回null,但没有抛出NullPointerException。