国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

【黑馬程序員】-Java基礎學習-方法重載、構(gòu)造函數(shù)重載、方法重寫與多態(tài)

2019-11-14 15:26:05
字體:
供稿:網(wǎng)友

------- android培訓、java培訓、期待與您交流! ----------

 

一、方法以及方法重載
  首先我們要明確什么是方法,方法其實就是一段經(jīng)過封裝的有特定功能的代碼段。你可以用它來做特定的動作,比如在控制臺輸出一行字符串,給它兩個整數(shù)然后讓這段代碼替你將兩個整數(shù)進行相加。
  其次我們應該需要理解兩個概念。【形參】和【實參】。【形參】就是定義方法上的,用來接收外界傳給它的信息。在java中,你需要指定信息的類型,如果是整數(shù)就是int,如果是字符串類型就是String。字符串類型為什么是大寫字母開頭呢,因為字符串其實是一個類,在java中類的名稱約定為大寫首字母開頭。你給一段代碼傳遞的信息可能不止一個呀,如果需要傳兩個整數(shù)類型怎么辦,這個時候就用逗號隔開。比如:
1  public  int add(int a,int b){}

 

  這個時候就傳遞了兩個整數(shù)類型進去了,分別命名為a和b。這個時候方法里面就可以直接拿a和b開始用了。

  我們調(diào)用的時候就可以直接:

1 add(5,6);

  這樣我們就把整數(shù)5和整數(shù)6傳遞給了名字叫add方法的這個方法。5和6就是實際傳給add方法的參數(shù),也就是【實參】。通常情況下,我們可能傳入的是兩個變量。例如:

