国产精品V在线播放,免费AV网站,亚洲福利在线观看,国产成人亚洲综合网站小说,亚洲熟妇AV乱码在线观看,国产AV无码专区亚洲AV漫画,在线成人av,男女18禁啪啪无遮挡激烈网站
學習方法

java構造方法重載

時間:2022-10-01 00:57:41 學習方法

java構造方法重載

  JAVA 方法重載和構造函數重載【一】

  在Java 中,同一個類中的2個或2個以上的方法可以有同一個名字,只要它們的參數聲明不同即可。在這種情況下,該方法就被稱為重載(overloaded ),這個過程稱為方法重載(method overloading )。方法重載是Java 實現多態性的一種方式。如果你以前從來沒有使用過一種允許方法重載的語言,這個概念最初可能有點奇怪。但是你將看到,方法重載是Java 最激動人心和最有用的特性之一。

  當一個重載方法被調用時,Java 用參數的類型和(或)數量來表明實際調用的重載方法的版本。因此,每個重載方法的參數的類型和(或)數量必須是不同的。雖然每個重載方法可以有不同的返回類型,但返回類型并不足以區分所使用的是哪個方法。當Java 調用一個重載方法時,參數與調用參數匹配的方法被執行。

  下面是一個說明方法重載的簡單例子:

  // Demonstrate method overloading.

  class OverloadDemo {

  void test() {

  System.out.println("No parameters");

  }

  // Overload test for one integer parameter.

  void test(int a) {

  System.out.println("a: " + a);

  }

  // 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

  double test(double a) {

  System.out.println("double a: " + a);

  return a*a; }}

  class Overload {

  public static void main(String args[]) {

  OverloadDemo ob = new OverloadDemo();

  double result;

  // call all versions of test()ob.test();ob.test(10);ob.test(10,20);result = ob.test(123.25);System.out.println("Result of ob.test(123.25): " + result);

  }

  }

  該程序產生如下輸出:

  No parameters

  a: 10

  a and b: 10 20

  double a: 123.25

  Result of ob.test(123.25): 15190.5625

  從上述程序可見,test()被重載了四次。第一個版本沒有參數,第二個版本有一個整型參數,第三個版本有兩個整型參數,第四個版本有一個double 型參數。由于重載不受方法的返回類型的影響,test()第四個版本也返回了一個和重載沒有因果關系的值。

  當一個重載的方法被調用時,Java 在調用方法的參數和方法的自變量之間尋找匹配。但是,這種匹配并不總是精確的。在一些情況下,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 20

  Inside test(double) a: 88

  Inside 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 的自動轉換才會起作用。

  方法重載支持多態性,因為它是Java 實現“一個接口,多個方法”范型的一種方式。要理解這一點,考慮下面這段話:在不支持方法重載的語言中,每個方法必須有一個惟一的名字。但是,你經常希望實現數據類型不同但本質上相同的方法?梢詤⒖冀^對值函數的例子。在不支持重載的語言中,通常會含有這個函數的三個及三個以上的版本,每個版本都有一個差別甚微的名字。例如,在C語言中,函數abs( )返回整數的絕對值,labs( ) 返回long 型整數的絕對值( ),而fabs( )返回浮點值的絕對值。盡管這三個函數的功能實質上是一樣的,但是因為C語言不支持重載,每個函數都要有它自己的名字。這樣就使得概念情況復雜許多。盡管每一個函數潛在的概念是相同的,你仍然不得不記住這三個名字。在Java 中就不會發生這種情況,因為所有的絕對值函數可以使用同一個名字。確實,Java 的標準的類庫包含一個絕對值方法,叫做abs ( )。這個方法被Java 的math 類重載,用于處理數字類型。Java 根據參數類型決定調用的abs()的版本。

  重載的價值在于它允許相關的方法可以使用同一個名字來訪問。因此,abs這個名字代表了它執行的通用動作(general action )。為特定環境選擇正確的指定(specific )版本是編譯器要做的事情。作為程序員的你,只需要記住執行的通用操作就行了。通過多態性的應用,幾個名字減少為一個。盡管這個例子相當簡單,但如果你將這個概念擴展一下,你就會理解重載能夠幫助你解決更復雜的問題。

  當你重載一個方法時,該方法的每個版本都能夠執行你想要的任何動作。沒有什么規定要求重載方法之間必須互相關聯。但是,從風格上來說,方法重載還是暗示了一種關系。這就是當你能夠使用同一個名字重載無關的方法時,你不應該這么做。例如,你可以使用sqr這個名字來創建一種方法,該方法返回一個整數的平方和一個浮點數值的平方根。但是這兩種操作在功能上是不同的。按照這種方式應用方法就違背了它的初衷。在實際的編程中,你應該只重載相互之間關系緊密的操作。

  7.1.1 構造函數重載

  除了重載正常的方法外,構造函數也能夠重載。實際上,對于大多數你創建的現實的

  類,重載構造函數是很常見的,并不是什么例外。為了理解為什么會這樣,讓我們回想上一章中舉過的Box類例子。下面是最新版本的Box類的例子:

  class Box { double width; double height; double depth;

  // This is the constructor for Box.

  Box(double w,double h,double d) {width = w; height = h;depth = d;

  }

  // compute and return volume double volume() { return width * height * depth;}}

  在本例中,Box() 構造函數需要三個自變量,這意味著定義的所有Box對象必須給Box() 構造函數傳遞三個參數。例如,下面的語句在當前情況下是無效的:

  Box ob = new Box();

  因為Box( )要求有三個參數,因此如果不帶參數的調用它則是一個錯誤。這會引起一些重要的問題。如果你只想要一個盒子而不在乎 (或知道)它的原始的尺寸該怎么辦?或,如果你想用僅僅一個值來初始化一個立方體,而該值可以被用作它的所有的三個尺寸又該怎么辦?如果Box 類是像現在這樣寫的,與此類似的其他問題你都沒有辦法解決,因為你只能帶三個參數而沒有別的選擇權。

  幸好,解決這些問題的方案是相當容易的:重載Box 構造函數,使它能處理剛才描述的情況。下面程序是Box 的一個改進版本,它就是運用對Box構造函數的重載來解決這些問題的:

  /* Here,Box defines three constructors to initialize

  the dimensions of a box various ways.

  */

  class Box {

  double width; double height; double depth; // constructor used when all dimensions specified Box(double w,double h,double d) {

  width = w;

  height = h;

  depth = d;

  }

  // constructor used when no dimensions specified Box() { width = -1; // use -1 to indicate

  height = -1; // an uninitialized

  depth = -1; // box

  }

  // constructor used when cube is created Box(double len) { width = height = depth = len;}

  // compute and return volume double volume() { return width * height * depth;}}

  class OverloadCons {

  public static void main(String args[]) { // create boxes using the various constructorsBox mybox1 = new Box(10,20,15);Box mybox2 = new Box();Box mycube = new Box(7);

  double vol;

  // get volume of first box

  vol = mybox1.volume();

  System.out.println("Volume of mybox1 is " + vol);

  // get volume of second box

  vol = mybox2.volume();

  System.out.println("Volume of mybox2 is " + vol);

  // get volume of cube

  vol = mycube.volume();

  System.out.println("Volume of mycube is " + vol);

  }

  }

  該程序產生的輸出如下所示:

  Volume of mybox1 is 3000.0

  Volume of mybox2 is -1.0

  Volume of mycube is 343.0

  在本例中,當new執行時,根據指定的自變量調用適當的構造函數。

  Java方法的重載以及構造函數的理解【二】

  方法的重載有3個條件:

  1、函數位于同一個類下面;

  2、方法名必須一樣;

  3、方法的參數列表不一樣。

  比如有以下的例子:

  [java] view plain copyclass Student {

  void action(){

  System.out.println("該函數沒有參數!");

  }

  void action(int i)

  {

  System.out.println("有一個整形的參數!");

  }

  void action(double j)

  {

  System.out.println("有一個浮點型的參數!");

  }

  }

  該類中定義了3個方法,但是3個方法的參數列表不一樣;

  下面在主函數中調用這個類:

  [java] view plain copypublic class Test {

  /**

  * @param args

  * @author weasleyqi

  */

  public static void main(String[] args) {

  // TODO Auto-generated method stub

  Student st = new Student();

  st.action();

  st.action(1);

  st.action(1.0);

  }

  }

  看看運行結果:

  從控制臺的輸出可以看出,我在主函數中實例化一個student對象,分別調用了這個對象的3中方法,由于3個方法的參數不一樣,所以可以看到輸出的結果也不一樣;

  構造函數的使用:

  定義一個Sutdent類,類里面定義兩個屬性:

  [java] view plain copyclass Student {

  String name;

  int age;

  }

  此時的Student類中沒有構造函數,系統會自動添加一個無參的構造函數,這個構造函數的名稱必須和類的名稱完全一樣,大小寫也必須相同,系統編譯完了之后是以下的情況:

  [java] view plain copyclass Student {

  Student()

  {

  }

  String name;

  int age;

  }

  主函數中實例化兩個對象:

  [java] view plain copypublic class Test {

  /**

  * @param args

  * @author weasleyqi

  */

  public static void main(String[] args) {

  // TODO Auto-generated method stub

  Student st = new Student();

  st.name = "張三";

  st.age = 10;

  Student st2 = new Student();

  st2.name = "李四";

  st2.age = 20;

  }

  }

  從主函數可以看出,此時的Student對象的屬性比較少,創建的實例也比較少,如果屬性多再創建多個實例的話,這個代碼的量就很大,這時候,我們可以添加一個帶參數的構造函數,如下:

  [java] view plain copyclass Student {

  Student(String n, int a)

  {

  name = n;

  age = a;

  }

  String name;

  int age;

  }

  主函數的代碼如下:

  [java] view plain copypublic class Test {

  /**

  * @param args

  * @author weasleyqi

  */

  public static void main(String[] args) {

  // TODO Auto-generated method stub

  Student st = new Student("張三",10);

  Student st2 = new Student("李四",20);

  System.out.println("st的name:" + st.name +", st的age:" + st.age);

  System.out.println("st2的name:" + st2.name +", st的age:" + st2.age);

  }

  }

  此時系統運行的結果如圖:

  從運行結果可以看出,我們在實例化Student對象的時候,調用了帶參數的構造函數,節省了很多的代碼,要注意:如果我們在Student類中定義了一個帶參數的構造函數,但是沒有寫無參的構造函數,這個時候我們在主函數中就不能定義 Student st = new Student();如果在Student類中加上無參的構造函數就可以實現這樣的實例化。

