------- android培訓、java培訓、期待與您交流! ----------
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)造方法重載
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 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)用看家的方法了。
新聞熱點
疑難解答