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

芬克尔森

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

public class Test {

    public static void main(String[] args) {
        new UtilImpl().fun();
        new AbstractUtil() {}.fun();
    }

    static abstract class AbstractUtil {
        public static void fun() {
            System.out.println("Fun!");
        }
    }

    static class UtilImpl extends AbstractUtil {
    }

}

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

聚苯乙烯

在实例上调用静态方法有什么优势?

Tunaki

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

声明为静态的方法称为类方法。

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

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

例15.12.4.1-1用以下方式表示这一点:

当计算目标引用然后由于调用模式为静态而将其丢弃时,将不检查该引用以查看其是否为空:

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

这里favourite()返回null,但不会引发NullPointerException。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我的服务可以访问我的静态类吗?

为什么没有实例就可以访问我的实例变量?

为什么我可以直接访问我的JSP?

我可以使用超类的类工厂静态方法创建子类实例吗?

C# 为什么我可以通过属性访问非静态类的方法和属性,而无需先创建该类的实例?

为什么从子类调用超类方法时我的值为空?

为什么可以从apache访问我的根目录?

为什么我无法在我的 AndroidViewModel 类中访问我的应用程序?

为什么我的超类调用我的子类方法?

当我尝试访问我的类中的属性时,为什么会出现 NameError?

尝试访问我在其上调用类方法的类的实例变量

为什么我可以实例化静态内部类?

在Java中,为什么超类方法不能从子类实例访问受保护的方法或私有方法/变量?

为什么需要使用http.StripPrefix访问我的静态文件?

为什么我们不能在扩展类的静态方法中使用此实例?

从子类访问时,我的超类变量为空

为什么我不能访问我的对象成员变量?

为什么我不能从远程访问我的postgres?

为什么我无法从 Firestore 访问我的数据?

为什么我不能使用带有“ GET”方法的Express'Router()访问我的参数

为什么我不能从另一个PHP页面访问我的静态变量

为什么我可以像调用实例方法一样调用类方法?

为什么vscode的扩展REST客户端可以访问我的api?

为什么root可以访问我的x服务器?

为什么我可以在没有 getter 方法的情况下访问私有实例变量?

Python-为什么我可以使用实例调用类方法?

为什么从子类的超类调用方法中获得“ this”?

为什么我可以访问在命名空间之外定义的类?

为什么无法使用IP地址访问我的博客?