class Father{
Father(){
System.out.println("Father");
}
void test1(){
System.out.println("Father test1");
}
static void test2() {
System.out.println("Father test2");
}
}
class Son extends Father{
Son(){
System.out.println("Son");
}
void test1(){
System.out.println("Son test1");
}
static void test2() {
System.out.println("Son test2");
}
}
public class FatherSon {
public static void main(String args[]){
Father f2=new Son();
f2.test1();
f2.test2();
}
}
操作结果:
Father
Son
Son test1
Father test2
在Java中不能重写静态方法,尽管可以在子类中声明具有相同签名的方法。它不会在确切的意义上被重写,而是被称为方法隐藏。
更多解释:
可以重写非静态方法,因为它们是在运行时使用动态绑定解析的。
而静态方法属于类,而不是类的对象。静态方法只能重载,因为编译器在编译时使用静态绑定解析它们。
我从一个有静态方法的类(B)扩展了一个类(a),然后在另一个类(C)中,我创建了一个类(a)的实例,并且我能够访问类B的静态方法。为什么会这样? A类: B类: C类:
输出为"A的静态方法"。因此静态方法不会被重写,否则输出将是“静态方法B”。JVM如何在运行时决定调用类A而不是B的静态方法。
编译器在第3行给出了一个错误 此实例方法无法重写Abc中的静态方法 为什么静态方法不能被实例方法覆盖?
为什么可以从子实例访问我的超类的静态方法? 我可以同意从父类的实例访问父类的静态方法。但是如果我实例化一个子类,访问父类的静态上下文会很奇怪。 PS 在实例上调用静态方法的优点是什么?
我还没有看到这个问题,这让我很惊讶。 以下内容不会编译: 然而,将此更改为强制转换对象并将其引用存储在条件语句之外的新对象中,可以解决此问题: 我的问题是,为什么Java中不允许这种行为?(特别是Java 5) 编辑:啊哈!谢谢大家。该死的现代IDE给出了模糊的错误消息。我已经开始打折了,这一次对我没有任何好处。(Netbeans警告我缺少括号和分号…)
问题内容: 问题是在Java中为什么不能定义抽象静态方法?例如 问题答案: 因为“抽象”的意思是:“不实现任何功能”,而“静态”的意思是:“即使没有对象实例也有功能”。这是一个逻辑上的矛盾。