首页 文章

静态方法继承和多态

提问于
浏览
2

继承和多态如何与静态方法一起使用?有人可以解释一下这里应该是什么样的输出以及它是如何导出的?

class A { public static int get() { return 17; } }
class B extends A { public static int get() { return 42; } }


 Main
 A x = new B();
 x.get();

错误消息,

应该以静态方式访问类型A的静态方法get()

我想我知道如何以静态方式访问它,但这是一个来自类的问题,它暗示将返回一个或另一个值

在我们的程序中,我们有类定义:

class A { public static int get() { return 17; } }
class B extends A { public static int get() { return 42; } }

和其他地方我们宣布 A x = new B();

电话 x.get() 将返回什么号码?

2 回答

  • 3

    调用将返回 int17 .

    static 方法不是继承的 .

    static 方法根据调用它们的表达式的类型进行绑定和调用 .

    所以

    x.get();
    

    其中 x 的类型为 A ,调用 A 的实现 . 另请注意, static 方法不需要调用实例 .

    这些也可以 .

    ((A) null).get();
    A.get();
    ...
    public static A someMethod() {}
    ...
    someMethod().get();
    

    您收到的消息是警告,而不是错误 .

  • 5
    static methods are not inherited.
    

    静态方法属于类而不是对象 . 它们属于该类,因此不适合多态行为

    .

    覆盖取决于具有类的实例 . 多态性的一点是,您可以对类进行子类化,并且实现这些子类的对象将对超类中定义的相同方法具有不同的行为(并在子类中重写) . 静态方法与类的任何实例都没有关联,因此该概念不适用 .

    驱动Java设计的两个因素影响了这一点 . 一个是对性能的担忧:有很多人批评Smalltalk关于它太慢(垃圾收集和多态调用是其中的一部分)而Java的创建者决心避免这种情况 . 另一个决定是Java的目标受众是C开发人员 . 使静态方法的工作方式与C程序员的熟悉程度相同,而且速度也非常快,因为没有上层的层次结构来确定调用哪个方法,你可以直接进入类并调用指定的方法 .

    this page

相关问题