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

是否可以在派生类中重写静态方法?

陈博容
2023-03-14
问题内容

我在基类中定义了一个静态方法,我想在其子类中重写此方法,这可能吗?

我尝试了一下,但是没有按预期工作。当我创建类B的实例并调用其callMe()方法时,将调用类A中的静态foo()方法。

public abstract class A {
  public static void foo() {
    System.out.println("I am base class");
  }

  public void callMe() {
    foo();
  }
}

Public class B {
  public static void foo() {
      System.out.println("I am child class");
  }
}

问题答案:

静态方法调用在编译时解决(不动态分配)。

class main {
    public static void main(String args[]) {
            A a = new B();
            B b = new B();
            a.foo();
            b.foo();
            a.callMe();
            b.callMe();
    }
}
abstract class A {
    public static void foo() {
        System.out.println("I am superclass");
    }

    public void callMe() {
        foo(); //no late binding here; always calls A.foo()
    }
}

class B extends A {
    public static void foo() {
        System.out.println("I am subclass");
    }
}

I am superclass
I am subclass
I am superclass
I am superclass


 类似资料:
  • 我试图实现的是重写此方法: 公共布尔onKeyPreIme(int-keyCode,KeyEvent事件) 该方法位于SearchView中。搜索自动完成类http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.0_r1/android/support/v7/widget/Se

  • 我有3个子类,每个都有唯一的ImagePath。 因此,我实现了,因为所有实例共享相同的映像。 问题就在这里。我想从父实例调用子静态方法。 当然,我可以使用调用基于类的静态方法。 假设我有10个子类,使用if-else语句并逐个调用它并不容易。 在Java中有没有办法从父实例调用子静态方法??

  • 我想知道: 为什么在Java中不能重写静态方法? 静态方法可以在Java中重载吗?

  • 问题内容: 我想在PHP中创建一个静态类,并使其行为像在C#中一样,所以 在第一次调用类时会自动调用构造函数 无需实例化 这种东西… 问题答案: 您可以在PHP中拥有静态类,但它们不会自动调用构造函数(如果尝试调用,则会收到错误)。 因此,您必须创建一个函数并在每个方法中调用它:

  • 问题内容: 我有以下代码片段: 执行代码时出现异常: 我不明白为什么会有和例外。有人可以帮助我理解吗? 您可以在此处检查代码。 问题答案: 创建一个对象,这意味着首先调用其超类构造函数,然后依次调用-但您已覆盖它,因此它是该方法的子版本。在该方法中,您调用尚未初始化的。 结论:在构造函数中调用可重写方法几乎从来不是一个好主意。

  • 我试图理解重载和重写静态和非静态方法是如何工作的。事实上,我试图理解这些方法如何能够和不能出现在父类和子类中。我想出了下面的规则: 我们不能重写静态方法,只能隐藏它们。通过隐藏,我们的意思是在编译时根据引用变量类型决定执行哪个方法,而不是重写(,在运行时根据实例类型选择哪个方法执行)。 例如,让,然后隐藏. 我们可以重写实例方法。 例如重写. 两个或多个具有相同签名的方法不能以静态或非静态组合形式