当前位置: 首页 > 知识库问答 >
问题:

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

应向晨
2023-03-14

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

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 {
    }

}

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

PS

在实例上调用静态方法的优点是什么?

共有2个答案

邓浩漫
2023-03-14

它被称为继承。子类继承父类的public成员,包括静态方法。重要的是静态方法不绑定到任何实例。您可以这样做:

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

就编译器而言,这是一回事。唯一的区别是您的代码创建对象,但这些与方法的调用方式无关(另外,正如@Dici在评论中所说,您也应该收到来自编译器的警告)。

荀学文
2023-03-14

在Java中,允许使用实例变量调用静态方法。JLS第8.4.3.2节对此进行了定义,引用了:

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

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

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

示例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。

 类似资料:
  • 我从一个有静态方法的类(B)扩展了一个类(a),然后在另一个类(C)中,我创建了一个类(a)的实例,并且我能够访问类B的静态方法。为什么会这样? A类: B类: C类:

  • 本文向大家介绍我们可以从Java中的静态方法访问实例变量吗?,包括了我们可以从Java中的静态方法访问实例变量吗?的使用技巧和注意事项,需要的朋友参考一下 我们无法直接访问静态方法内的实例变量,因为静态方法只能访问静态变量或静态方法。 顾名思义,实例变量与类的实例相关。因此,直接从不依赖于任何特定实例的静态方法访问它是没有意义的。因此,要访问实例变量,我们必须具有要从中访问实例变量的类的实例。 例

  • 我找不到任何解释原因的好消息:

  • 假设我有一个基类(具有一个名为)的虚拟方法)和300个子类:每个子类都有一个静态方法,外加一个重写。(请不要问为什么;这是在一个生产软件中,已经给出了,不能为了更好的重用而更改设计。实际上,那些子类是由一个代码生成器生成的,但现在这已经不相关了。) 根据应用程序的不同执行,需要初始化的(小)子集。换句话说,有一些数据是特定的所有实例共同共享或访问的。显然,将这些实体定义为成员/方法(因为它们由的所

  • 问题内容: 大家好!我有一个简单的问题。…为什么我可以从main方法中获得一个私有变量?我知道,我在包含类中,但这是主要的。我相信主体不是包含它的类的一部分……那么我不会去找私人成员,但是我可以……为什么?请帮助… thx 问题答案: Main是您的类的一部分,您已经在类中声明了它:) main不是您的对象的一部分,它不会是您从该类创建的对象的任何部分,但它仍然是该类的一部分。这对于任何静态函数都