Java 重写(Override)与重载(Overload)
重写(Override)是指子类定义了一个与其父类中具有相同名称、参数列表和返回类型的方法,并且子类方法的实现覆盖了父类方法的实现。
重写使得子类能够根据需要实现父类的方法,在使用子类对象调用该方法时,将执行子类中的方法而不是父类中的方法。
方法的重写规则
1、重写的方法必须具有与被重写方法相同的参数列表。因此,首先要确保参数列表的匹配程度。
2、虽然Java 5及更早版本要求返回类型必须相同,但Java 7及更高版本允许返回类型不同,但必须是父类返回值的派生类。因此,在重写方法时要考虑返回类型的兼容性。
3、子类中重写的方法的访问权限不能比父类中被重写方法的访问权限更低。例如,如果父类的方法是public的,那么子类中重写的方法不能声明为protected。
4、只有非final的方法才能被重写,因此要确保被重写的方法不是final。
5、重写的方法能够抛出任何非强制异常,但不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常。
6、静态方法和私有方法不能被重写,只能被再次声明。因此,在考虑重写时,这些方法不需要考虑在内。
7、子类和父类在同一个包中或不同包中会影响能否重写方法的访问权限。
8、构造方法不能被重写,因此不需要考虑在内。
示例:
class Animal{ public void iii(){ System.out.println("动物"); } } class Dog extends Animal{ public void iii(){ System.out.println("狗"); } } public class Ice{ public static void main(String args[]){ Animal a = new Animal(); // Animal 对象 Animal b = new Dog(); // Dog 对象 a.iii();// 执行 Animal 类的方法 b.iii();//执行 Dog 类的方法 //b属于Animal类型,但是它运行的是Dog类的move方法。 } }
Super 关键字的使用
在一般情况下,当需要在子类中调用父类的被重写方法时,通常会使用 super 关键字。这样做可以确保调用的是父类的方法而不是子类的方法。
class animal{ public void a() { System.out.println("sleep"); } } class dog extends animal { public void a() { //super.a(); //由于没有使用super,因此不调用父类方法 System.out.println("dog"); } } public class Ice{ public static void main(String args[]) { animal b=new dog();//dog对象 b.a(); } }
调用了父类的方法:
重载(Overload)
重载(Overloading)是Java中一种编程技术,它允许在同一个类中定义多个方法,这些方法具有相同的名称,但参数列表不同的情况。在重载的方法中,参数列表的个数、类型或顺序必须不同。
重载规则:
1、被重载的方法必须改变参数列表(参数个数或类型不一样);
2、被重载的方法可以改变返回类型;
3、被重载的方法可以改变访问修饰符;
4、被重载的方法可以声明新的或更广的检查异常;
5、方法能够在同一个类中或者在一个子类中被重载。
6、无法以返回值类型作为重载函数的区分标准。
示例:
public class Ice { //在Ice类中定义多个方法,这些方法具有相同的名称,但参数列表不同 public int test(){ return 0; } public void test(int a){ System.out.println(a); } public String test(int a,String s){ return "s1"; } public String test(String s,int a){ return "s2"; } public static void main(String[] args){ Ice o = new Ice(); System.out.println(o.test()); o.test(1); System.out.println(o.test(1,"Ice")); System.out.println(o.test("Ice",1)); } }
重写与重载之间的区别
重写是父类与子类之间多态性的一种表现,而重载是多态性的具体表现形式之一。
区别点 重载方法 重写方法
参数列表 必须修改 一定不能修改
返回类型 可以修改 一定不能修改
异常 可以修改 可以减少或删除,一定不能抛出新的或者更广的异常
访问 可以修改 一定不能做更严格的限制(可以降低限制)