李娜
摘 要
面向对象编程有三大特性:封装、继承、多态,本文主要谈谈其中之一多态的两种实现方式——方法重载与方法覆盖,并比较它们的异同。
【关键词】Java 多态 方法重载 方法覆盖
在Java语言的学习过程中,初学者经常分不清重载与覆盖,实际上,方法重载(Overload)和方法覆盖(Override,也叫重写)都是Java多态性的体现,只是形式不同,在此,笔者简单地谈一谈两者的异同。
1 方法重载与方法覆盖的特点
1.1 方法重载的特点
Java语言中的方法重载就是在类中可以创建多个方法,实际上就是一个类中多态性的一种表现,也叫静态多态。
如下面的例子:
1 class DBUtil{
2 private String server="127.0.0.1";//服务器地址
3 private String db="HRDB";//数据库名称
4 public String getDBUrl(String server,String db){//重载方法
5 return "jdbc:sqlserver://"+server+":1433; DatabaseName="+db;
6 }
7 public String getDBUrl(String server){ //重载方法
8 return getDBUrl(server,db);
9 }
10 public String getDBUrl(){//重载方法
11 return getDBUrl(server,db);
12 }
13 }
14 public class StaticPolymorphismDemo {
15 public static void main(String args[]) {
16 DBUtil util=new DBUtil();
17 //调用第4行的方法
18 System.out.println(util.getDBUrl("192.168.4.23","CXHR"));
19 //调用第7行的方法
20 System.out.println(util.getDBUrl("192.168.4.23"));
21 //调用第10行的方法
22 System.out.println(util.getDBUrl());
23 }
24 }
方法重载的主要特点有以下几点:第一个特点是方法名是相同的;第二个特点是方法的个数、顺序、参数类型至少有一项是不相同的;第三个特点是方法的返回类型不一定要是相同的;第四个特点是方法的修饰符也可以是不相同的。
1.2 方法覆盖的特点
Java语言中的方法覆盖是指父类中有的方法,在子类中被重新定义,方法签名一样(方法名,参数个数和参数类型都一样)的情况,也叫动态多态。
如下面的例子:
public class Base {
public void method() {}
}
public class Sub extends Base{
public void method() {}
}
方法覆盖的特点主要有以下几点:第一个特点是方法覆盖只存在于子类和父类之间,在同一个类中的方法不能被覆盖;第二个特点是父类方法抛出的异常可以比子类方法更多; 第三个特点是父类方法的名称、参数签名和返回类型与子类方法的是一致的; 第四个特点是子类是不允许将父类的静态方法覆盖为非静态方法,父类的非静态方法也不能被子类覆盖为静态方法;第五个特点是子类方法不能缩小父类方法的访问权限;第六个特点是子类不能覆盖父类的私有方法;第七个特点是子类可以通过两种途径覆盖父类的抽象方法:一种是子类实现父类的抽象方法,另一种是子类重新声明父类的抽象方法;第八个特点是父类的非抽象方法可以被覆盖为抽象方法。
2 方法重载与方法覆盖的异同
2.1 方法重载与方法覆盖的相同点
Java语言中,方法重载与方法覆盖的主要相同点有两个:第一个相同点是法重载与方法覆盖都要求方法同名;第二个相同点是方法重载与方法覆盖在抽象方法和非抽象方法之间都可以使用。
2.2 方法重载与方法覆盖的不同点
Java语言中,方法重载与方法覆盖的主要不同点有以下5个:第一个不同点是方法重载不允许参数签名一致,相反,方法覆盖则要求参数签名必须一致;第二个不同点是方法重载对返回类型是否一致不做限制,而方法覆蓋则要求返回类型必须一致;第三个不同点是方法重载可以用于同一个类的所有方法,而方法覆盖则仅限于用于子类覆盖父类的方法;第四个不同点是方法重载对方法的访问权限和抛出的异常方法不做限制性要求,而方法覆盖对此则有特殊的要求;第五个不同点是一个方法在所在的类中可以多次重载,而父类的一个方法则只能被子类覆盖一次。
总之,方法的重载(Overload)和覆盖(Overrid)是Java多态性的不同表现。重载(Overload)是一个类中多态性的一种表现,而覆盖(Overrid)是父类与子类之间多态性的一种表现。灵活地运用方法重载与方法覆盖,不仅能减少编码的工作量,也能大大提高程序的可维护性及可扩展性。
参考文献
[1]姜静思.Java中类的多态性分析[J].科技展望,2015(01).
[2]阳小兰,钱程.JAVA语言中构造方法的继承与重载探讨[J].电脑知识与技术,2010(21).
[3]李宁.Java中的方法重写与方法重载[J].科技信息,2009(03).