class A{
public static void staticMethod(){
System.out.println("Static method of A");
}
}
class B extends A{
public static void staticMethod(){
System.out.println("Static method of B");
}
}
class TestStaticOverride{
public static void main(String args[]){
B b=new B();
A a=b;
a.staticMethod();
}
}
输出为"A的静态方法"。因此静态方法不会被重写,否则输出将是“静态方法B”。JVM如何在运行时决定调用类A而不是B的静态方法。
虽然有可能,但不建议从实例调用静态方法。
A a = new B();
a.staticMethod();
一个好的实践者是直接从它所在的地方调用它:
A.staticMethod();
注意:我认为您可以在IDE中配置警告消息
正如您在StackOverflow的静态标签中看到的:
静态是一些编程语言中使用的术语,用于定义未绑定到任何特定对象实例的函数或数据存储区域(字段)。
编辑:无论是通过实例还是在类级别调用静态方法,编译器都会将其识别为静态方法,因此在类级别而不是对象级别对其进行处理。这意味着该方法不知道调用该方法的对象的状态。如果使用一个对象来调用该方法,例如在您的示例中,编译器将只能根据该对象被声明为什么来知道调用哪个方法,A或B。如果它被实例化为一个不同的子类,这无关紧要,因为它是一个静态方法,并且没有对象的概念。所以,在你的例子中,这就是为什么它会调用A的静态方法而不是B的。
希望这是我之前得到的更清楚的解释
静态方法在编译时解析,这就是为什么它们绑定到定义它们的类,而不是实例。所以它们属于一个类,而不是一个实例,这就是为什么另一个名字是“类方法”。您可以根据Java语法从实例调用静态方法,但是当您从类调用它时,它总是被认为是静态方法。
A a;
a = [no matter what];
a.static_method();
与以下内容完全相同:
A.static_method()
不管你给“a”分配了什么值。
编译器在第3行给出了一个错误 此实例方法无法重写Abc中的静态方法 为什么静态方法不能被实例方法覆盖?
我试图理解重载和重写静态和非静态方法是如何工作的。事实上,我试图理解这些方法如何能够和不能出现在父类和子类中。我想出了下面的规则: 我们不能重写静态方法,只能隐藏它们。通过隐藏,我们的意思是在编译时根据引用变量类型决定执行哪个方法,而不是重写(,在运行时根据实例类型选择哪个方法执行)。 例如,让,然后隐藏. 我们可以重写实例方法。 例如重写. 两个或多个具有相同签名的方法不能以静态或非静态组合形式
为什么输出是"静态A"?
我不明白为什么当我尝试编译这段代码时,编译器会显示错误: 在A和B类中,两种方法之间的区别在于返回类型,我读到Java阻止重写静态方法。所以我希望编译器不会显示任何错误,因为最初没有任何重写!!
我对在我想要克隆对象的类中重写克隆方法感到困惑。 因为Java中的每个类都是从Object扩展而来的,所以它应该有clone方法,但是我们仍然被迫重写clone。为什么要求? 另外,我在一些地方阅读了重写克隆对象并将其公之于众的内容。我想知道,为什么会这样? 欢迎提供所有答案。
问题内容: 我正在努力了解为什么在Java中 需要方法重载和重写 ? 我已经阅读了一些与此相关的文章,但无法理解为什么实际上需要它? 我还访问了以下url,但在该主题中我还不清楚。 Java重载和覆盖 任何实际的例子将不胜感激。 提前致谢。 问题答案: 来自doc的 方法重载: 假设您有一个可以使用书法绘制各种类型的数据(字符串,整数等)的类,并且包含一个用于绘制每种数据类型的方法。为每个方法使用