静态域和静态方法是否可以被继承?是否可以被重写?以及原因

145 阅读1分钟

由于刚使用掘金懒得琢磨,运行结果就直接打出来了,没有插图大家可以自己跑一遍

//SuperDemo.java
public class SuperDemo {
    public static int a=5;
    public static void print(){
        System.out.println("父类中的静态方法");
    }
}
//SonDemo.java
public class SonDemo extends SuperDemo { }
//Run.java
public class Run {
    public static void main(String[] args) {
        SonDemo.print();
        System.out.println(""+SonDemo.a);
    }
}
//result:
//父类的静态方法 
//5

可见,静态域和静态方法是可以被继承的,子类能继承父类的所有方法(不包含构造方法,构造方法只能显式和隐式调用)和数据域,但是不能调用private的。

利用多态下的方法的动态绑定来说明static域和方法能否被重写。

//SuperDemo.java
public class SuperDemo {
    public static int a=5;
    public static void print(){
        System.out.println("父类中的静态方法");
    }
}
//SonDemo.java
public class SonDemo extends SuperDemo {
    public static int a=6;
    public static void print(){
        System.out.println("子类中的静态方法");
    }
}
//Run.java
public class Run {
    public static void main(String[] args) {
        SuperDemo one=new SonDemo();
        one.print();
        System.out.println(""+one.a);
    }
}
//result:
//父类的静态方法 
//5

  重写和隐藏的区别是:"重写"后子类的优先级要高于父类的优先级,但是“隐藏”是没有这个优先级之分的。

  静态域、静态方法和非静态域都可以被继承和隐藏而不能被重写,因此不能实现多态,不能实现父类的引用可以指向子类的对象时的动态绑定。非静态方法可以被继承和重写,因此可以实现多态。

总结:

  • 静态域和静态方法可以被继承。
  • 静态方法和静态域不可以被重写,不能实现多态。