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

多态和静态方法

司马彬
2023-03-14
问题内容

我在这里有关于此代码的问题

public Car {
    public static void m1(){
        System.out.println("a");
    }
    public void m2(){
        System.out.println("b");
    }
}

class Mini extends Car {
    public static void m1() {
        System.out.println("c");
    }
    public void m2(){
        System.out.println("d");
    }
    public static void main(String args[]) {
        Car c = new Mini();
        c.m1();
        c.m2();       
   }
}

我知道多态性不适用于静态方法,仅适用于实例方法。而且,对于静态方法而言,覆盖无效。

因此,我认为该程序应打印出来:c,d

因为c调用了m1方法,但是它是静态的,所以它无法覆盖,并且在Mini类而不是Car中调用该方法。

这样对吗?

但是,我的教科书说答案应该是:a,d

是错字吗?因为我现在有点困惑。

请清除此,谢谢。


问题答案:

因为c调用了m1方法,但是它是静态的,所以它无法覆盖,并且在Mini类而不是Car中调用该方法。

那完全是倒退。

c声明Car,因此静态方法调用由通过c将调用定义的方法Car
编译器c.m1()直接编译为Car.m1(),而不知道c实际包含Mini

这就是为什么您永远不要通过这样的实例调用静态方法的原因。



 类似资料:
  • 我们可以把一个方法赋值给类的函数本身,而不是赋给它的 "prototype"。这样的方法被称为 静态的(static)。 在一个类中,它们以 static 关键字开头,如下所示: class User { static staticMethod() { alert(this === User); } } User.staticMethod(); // true 这实际上跟直接将其

  • PowerMockito.when(ConnectionFactory.getConn(“ABC”).getCurrentStatus()).thenReturn(ConnectionStatus.Connected); 对于上面的陈述,我得到了一个NPE。 我在junit测试类的开头已经有@PrepareForTest({fxallConnectionFactory.class,Connecti

  • 问题内容: 我有必须从静态方法中使用的服务。我知道这是错误的,但是我无法更改当前的设计,因为这需要大量的工作,因此我需要一些简单的技巧。我不能更改为非静态的,而需要使用此自动装配的bean。有什么线索怎么做? 问题答案: 您可以通过执行以下解决方案之一来做到这一点: 使用构造函数@Autowired 这种方法将构造需要一些bean作为构造函数参数的bean。在构造函数代码中,您可以将静态字段的值设

  • rank ▲ ✰ vote url 31 549 117 733 url 静态方法 Python有没有静态方法使我可以不用实例化一个类就可以调用,像这样: ClassName.StaticMethod ( ) 是的,用静态方法装饰器 class MyClass(object): @staticmethod def the_static_method(x): pri

  • 问题内容: 请参见下面的代码段: 代码1 代码2 这些代码段之间有什么区别?两者都15作为答案输出。 问题答案: 静态方法属于类本身,而非静态(aka实例)方法属于从该类生成的每个对象。如果你的方法执行的操作不依赖于其类的单个特征,请将其设置为静态(这将使程序的占用空间减小)。否则,它应该是非静态的。 例: 你可以像这样调用静态方法:。如果你使用method2尝试该操作,它将失败。但这将起作用:;

  • 我有点困惑。请看看下面的代码。 我确信调用此序列是可能的。 虽然我仍然有一个小小的困惑,但我们可以很容易地看到也调用方法,这是一个静态方法。方法 是调用非同步静态方法的静态同步方法。当 thread-2 获得类级锁时,为什么从 Thread-1 调用 没有被阻止? 我只是在逻辑上感到困惑,如果一个线程获得类级锁定,则该类其他非同步静态方法保持打开状态,以便从其他方法(实例方法)调用。为什么?