方法重载和方法重写--java

0. 什么是方法?

  方法是指java类中定义的一段代码体,实际上与c语言中的函数并无不同。方法的基本组成部分包括返回值、方法名称、参数和方法体,下面是一个方法最基本的形式:

1 返回值类型 方法名称(参数列表){
2   方法体
3 }

 

1.方法重载(overloading)

  方法重载是指在同一个类中,两个或两个以上方法的方法名称相同但它们的参数(包括参数类型、参数个数和参数顺序)不同。这样,在调用该方法时,根据传入的参数不同,执行的具体逻辑不同。

  下面的代码是方法重载的几种例子:

void A(){逻辑1;}
void A(int i){逻辑2;}//与逻辑1相比,参数个数不同
void A(String s){逻辑3;}//与逻辑2相比,参数类型不同
void A(int i,String s){逻辑4;}//
void A(String s,int i){逻辑5;}//与逻辑4相比,参数顺序不同
int A(String s,String str){逻辑6;}//方法重载时,返回值类型可以变化,但是参数必须跟其他方法不同,否则编译报错

#错误示范:下行代码与第1行冲突,编译会报错
//int A(){逻辑6}

  注意点:

  (1)一个方法可以被重载无数次;

  (2)构成重载的各个方法之间唯一要求的不同就是参数必须不同,返回值类型、访问修饰符、抛出异常等其他因素可以相同,也可以不同;

  (3)在继承时,子类也可以重载基类的方法。

 

2.方法重写(overriding)

  方法重写,又被称为方法覆盖。重写是指子类方法与父类方法的返回值类型、方法名称和参数(参数个数、参数顺序和参数类型)完全一致。当调用一个声明为基类类型的子类对象的重写方法时,java虚拟机能够根据该对象的实际类型执行指定的重写版本(eg.当某个基类拥有多个子类并且某个基类方法被多个基类重写时)。

  重写实例:在下面的代码中,在同一目录下创建了三个java文件:Base.java,Sub.java和Test.java。其中,Base.java中创建了Base类,Base类中只有一个方法A;Sub.java通过继承Base类创建了Sub类,并在Sub类中重写了Base类的A方法;最后,在Test.java中的main方法中创建了一个Sub对象eg,并且eg被声明为Base类型。调用对象eg的A方法,通过输出结果,可以看出java虚拟机在运行第15行代码时执行的是Sub类中的A方法,而不是Base类中的A方法。

  值得注意的是,在编译下面的代码第15行时java编译器并不知道eg的确切类型,因此通常会期望它的编译结果是调用基类(即Base类)的A方法,而在运行时java虚拟机提供的多态机制会保证调用的是Sub类的A方法(如需了解多态,请阅读封装、继承、多态--java第3部分)。

 1 //Base.java:基类
 2 public class Base{  
 3   public void A(){System.out.println("This is Base Class.");)}    
 4 }
 5 
 6 //Sub.java:子类
 7 public class Sub extends Base{
 8   public  void A(){System.out.println("This is Sub Class.");}
 9 }
10 
11 //Test.java:多态测试
12 public class Test{
13   public static void main(String[] args){
14     Base eg = new Sub();
15     eg.A();
16   }    
17 }

//输出结果
This is Sub Class.

3.总结

  3.1 二者与多态的关系

  重载与多态无关,重写方法的正确运行需要多态机制的支持

  3.2 二者区别

  重载和重写的最大区别在于重载是针对一个方法、不同参数的多个版本,而重写是针对一个方法、相同参数、相同返回值类型但是不同类型(多个子类和基类中)的多个版本。换句话说,重写后的方法与重写前的方法除了所处的java类不同外其他(返回值类型、抛出异常、参数、方法名称等)均相同,而重载的方法之间唯一的强制要求就是方法名相同且参数不同,其他(返回值类型、抛出异常、参数、方法名称等)可以相同,也可以不同。

 

posted @ 2018-02-24 14:15  赵庆-BUPT  阅读(291)  评论(0编辑  收藏  举报