演示
package com.mxx.demospring.demo;
public class Son extends Father{
@Override
public void m02() {
System.out.println("son m02");
}
public static void m01() {
System.out.println("son m01");
}
public static void main(String[] args) {
Father son = new Son();
/**
* 子类重写父类普通方法,体现了多态性
*/
son.m02(); // son m02
/**
* 结论:
* 父类引用指向子类对象时,只会调用父类的静态方法。
* 父类和子类中含有的其实是两个没有关系的方法,它们的行为也并不具有多态性。
* */
son.m01(); // father m01
/**
* 结论:
* 类执行了自己申明的静态方法。
* 该子类实际上只是将父类中的同名静态方法进行了隐藏,而非重写。
* */
Son.m01(); // son m01
}
}
结论:
- 在Java中静态方法可以被继承,但是不能被覆盖,即不能重写。
- 如果子类中也含有一个相同的静态方法,那么该子类实际上只是将父类中的该同名方法进行了隐藏,而非重写。
- 父类引用指向子类对象时,只会调用父类的静态方法。所以,它们的行为也并不具有多态性
java中不能被重写的方法
- final 修饰的
- static 修饰的
- private 修饰的:因为私有的在子类中不可见
- 如果跨包的话,修饰符缺省的也不能被重写,因为缺省的挎包不可见
参考:
https://www.cnblogs.com/vcgo/p/10459352.html
https://www.cnblogs.com/xhwy-1234/p/12517692.html