就java中静态方法是否能够被重写进行讨论
前言
java是一门面向对象的语言,具有三大特点,封装,继承,多态,今天主要解决的是关于继承中重写的问题
在java中子类可以继承父类非私有的成员(成员变量,成员方法),不需要再去重新手写一遍代码,继承提高了代码的复用性,以及可维护性,同时也是多态的前提,但子类有时候不想要原封不动的使用父类的方法时,这个时候就用到了重写
在讲重写时,我们先讲一下重写(Override)的三个条件:
- 父类中的私有方法无法被重写(因为父类中的私有方法,子类根本无法继承,何谈重写)
- 子类重写父类的方法时,访问权限不能低于被重写的父类方法的访问权限
- 而且重写方法的发返回值类型必须和父类被重写方法的返回值类型一致,或者是子父类的
主题
探讨静态方法是否能够被重写
首先验证父类的静态方法是否能被继承
public class Demo_Static {
public static void main(String[] args) {
Son son = new Son();
son.staticMethod(); //输出staticMethod
Son.staticMethod(); //输出staticMethod
//证明静态方法是能够被继承的
}
}
class Father{
public static void staticMethod() {
System.out.println("staticMethod");
}
}
class Son extends Father {
}
其次,再验证静态方法是否能被重写
public class Demo_Static {
public static void main(String[] args) {
Father.staticMethod(); //staticMethod
Son.staticMethod(); //staticMethod-Children
/*
* 输出的结果证明类执行了自己声明的静态方法
* 实际上该子类只是将父类中同名的静态方法进行了隐藏,而非重写
* */
Father father = new Son();
father.staticMethod(); //staticMethod
/*
* 父类引用指向子类对象时,只会调用父类的静态方法
* 因为静态方法是类的方法和具体的对象没有关系,和直接调用类名一样,所以不会重写
* 静态方法是随着类加载进内存(方法区)的时候进行绑定的(编译时绑定),而方法的重写时在运行时绑定的
*
* */
}
}
class Father{
public static void staticMethod() {
System.out.println("staticMethod");
}
}
class Son extends Father {
public static void staticMethod() {
System.out.println("staticMethod-Children");
}
}
总结
父类的静态方法是不会被子类的静态同名方法所重写的,依据多态的父类引用指向子类对象,我们证明了这一点,普通的成员方法,在多态的情形下,会输出子类重写的方法,而静态方法的输出还是父类的静态方法,此外还了解到,静态方法的绑定是在编译时绑定的,而方法的重写是在运行时绑定的.
静态方法的运行只与类有关,是类的方法,而与具体的对象无关,记住多态的一句口诀
- 静态方法,左边编译,左边运行
- 成员方法,左边编译,右边运行
- 成员变量,左边编译,左边运行
新手上路如有错误之处,希望各位指点,谢谢大家