没发生重写时
public class A { public static void test(){ System.out.println("A test"); } }
public class B extends A{ public static void test(){ System.out.println("B test"); } } public class Application { public static void main(String[] args) { B b = new B(); b.test(); //父类引用指向子类对象 A a = new B(); a.test(); } }
运行结果:
重写时:
public class A { public void test(){ System.out.println("A test"); } } public class B extends A{ public void test(){ System.out.println("B test"); } } public class Application { public static void main(String[] args) { B b = new B(); b.test(); //父类引用指向子类对象 A a = new B(); a.test(); } }
运行结果
原因分析:
静态方法不属于对象,当父类和子类test方法都为静态方法时,在编译时就分配内存,所以当用子类引用就执行子类的test,父类引用就执行父类的test。而当为非静态方法时,new一个子类对象时,在堆区开辟内存,保存子类test方法,无论是子类还是父类引用都执行这块内存。
总结:
-
重写需要有继承关系,子类重写父类的方法
-
方法名必须相同
-
参数列表必须相同
-
修饰符:范文可以扩大但不能缩小: Public>Protected>Default>Private
-
抛出的异常:范围可以被缩小,但不能扩大:ClassNotFoundException --> Exception(大)