Java基礎之函數、數組
一、函數:定義在類中的具有特定功能的一段獨立小程序,也稱方法。函數就是提高代碼的複用性的方式體現之一。功能是由函數來體現。
主函數main保證了類的獨立運行。
函數的格式:
修飾符 返回值類型 函數名(參數類型 形式參數1,參數類型 形式參數2,----)
{
執行語句;
return 返回值;
}
返回值類型:函數運行後的結果的數據類型。
參數類型:是形式參數的數據類型。
形式參數是一個變量,用於存儲調用函數時傳遞函數的實際參數。
實際參數:傳遞給形式參數的具體數值。
返回值:該函數運算後的結果,該結果會返回給調用者。
Return 的作用:1、將具體的結果返給調用者。2、結束了該功能(函數)
Return可以寫多條,滿足某一種條件後會結束功能。例
public static int show(boolean b)
{
if (b)
return 100;
else
return 0;
}
Return結束函數功能應用
public static void show(int age)
{
if (age <0)
{
System.out.println("數值非法");
return;
}
System.out.println(age);
return;
}
而return在單獨存在時,下面不能有語句,這和break、continue是類似的。
功能定義一般都有結果,若功能沒有具體的結果,這是返回值類型在java中就用void關鍵字來表示。
如果函數的返回值類型是void,那麼函數中的return語句是可以省略不寫的。如main函數也是函數,結尾處肯定有return語句,只是其返回值類型是void,省略不寫罷了。
如果函數有具體的返回值類型,那麼必須寫return語句以及具體的返回值。
函數之間是並列關係,但無論函數怎樣排列,都是從主函數開始。主函數是第一個壓棧。
函數內是不可以定義函數的,只可調用函數。
注意:不要把代碼都寫在主函數內,只要是功能,都可用函數來體現,主函數只用來調用已定義的功能,讓該功能運行起來。
函數的返回值類型和參數是沒有關係的。
函數定義時注意的事項:定義功能,功能中需要什麼就定義什麼,但是不需要的就不要定義,以免畫蛇添足。至於功能結果,調用者怎麼操作與我們無關,功能中不要去體現。
輸出語句中,必須是運算完有具體結果數據的函數纔可以被輸出。若println(A函數)而A函數的返回值類型是void,則會編譯失敗。
爲驗證定義的功能是否可用,可定義一個主函數來運行檢驗。
例如:定義一個功能。來簡化打印字符串的輸出語句。
class SopDemo
{
public static void main(String[] args)
{
sop("fuck");
}
public static void sop(String str)
{
System.out.println(str);
}
}
二、定義功能的技巧:1、明確該功能的結果是什麼,即明確要定義的Java函數的返回值類型。2、明確該功能是否需要未知內容來參與運算,即明確Java函數的參數列表(參數的個數,參數的類型)注意,函數參數列表裏的參數是有順序的。
練習1、定義一個功能,獲取兩個整數之間最大的那個。
思路:1、明確功能結果。是一個整數 int。
2、明確未知內容。是兩個不確定的整數。有兩個整型參數。
3、獲取最大值就要通過比較來完成,if語句。
4、通過return語句返回最大值。
public static int getmax(int a,int b)
{
if (a>b)
return a;
return b;
(return a>b?a:b;)代碼的簡單優化
}
練習2、定義一個功能,判斷兩者是否相等
思路:1、結果:用boolean類型表示
2、未知內容:兩個整數
public static boolean isEquals(int a,int b)
{
return a==b?true:false;(代碼優化return a==b;)
}
三、函數的內存運行過程
執行主函數時,主函數就會進棧,會在棧內存中劃分一片空間,名稱叫main,然後逐條執行main的執行語句,執行到調用函數時,被調用的函數就會進棧,在main空間上開闢一片空間。這種進棧的方式叫做壓棧。第一個進棧的直接進入棧底。被調用函數結束後,就會從內存釋放,彈棧。以此類推,直至main函數結束。
四、函數的重載
定義函數爲了增加其閱讀性,函數名稱要求直接反映出該函數功能最好。函數名稱要有意義。
功能相同的函數,名稱最好是一致的。
重載:在同一個類中,允許存在一個以上的同名函數,只要它們的參數個數或者參數類性不同即可。
重載的好處:方便閱讀,方便調用。
特點:與返回值類型無關,只看參數列表
重載練習
public static void show(int x,char y,double z){}
下列哪個答案和給定的函數重載了?
a.public static int show(char y,int x,double z){return 1;}
重載了。參數類型不同。而且和返回值類型無關。
b.public static void show(int a,char b,double c){}
沒有,和給定的函數一模一樣。出現在同一類會編譯失敗,因爲有了調用的不確定性。
c.public static void show(double z,int x,char y){}//重載了。參數類型不同。參數是有順序的
d.public static double show(int a,char y){}//重載了,參數個數不同。
五、數組
數組:同一種類型的數據的集合。可以自動的給數組中的元素從0開始編號。這些編號叫索引,也叫腳標。
編號和數據存在對應關係。
格式:元素類型 [ ] 數組名=new 元素類型[元素個數或者數組長度]
長度爲n的數組,最大索引(腳標)是n-1
特點:1、這些數據必須是同一類型。
2、存儲時必須明確元素的個數。
數組其實就是可以存儲固定個數並是同一類型的元素的容器。
容器:數據多時,就要容器來存儲。數組是容器的一種。
new:要定義一個存儲多個數據的空間,必須要使用一個關鍵字new。而new[ ]:新創建數組。New創建的數組也稱實體。
new int [3]:定義了一個可以存儲3 個int類型元素的數組。
int [ ] arr:定義一個數組,元素類型是int ,名稱是arr。
arr[0]=66:名稱是arr的數組,腳標是0的位置被賦值爲66.
數組的定義其實也是定義變量,只不過不再是基本數據類型變量了,而是引用數據類型變量(數組、類、接口)
數組的默認初始化值:boolean類型是false。Int類型是0.
Double類型是0.0 而float類型是0.0f 而char類型是'\u0000'(空字符)
每個程序運行時,都要在內存中分配專屬空間
Java內存中又劃分爲5個區域:1、寄存器(cpu涉及的區域)2、本地方法區(是和系統相關的代碼存儲區域)3、棧內存4、堆內存5、方法區。
棧內存:存儲的都是局部變量。變量運算區域一結束,就被釋放。
局部變量:在方法上的參數,方法內的參數,語句中的變量。
堆內存:存儲的是數組和對象。堆內存中存儲的都是實體。
堆的特點:1、任何實體都有內存地址值。2、堆內存中的變量都有默認的初始化值。
Int[ ] arr=new int [3];堆內存中這個實體int[3]只是把它在堆內存中的首地址賦給了棧內存中main空間中的arr變量。真正的實體並沒有存儲到arr變量中去。Arr變量只是持有了實體的首地址值,指向或者說引用了該實體。而基本數據類型是直接存儲到變量中。
一個實體可存在多個引用的變量,即可以被多個變量所指向。
int[]arr1=new int[3];
int[]arr2=new int[3];是兩個不同的數組。
int[]arr1=new int[3];
int[]arr2=arr1;將arr1所持有的實體首地址賦給arr2.讓arr2也可引用該實體。
arr1[0]=30;
System.out.println(arr2[0]);結果是30
arr1=null;就是把變量所持有的實體首地址更爲null值,即不再指向實體。
實體只有在不再被引用時,纔會被垃圾回收器回收。