当前位置: 首页 > 面试题库 >

从静态方法调用超级方法

萧辰沛
2023-03-14
问题内容

是否可以从子静态方法调用超静态方法?

我的意思是,到目前为止,到目前为止,我有以下内容:

public class BaseController extends Controller {
    static void init() {
        //init stuff
    }
}

public class ChildController extends BaseController {
    static void init() {
        BaseController.loadState();
        // more init stuff
    }

}

并且它可以工作,但是我想以一种通用的方式来做,就像调用super.loadState()一样,这似乎不起作用…


问题答案:

在Java中,静态方法不能被覆盖。原因在这里 得到了很好的解释

因此,它不依赖于被引用的对象。但是,它取决于引用的类型。因此,据说静态方法隐藏了另一个静态方法而不覆盖它。

例如(Cat是Animal的子类):

public class Animal {
    public static void hide() {
        System.out.format("The hide method in Animal.%n");
    }
    public void override() {
        System.out.format("The override method in Animal.%n");
    }
}

public class Cat extends Animal {
    public static void hide() {
        System.out.format("The hide method in Cat.%n");
    }
    public void override() {
        System.out.format("The override method in Cat.%n");
    }
}

主班:

public static void main(String[] args) {
    Cat myCat = new Cat();
    System.out.println("Create a Cat instance ...");
    myCat.hide(); 
    Cat.hide();
    myCat.override();

    Animal myAnimal = myCat;
    System.out.println("\nCast the Cat instance to Animal...");
    Animal.hide();     
    myAnimal.override();

    Animal myAnimal1 = new Animal();
    System.out.println("\nCreate an Animal instance....");
    Animal.hide();     
    myAnimal.override();
}

现在,输出将如下所示

Create a Cat instance ...
The hide method in Cat.
The hide method in Cat.
The override method in Cat.

Cast the Cat instance to Animal...
The hide method in Animal.
The override method in Cat.

Create an Animal instance....
The hide method in Animal.
The override method in Animal.

对于class methods,运行时系统将调用在调用方法的引用的编译时类型中定义的方法。

换句话说,对静态方法的调用在编译时进行映射,并且取决于引用的声明类型(在这种情况下为父),而不是引用在运行时指向的实例。在示例中,的编译时类型myAnimalAnimal。因此,运行时系统将调用中定义的hide方法Animal



 类似资料:
  • 问题内容: 例如,我正在尝试做这样的事情 我收到一条错误消息,告诉我无法从静态环境中引用非静态变量。因此,如果这是真的,我将如何在main内部使用非静态方法? 问题答案: 你不能 非静态方法是必须在Test类的实例上调用的方法。创建Test的实例以在您的main方法中使用:

  • 我的C代码无法找到Java中的公共静态函数调用。它成功地找到了类,没有错误。 我试图将结果返回给回调方法。“5”稍后将被更复杂的内容取代。 我在StackOverflow上似乎也有类似的问题,但是到目前为止没有任何变化似乎有所帮助。也许我有逻辑错误? 我的JNI(更新#2): 此代码包含在此函数中调用的方法中: 我的Java(更新#1): 签名检查: javap-s-pcecutils 公共静态响

  • 问题内容: 尝试在静态类中调用非静态方法时遇到错误。 无法从类型播放中静态引用非静态方法methodName() 我不能使该方法静态,因为这也给我一个错误。 此静态方法无法从xInterface隐藏实例方法 有什么办法可以在另一个静态方法中轮回调用非静态方法?(这两种方法位于单独的包和单独的类中)。 问题答案: 从静态方法中调用非静态方法的唯一方法是使类的实例包含非静态方法。根据定义,非静态方法是

  • 问题内容: 正在学习Java,现在遇到以下问题:我将main方法声明为 在我的主要方法中,因为它是静态的,所以只能调用其他静态方法!!!为什么呢 例如:我有另一堂课 所以在我的主班我声明一个 但是,如果它们不是静态的,我将无法调用任何方法。 这哪里出错了? 编辑:对不起,我的问题是:如何“设计”该应用程序,以允许我从“起点”调用其他类。 问题答案: 你只需要创建一个ReportHandler实例:

  • 我最近对 PHP 5.4 进行了更新,但收到有关静态和非静态代码的错误。 这是错误: 这是第371行: 我希望有人能帮忙。

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