在子类的对象上,可以使用父类的静态方法,但是当我们在子类中定义相同的方法时,现在子类的对象开始指向子类的方法。这听起来像是覆盖了,但并非如此,因为静态方法可以t覆盖。这是怎么发生的,以及Java的此功能称为什么?
class A extends B {
public static void main(String[] args) {
new A().method();//call class B's method if method is not in A otherwise A's
}
/*
public static void method(){
System.out.println("class A method");
*/
}
class B {
public static void method() {
System.out.println("class B method");
}
}
这似乎很重要,但不是.jdk如何管理它?由于我的垃圾平板电脑,我感到抱歉。
由于A
extends B
,A
(您通过调用创建的new A()
)实例将具有所有方法B
。因此,如果调用.method()
的实例A
,则VM会method()
在其自身范围内首先查找,即内部的动态方法A
,然后是内部的dyanmic方法B
,然后是内部的静态方法A
,最后是B
。这是可能的,因为VM允许通过this
引用访问静态方法,尽管不建议这样做,因为它会损害可读性。
问题内容: Java不允许覆盖静态方法,但是, 在这里没有覆盖吗? 问题答案: 这是“隐藏”,而不是“覆盖”。要看到这一点,请将方法更改为以下内容: 这应该打印: 如果正在进行真正的覆盖,那么您会看到: 通常认为使用实例类型来调用静态方法是一种不好的方式,就像您正在做的那样,因为很容易想到您正在调用实例方法,并且容易误以为重写正在发生。Java样式检查器/代码审核工具通常会将其标记为样式错误/潜在
本文向大家介绍在Java中可以重载或覆盖静态方法吗,包括了在Java中可以重载或覆盖静态方法吗的使用技巧和注意事项,需要的朋友参考一下 Java中的静态方法可以重载。 让我们看一个例子- 示例 输出结果 名为Demo的类包含一个名为“ test”的函数,该函数可打印特定消息。它还定义了另一个名为“ test”的函数,该函数以整数值作为参数。在main函数中,调用test函数时不带参数和带整数参数。
问题内容: 当静态方法在子类中被重写时,我对它的行为感到困惑。 下面是代码: 为什么在第二种情况下在这里调用超类的静态方法? 如果方法不是静态的,则根据多态性,当在运行时传递子类对象时,将调用子类的方法。 问题答案: 静态方法的解析始终基于类型。 代码 编译后转换为此 对此,它是对方法的调用而不是对子类方法的调用。因此,您将获得方法的输出。
问题内容: 我正在做作业,遇到了一些错误。在一个类中,我有此方法: 现在,我收到错误消息“无法从静态上下文中引用非静态方法…”,因此我将getPoints()设置为静态方法,并将变量也设置为静态,并且它可以正常工作。但是在另一种打印对象的方法中,它不起作用(我相信是由于static关键字)。 所以我的问题是,有没有一种方法可以在不创建第二个Class实例的情况下调用方法?这是我所拥有的一般构想代码
问题内容: 我很困惑为什么不允许以下内容: 我知道为什么接口中的方法不能是静态的,但是为什么覆盖方法不能是静态的? 我希望所有类都可以实现该方法,但目前仅限于如果已经实例化了该对象而无法调用该方法,则只能调用该方法… **_更新: _ 感谢您的回答,我现在对此有了更好的了解。基本上,我不应该尝试使实用程序类(或与此相关的工厂类)实现接口(或者至少不是这样)。 问题答案: 在Java中调用静态方法要
问题内容: 为什么无法覆盖静态方法? 如果可能,请使用示例。 问题答案: 覆盖取决于拥有类的实例。多态性的重点是可以对一个类进行子类化,并且实现那些子类的对象对于在超类中定义的相同方法(在子类中被重写)将具有不同的行为。静态方法未与类的任何实例相关联,因此该概念不适用。 影响Java设计的因素有两个。一个是对性能的关注:Smalltalk批评它太慢(垃圾回收和多态调用是其中的一部分),Java的创