1 int x=6;2 int y=7;3 add(x,y);

  這個時候x和y就是實參了。分別對應的是add()方法的形參a和b。要注意一點,a和b跟x、y有什么關(guān)系呢?其實從名字上看是一點關(guān)系都沒有的,唯一有關(guān)系的就是他們的數(shù)據(jù)類型必須要一一對應。逗號前面,方法要求傳的是整數(shù)型,你調(diào)用這個方法的時候就必須傳遞一個整數(shù),后面如果要求傳遞一個數(shù)組,你就必須傳遞一個數(shù)組類型進去,否則就調(diào)用錯誤了。

  形參的命名a、b就是的意義就是給傳入的兩個信息命個名字。第一個我叫a,第二個我叫b。在方法體內(nèi)部我就可以直接調(diào)用了這兩個參數(shù)了。僅此而已。比如實參傳來的兩個整數(shù)型變量叫a、b形參也叫a、b,這個時候傳入的a、b和方法內(nèi)部的a、b一樣嗎?表面看一樣,其實傳入的a和b是方法外的兩個變量,方法內(nèi)部也把重新命名了兩個變量叫a和b來接收方法外的兩個變量。方法外的方法內(nèi)部的a和b占用了不同位置的內(nèi)存的。所以不是同一個東西。

  接著說,如果我需要把若干個整數(shù)進行相加。有的時候是兩個,有的時候是3個,有的時候我還要把5個數(shù)進行相加。這個時候我們需要命名不同的函數(shù)名嗎?Java提供了方法重載的功能。我們就用同一個函數(shù)名,需要傳兩個整數(shù)在函數(shù)名的小括號里面?zhèn)魅雰蓚€整數(shù)形參,需要傳三個就傳入三個整數(shù)形參。函數(shù)被調(diào)用的時候,你傳入了幾個實參,java就會去尋找能傳入幾個實參的那個函數(shù),然后把實參挨個傳過去就可以了。

  這樣在調(diào)用的時候會很方便。一個函數(shù)名就對應一種功能。如果是兩個都需要傳入兩個整數(shù)類型的函數(shù),他們的區(qū)別只是返回值不同,這是不算方法重載的,這樣會報錯。因為java會認為他們是同一個功能的函數(shù)。簡單的說,java看兩個方法是不是重復只看形參的類型和個數(shù),不管該方法的返回值。

  下面是一個完整的代碼實例:

 

 1 package blog; 2  3 public class Overloaddemo { 4      5     public  int add(int a,int b){ //傳入兩個整數(shù)形參 6         return a+b; 7     } 8      9     public int add(int a,int b,int c){  //傳入三個整數(shù)形參10         System.out.PRintln(add(a,b));  //重載的方法中調(diào)用了兩個整數(shù)形參的同名方法11         return a+b+c;12     }13     14     public static void main(String[] args) {15         Overloaddemo test=new Overloaddemo();16         int result=test.add(1,2);17         System.out.println(result);18         19         int result2=test.add(1,3,4);20         21         //System.out.println(result);22         System.out.println(result2);23     }24 25 }

 

  結(jié)果是:

 3 4 8

 二、構(gòu)造方法及構(gòu)造方法重載

  構(gòu)造方法是用于完成對象屬性的初始化工作的。你在調(diào)用一個類的方法或者變量,如果不是類的靜態(tài)成員的話,你首先需要new一個對象,也就是根據(jù)這個類初始化一個對象。只要你new了一個對象,構(gòu)造方法就運行了。如果你沒有在類文件中寫該類的構(gòu)造方法,java編譯器會自動給這個類加上構(gòu)造方法,該構(gòu)造方法的形參為空切方法體也是空的。
  但是你自己主動在類中創(chuàng)建了一個該類的構(gòu)造方法,那么java編譯器就不會再添加這個空的構(gòu)造方法了。
  現(xiàn)在自己怎么在類中主動創(chuàng)建一個構(gòu)造方法呢?
  先來段標準的代碼:
 
1  class Demo{2       public Demo(int i){}3   }

  可以看出:【1】構(gòu)造方法的名字必須和類名完全一樣。因為java是區(qū)分大小寫的,所以大小寫也不能寫錯。

       【2】構(gòu)造函數(shù)沒有返回值,也不能寫void。

  我們是無法像調(diào)用類其他成員方法一樣調(diào)用類的構(gòu)造構(gòu)造方法的。構(gòu)造方法的運行是通過new關(guān)鍵字創(chuàng)建一個對象的時候,java會自動調(diào)用它為對象進行初始化。

  構(gòu)造函數(shù)的重載其實跟方法重載差不多,也是在同一個類中因構(gòu)造函數(shù)的形參類型和個數(shù)不同構(gòu)成了重載。new該對象的時候,根據(jù)new class()括號中的參數(shù)類型和個數(shù)不同,調(diào)用不同的構(gòu)造函數(shù)。一個類中不同的構(gòu)造函數(shù)之間是可以互相調(diào)用的。也就是只要能遵循初始化一個對象只能一開始就初始化,且只能一次的原則就可以了。

  我們?nèi)绻谝粋€構(gòu)造方法中調(diào)用另一個構(gòu)造方法,那么可以使用this()的方式,this()括號中的參數(shù)為構(gòu)造方法的參數(shù)。也可以省略寫。從用this可以看出,構(gòu)造函數(shù)不是類的靜態(tài)成員。

  對構(gòu)造方法進行調(diào)用時,對new的使用特點:

    【1】調(diào)用時,后面的小括號()表示構(gòu)造方法的參數(shù)列表,如果構(gòu)造方法不接收參數(shù),那么小括號可以為空;
    【2】如果構(gòu)造方法接收參數(shù),那么小括號中的實際參數(shù)就需要和構(gòu)造方法定義中的形式參數(shù)保持一致(一致條件為:參數(shù)數(shù)量一致、參數(shù)類型一致、按相應的順序排列逐一賦值)。
  下面是完整的代碼:
 1 package blog; 2  3 public static void main(String[] args) { 4         //通過new初始化一個對象調(diào)用了空參的構(gòu)造函數(shù) 5         new Gouzaofangfa(); 6     } 7      8     public Gouzaofangfa(){ 9           //空參的構(gòu)造函數(shù)調(diào)用了一個參數(shù)的構(gòu)造函數(shù)10         this(3);    11     System.out.println("test");12    } 13 14    public Gouzaofangfa(int i){15      System.out.println(++i); 16    } 17 18  }

 

結(jié)果是:

4test

 三、方法重寫與多態(tài)

  在java中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時子類并不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要采用方法的重寫。也常叫做方法覆蓋。

  多態(tài)有兩種表現(xiàn)形式,分為重載和覆蓋。現(xiàn)在講的就是方法覆蓋。

  先看看代碼:

 1 package blog; 2  3 public class DemoPolymorphism{    //演示多態(tài) 4     public static void main(String[] args){ 5         Son s1=new Son(); 6         s1.work(); 7          8         // 子類繼承父類,子類擁有父類所有的功能,因此可以把子類傳給父類 9         Dad s2=new Son();10         s2.work();            //調(diào)用了父類的工作方法,但是傳遞的是兒子對象,兒子對象既是父類對象也是子類對象,兒子的工作是碼代碼11         12         Dad s3=(Dad)s1;13         s3.work();            //把子類對象強轉(zhuǎn)成父類對象,就相當于化妝成了父親,但是讓其工作還是只會碼代碼14         15         s1.show();            //調(diào)用了子類的show方法,展示的是其父類的工作方法,設計房子16         17     }18     19 20 }21 22 class Son extends Dad{23     //兒子繼承了父類,因為兒子的工作是寫代碼,所以重寫了父類的work方法。這個叫方法重寫24     public void work(){25         System.out.println("兒子在工作:碼代碼");26     }27     28     public void show(){29         super.work();    //調(diào)用了父類的工作方法,會輸出了父類的工作方法,設計房子30     }31 }32 33 class Dad{34     //爸爸的工作內(nèi)容是設計房子35      void work(){36         System.out.println("爸爸在工作:設計房子");37     }38 }

   子類重寫了父類的工作方法,因為子類的工作是碼代碼,父類是設計房子。子類的對象屬于子類類型也屬于父類類型。

  再來一個多態(tài)的例子。

 1 abstract class Animal 2 { 3     abstract void eat(); 4 } 5  6 class Cat extends Animal 7 { 8     public void eat() 9     {10         System.out.println("吃魚");11     }12     public void catchMouse()13     {14         System.out.println("抓老鼠");15     }16 }17 18 class Dog extends Animal19 {20     public void eat()21     {22         System.out.println("吃骨頭");23     }24     public void kanJia()25     {26         System.out.println("看家");27     }28 }29 30 class DuoTaiDemo31 {32     public static void main(String[] args)33     {34         function(new Cat());35         function(new Dog());36         37         Animal a = new Cat();//向上轉(zhuǎn)型38         a.eat();39         40         Cat c = (Cat)a;//向下轉(zhuǎn)型41         c.catchMouse();42         43         44     }45     46     public static void function(Animal a)47     {48         a.eat();49         //用于子類型有限50         //或判斷所屬類型進而使用其特有方法51         if(a instanceof Cat)52         {53             Cat c = (Cat)a;54             c.catchMouse();55         }56         else if(a instanceof Dog)57         {58             Dog c = (Dog)a;59             c.kanJia();60         }61     }62     63     64 }    

  這個例子就把多態(tài)用途展現(xiàn)得很充分了。其中定義了一個方法,只要拋入的是動物類型,我就會調(diào)用其吃的方法。拋入狗就會啃骨頭,拋入貓就會吃魚。但是要注意的是,這個方法不能含有直接調(diào)用動物類型非公有的方法,也就是抽象類中不存在的方法。否則就會出錯誤。就好像拋入貓,就不能在方法中調(diào)用其看家的方法,否則就會出錯,即使是狗也不行,因為動物類型沒有這個共性的方法,你要調(diào)用,你必須強制轉(zhuǎn)型成狗的類型。這個時候你就可以調(diào)用看家的方法了。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 黑山县| 托克逊县| 会宁县| 海阳市| 会昌县| 子洲县| 莆田市| 盖州市| 涡阳县| 义乌市| 娄底市| 梁河县| 志丹县| 喀喇| 威信县| 扬中市| 酒泉市| 叙永县| 府谷县| 大连市| 华坪县| 吉水县| 蒙自县| 本溪市| 宝山区| 安岳县| 龙胜| 棋牌| 秦皇岛市| 磴口县| 北海市| 阿拉善右旗| 丰镇市| 子洲县| 若尔盖县| 额敏县| 九龙县| 荆州市| 五原县| 奉贤区| 肇源县|