版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fanfanzk1314/article/details/79728690
public class StaticTest {
public static void main(String[] args) {
A a = new B();
a.f1();
a.f2();
}
}
class A {
public static void f1() {
System.out.println("hello! A");
}
public void f2() {
System.out.println("hello ! A");
}
}
class B extends A {
public static void f1() {
System.out.println("hello! B");
}
public void f2() {
System.out.println("hello! B");
}
}
运行结果是:
hello!A
hello!B
分析原因是:这里是有关覆盖和隐藏的问题
override即覆盖,这是对实例方法(instance method)而言的;子类与父类中形构相同的方法会override父类中的那个方法。“override覆盖”的前提是实例方法,只有实例方法在继承时才会出现override情况
hide 即隐藏,这是对类方法(class method)即static方法而言的。如果子类中定义了静态方法,则它会隐藏父类中形构相同的所有方法,但如果隐藏了父类中的实例方法,则会编译报错。其中需要注意的是child隐藏了parent的变量和方法,那么,child实例就不能访问parent中被隐藏的变量或者方法,但是,将child实例向上提升转换成parent,可以访问parent中被隐藏的变量或者方法了。修饰的方法不能实现多态,当然不需要被子类覆盖了(子类覆盖父类方法是为了实现多态)