【java構造方法重載】相關文章:

方法重載的條件09-23

什么是方法重載11-15

方法重載與覆蓋的區別11-04

方法重載和方法重寫的概念和區別09-06

方法重載和方法重寫的區別是什么11-16

java技術的學習方法10-07

Java學習方法有哪些10-06

安裝java jdk環境變量的方法10-05

JAVA程序員的學習方法指導10-07

汽車構造實習報告11-25

主站蜘蛛池模板: 国内精品久久久久影院蜜芽| 国产人无码a在线西瓜影音| 麻豆传媒在线| 国产综合久久久777777| 国产一区二区三区美女| 久久久2019精品视频中文字幕| 人妻体内射精一区二区| 溧阳市| 欧美成人免费全部| 精品国产国产2021| 久久躁日日躁AAAAXXXX| 玩弄放荡人妻少妇系列| 亚洲国产人成在线观看69网站| 无码熟妇人妻av在线影片| 日本二区视频在线观看| 国产福利姬喷水福利在线观看| 91小电影| 国产网红主播精品一区| 久久久精品熟妇丰满人妻99| 国产成人一区二区三区免费 | 国产日韩综合av在线| 亚洲一区二区不卡av| 无码成人一区二区三区| 可以免费看的天堂av| 人妻少妇精品中文字幕av| 99热在线只有精品| 日本少妇xxx做受| 国产xxxxx| 中文www天堂| 成人频道| 色一情一乱一伦一视频免费看| 亚洲精品国产成人无码区在线| 美国黄色片一区二区三区| 无码伊人久久大杳蕉中文无码 | 成在线人免费视频| 左权县| 人妻少妇精品系列| 午夜拍拍| av无码精品一区二区三区四区| 成人高h视频| 性无码一区二区三区在线观看|