Override是子类与父类多态性的表现。
关于Override需要注意几点地方:
1.被覆盖方法的访问控制级别可以不一样。
但子类的访问级别必须要高于父类被覆盖方法的访问级别,如果父类是public的而子类是protected的则是错误的。
2.方法被定义为private或static或final的则不能被覆盖。
3.方法的返回类型:子类的返回类型可以是更具体的对象,例如可以将Employee类的返回类型改为Object也正确。而倒过来则错误。
4.在方法调用时先会在子类中找覆盖的方法,如果子类中没有则会在父类中去找。
然后让我们看一个坑爹的例子:
package learn; public class Parent { private int num(int i,int j){ return i+j; } public static void main(String[] args) { Parent p = new Child(); System.out.println(p.num(1, 2)); } } class Child extends Parent{ public int num(int x,int y){ return x-y; } }
得出的结果是:3
因为Parent中的num()方法是私有函数,所以Child类中的num()并不是继承Parent中的num()方法。
而p的的类型是Parent,因此调用p的num()时,使用的是父类的num()方法。
那如果将p的构造方法替换一下
Child p = new Child();
这时得到的结果是:-1
如果将父类中num()方法的修饰符给修改一下
package learn; public class Parent { protected int num(int i,int j){ //这里 return i+j; } public static void main(String[] args) { Parent p = new Child(); //和这里 System.out.println(p.num(1, 2)); } } class Child extends Parent{ public int num(int x,int y){ return x-y; } }
因为父类中num()方法的修饰符变成了protected,这样子类就能覆盖父类中的方法,
因此在调用时会优先调用子类的方法。
得到的结果是:-1