重载与重写的区别(以Java为例)

有时候,对某些概念问个所以然来会有助于我们对它的理解。它是什么(what)、为什么这样(why)和怎样用它(how)?这样的简单疑问会帮助我们由表及里和从感知上升到理论再回到实践的认识事物。学习计算机语言在此就更突出!下边是我在Java中对重载和重写的认识过程:

 

1 ,什么是重载, 什么是重写?
  重载(Overloading是一个类中方法 态性的一种表现,是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数、参数 类型和参数顺序
//Overloading.java
//下例反映了同名前提下的以上三种情况实现的类里边方法的重载
package com.gyc;
public class Overloading{
 
    public int f(int i) {
     return i;
    }   
    
    public String f(String s) {
     return s;
    }
    public void f(int i, String s) {
     
    }
    public void f(String s, int i) {
     
    }
}
  重写( Overriding) 父类与子类 间的多态性,对父类的函数进行重新定义。如果在子类中定义某   方法与其父类有相同的名称、参数和返回类型 ,我们说该方法被重写 (Overriding)

//Father.java

//

package com.gyc;

 

public class Father {
    public void f() {
     
    }
}

//Child.java

package com.gyc;

public class Child extends Father {
 
    public void f() {

    }

    public int f() {

    }

}

 

2. 为什么是这样?

1 方法重载 就是在类中可以创建多个同名并且参数列表不同(参数个数、类型和排序不同)的 方法 。调用方法时通过传递给它们的不同参数个数、参数类型或者不同的参数顺序 来决定具体使用哪个方法 , 这就是重载实现某个类自身方法的多态性。

  再看一下

 

 

public class Overloading{
 
    public int f(int i) {
     return i;
    }   
    
    public String f(String s) {
     return s;
    }
    public void f(int i, String s) {
     
    }
    public void f(String s, int i) {
     
    }
}

   在编写这些方法的时候,只要有相同的函数名编译器就看参数列表是否不同。参数列表相同的会出现Duplicate提示你复制了某个方法。列表不相同是重载则通过。
   返回值是不考虑的。我们 无法以返回型别作为重载函数的区分标准。
 public Class A {
     public void f() {
     }
     public int f() {
     }
//错误的,这会在调用函数的时候有歧义,编译器是不允许的,例如写
//f();不知道该谁
//说到底,函数名和参数列表相同表明这是同一个函数,看错误提示
//Duplicate f()”复制了f
}
(2)方法重写
 
   Java 子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不 动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又 称方法覆盖。
  若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表
则新方法将覆盖原有的方法。可以看出重写比重载有更严格的条件限制:在重载中函数名要相同参数列表要不同,返回值不考虑;而此时要求三项完全相同。例子见上!
   先看名字是否相同,如果名字不同则是不同函数(通过)。名字不同看参数列表,列表完全一样则强制返回值也要一样(即重写了父类方法)。列表不同则认为是类内方法重载。
   一个较全的既有类内方法重载又有重写父类的方法,我们最好在重写父类的那个方法上加一个@Override jdk1.5以后的,这会可以清晰看到那些做了重载,哪些做了重写!
public class Child extends Father {
 
 /*   public int  f() {
        return 1;
    }  
提示返回值要匹配父类的类型
*/
   @Override //加上此行
    public void f(){
       
    }
   
    public int f(int a) {
     return a;
    }
   
   
   
    public String f(String s) {
     return s;
    }
   
    public void f(int a, String s) {
     
    }
   
    public void f(String s, int a) {
     
    }
   
   
}
3 怎样用
   上边太罗嗦啦!一言以蔽之,在编写程序的时候往往需要某个动作可以处理不同的数据或情况,这时我们要利用重载 比如说,一个类有多个重载的构造方法。这样可以new 出不同数据的对象;而在子类继承父类实现代码重用的过程中,有时候子类并不想原封不 动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写
   根据2中的原理我们的思路就很很清晰的实现重载或重写。

你可能感兴趣的:(Java)