在Java的继承机制中,提供了方法的重载和重写(覆盖),在日常学习和笔试面试时常常容易混淆,因此,下面我们一起讨论下,有不足给我发评论,立即修改。
1.方法的重载
方法的重载必须满足一下条件:
*方法名相同
*方法的参数类型、个数、顺序至少有一项不相同
*方法的返回类型可以不相同
*方法的修饰符可以不相同
2.方法的覆盖(重写)
1.子类的方法的名称、参数类型和返回类型与父类的方法的名称、参数类型和返回类型一致。
2.子类方法不能缩小父类方法的访问权限。
3.子类方法不能抛出比父类方法更多的异常。
4.方法的覆盖(重写)只能存在于子类和父类(包括直接父类和间接父类)之间,在同一个类中方法只能被重载,不能被覆盖(重写)。
5.父类的静态方法不能被子类覆盖(重写)为非静态的方法。
6.子类可以定义与父类静态方法同名的静态方法,以便在子类中隐藏父类的静态方法,在编译时,子类定义的静态方法也必须满足与方法覆盖(重写)类似的约束。
7.父类的静态方法不能被子类覆盖(重写)为非静态方法。
8.父类的私有方法不能被子类覆盖(重写)。
9.父类的抽象方法可以通过两种途径覆盖(重写):一是子类实现父类的抽象方法;二是子类重新声明父类的抽象方法。
10.父类的非抽象方法可以覆盖(重写)为抽象方法。
3.方法覆盖(重写)和方法重载具有以下不同点:
*方法覆盖(重写)要求参数签名必须一致,而方法重载要求参数签名必须不一致
#
*方法覆盖(重写)要求返回类型必须一致,而方法重载对此不做限制
*方法覆盖(重写)只能用于子类覆盖(重写)父类的方法,方法重载用于同一个类的所有方法(包括从父类中继承而来的方法)。
*方法覆盖(重写)对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这力面没有任何限制。
*父类的一个方法只能被子类覆盖(重写)一次,而一个方法在所在的类中可以被重载多次。
方法的重载的小例子:
package Work; public class Test002 { public static void main(String[] args) { System.out.println(add(3)); System.out.println(add(3,4)); System.out.println(add(3.1,4.2)); } public static int add(int a,int b){ return a+b; } //一下为方法的重载分别为参数类型不同,参数个数不同 public static float add(float a,float b){ return a+b; } public static double add(double a,double b){ return a+b; } public static double add(double a){ return a; } }
程序运行的结果为:
总结:方法的重载都在一个类中,同类中的同名方法都为方法的重载。
方法的重写(覆盖)的小例子:
下面为父类的代码(注意printMessage()方法):
package Work; public class Father { private String name ; public String getName() { return name; } public void setName(String name) { this.name = name; } public void printMessage(){ System.out.println("我是Father类中的方法!!"); } }
下面是子类的代码(仅含有从父类继承过来的东西和对pringMessage()方法的重写):
package Work; public class Son extends Father{ public void printMessage(){ System.out.println("我是Son类中的方法!!!"); } }
下面是我写的一个测试程序:
package Work; public class Text { public static void main(String[] args) { Father son = new Son(); son.printMessage(); Father fat = son;//此为Java中的多太 fat.printMessage(); } }
程序的运行结果又是什么呢????
怎么能够然程序执行父类的printMessage()方法呢????
程序代码:
package Work; public class Text { public static void main(String[] args) { Father son = new Son(); son.printMessage(); Father fat = son;//此为Java中的多太 fat.printMessage(); fat = new Father(); fat.printMessage(); } }
程序的运行结果:
总结:在父子类之间的同名方法,一般都为方法的重写(覆盖),如果方法的参数类型、个数和顺序都相同则一定是方法的重写(覆盖)。