程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java的Overriding與Overloading

Java的Overriding與Overloading

編輯:關於JAVA

1.Overriding

Overriding翻譯過來是“重寫/覆蓋”。 它是覆蓋了一個方法並且對其重寫,以求達到不同的作用。對我們來說最熟悉的覆蓋就是對接口方法的實現,在接口中一般只是對方法進行了聲明,而我們在實現時,就需要實現接口聲明的所有方法。除了這個典型的用法以外,我們在繼承中也可能會在子類覆蓋父類中的方法。

重寫的主要特點是:

1)方法名必須與被重寫方法一致。

2)方法參數列表必須與被重寫方法一致。

3)返回類型必須與被重寫方法一致。

4)重寫的方法不能降低原方法的"可見度"。

例如:被重寫方法為protected void do(int i,double d),則重寫方法可以為protected void do(int i,double d),或者public void do(int i,double d),但是不可以是private void do(int i,double d)。

5)不能拋出新的異常或者"更寬的"異常。

例如:被重寫方法為public void do(int i,double d) throws IOException,則重寫方法可以為public void do(int i,double d) throws IOException ,或者public void do(int i,double d) throwsddeeException(IOException的子類),但是不可以是public void do(int i,double d) throwsException,因為Exception是IOException的父類,比IOException"更寬"。

6)被覆蓋的方法不能為private,否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。

2.Overloading

Overloading,翻譯成“重載”。 它是指我們可以定義一些名稱相同的方法,通過定義不同的輸入參數來區分這些方法,然後再調用時,VM就會根據不同的參數樣式,來選擇合適的方法執行。

其特點是:

1)各重載的方法名一致。

2)各重載方法的參數列表不一樣(包括參數類型,參數個數,參數順序3項中的一項或多項)。

3)返回類型任意。(不能通過方法的返回值來區分重載方法。)

4)訪問控制符任意。(不能通過方法的訪問權限來區分重載方法。)

5)可以任意拋出自身的異常,而不管被重載方法。(不能通過拋出的異常來區分重載方法。)

Overloading是指“Two or more methods can have the same name if they have different numbers or types of parameters and thus different signatures. ”顯然,對重載的唯一要求就是參數列表必須改變,否則就不是重載了。

3.類型轉換中的重載

在一些情況下,Java 的自動類型轉換也適用於重載方法的自變量。例如,看下面的程序:

// Automatic type conversions apply to overloading.
class OverloadDemo {
  void test() {
    System.out.println("No parameters");
  }

  // Overload test for two integer parameters.
  void test(int a, int b) {
    System.out.println("a and b: " + a + " " + b);
  }

  // overload test for a double parameter
  void test(double a) {
    System.out.println("Inside test(double) a: " + a);
  }
}

class Overload {
  public static void main(String args[]) {
    OverloadDemo ob = new OverloadDemo();
    int i = 88;
    ob.test();
    ob.test(10, 20);
    ob.test(i); // this will invoke test(double)
    ob.test(123.2); // this will invoke test(double)
  }
}

該程序產生如下輸出:

No parameters

a and b: 10 20Inside test(double) a: 88Inside test(double) a: 123.2

在本例中,OverloadDemo 的這個版本沒有定義test(int) 。因此當在Overload 內帶整數參數調用test()時,找不到和它匹配的方法。但是,Java 可以自動地將整數轉換為double 型,這種轉換就可以解決這個問題。因此,在test(int) 找不到以後,Java 將i擴大到double 型,然後調用test(double) 。當然,如果定義了test(int) ,當然先調用test(int) 而不會調用test(double) 。只有在找不到精確匹配時,Java 的自動轉換才會起作用,而且總是找到參數類型最"匹配"的方法,即它的形參比實參“大”且是最“接近”的。

本文出自 “子 孑” 博客,請務必保留此出處http://zhangjunhd.blog.51cto.com/113473/20373

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved