二、黑馬程式員—方法與數組
第二篇:
1、什麼是方法(method)?
方法是一組為了實作特定功能的代碼塊的集合。方法在文法上的功能主要有以下兩個:
①:結構化代碼
将代碼按照功能進行組織,使代碼的結構比較清晰,容易閱讀和修改,也就是程式的可維護
性強。
②:減少代碼重複
一個固定的功能,可能會在程式中多次使用,在使用時隻需要調用寫好的方法,而不用重複
書寫對應的功能代碼。
方法在書寫時需要注意以下兩點:
①:邏輯嚴謹
方法實作的一個完整的功能,是以在書寫時要考慮到各種可能的情況,并對每種情況做出恰
當的處理。
②:通用性強(可重複利用)
方法實作的是一種功能,在實際實作時,可以根據需要,使方法具備一定的通用性,除非必
要,否則不要寫專用的方法。在 java 語言中,恰當的使用方法,将使程式更加優雅,便于
閱讀和使用。
我的總結:
方法:一段可重複使用的代碼段;
程式中完成獨立功能的一段代碼的集合。
2、java 中方法的格式:
[修飾符] 傳回值類型 方法名([參數類型 形式參數 1,參數類型 形式參數 2,……])
{
執行語句; [return 傳回值;]//需要的話
}
參數清單(參數的類型 ,參數的個數,參數的順序)
我的總結:隻要上述有一個不一樣,那麼這個參數清單就不一樣!對于方法而言,即使同
名也不是同一個方法,也就是下面講的方法簽名。
3、方法裡的屬性
通路控制符:通路控制符限定方法的可見範圍,或者說是方法被調用的範圍。方法的通路控
制符有四種,按可見範圍從大到小依次是:public、protected,無通路控制符,private。其中
無通路控制符不書寫關鍵字即可。具體的範圍在後續有詳細介紹。
形式參數:在方法被調用時用于接收外界輸入的資料。
實參:調用方法時實際傳給方法的資料。
傳回值:方法在執行完畢後返還給調用它的環境的資料。
傳回值類型:事先約定的傳回值的資料類型,如無傳回值,必須給出傳回類型 void。
方法簽名:方法名和方法的參數清單(能差別方法);//最關鍵的
java 語言中調用方法:對象名.方法名(實參清單)。
實參的數目、資料類型和次序必須和所調用方法聲明的形參清單比對。
return 語句終止方法的運作并指定要傳回的資料。
4、方法特點
它可以實作獨立的功能;
必須定義在類裡面;
它隻有被調用才會執行;
它可以被重複使用;
方法結束後方法裡的對象失去引用;
如何定義一個功能,并通過方法展現出來:
1 明确該功能運算後的結果.明确傳回值類型;
2 明确在實作該功能過程中是否有未知内容參與運算,确定參數清單;
eg:
package reviewdemo;
/**
* player 的值分别是1,2,3或者其他值時,該方法傳回“大明”,“二明”,“小明”,“我沒
有這個孩子”。
*/
public class demo2 {
public static void main(string[] args) {
int player = 5;
system.out.println("傳回的結果是:"+show(player));
public static string show(int p){
switch (p) {
case 1:
return "大明";
case 2:
return "二明";
case 3:
return "小明";
default:
return "我沒有這個孩子!";
5、什麼是方法的重載(overload)?
概念:
在同一個類中,允許存在一個以上的同名方法,隻要它們的參數個數或者參數類型或
參數順序不同即可。
存在的原因:
屏蔽了一個對象的同一類方法由于參數不同所造成的差異。
特點:
與傳回值類型無關,隻看參數清單。
以下是方法重載的示例:
public void a(int a){}
public int a(){}
public void a(int a,string s){}
class chongzai
public static void main(string[] args)
int ret = name(3,4,5);
system.out.println(ret);
public static int name(int a, int b)
int c = a+b;
return c;
public static int name(int a, int b, int m)//這就叫做方法的重載,隻
要參數清單不一樣。好處:使用者使用時限制很小;
int c = a+b+m;
我的總結:方法重載,方法名相同,但是參數清單不一緻!(和方法覆寫不一樣,方法覆寫
的方法名和參數清單都必須一樣),注意方法重載和方法覆寫的不同!
6、可變參數
從 java5 開始出現了可變參數,這是對 java 方法及數組的拓展!
方法中可以接受的參數不再是固定個數的,而是随着具體需求傳遞的多少來決定。
定義格式: 傳回值類型 方法名(參數類型 ... 形式參數){ }
可變參數的特點:
隻能出現在參數清單的最後;
... 位于變量類型和變量名之間,前後有無空格都可以;
調用可變參數的方法時,編譯器為該可變參數隐含建立一個數組,在方法體中以數組的形式
通路可變參數。
import java.util.arrays;
public class demo6 {
int []age = {1,2,3,69,36,636,459};
show(age);
public static void show(int...a){//此時這裡寫的就是可變參數,和數組
的作用一樣!
//把數組給列印出來!
system.out.println(arrays.tostring(a));
7、數組簡介:
數組(array)是 java 語言中内置的一種基本資料存儲結構,通俗的了解,就是一組數的集合,
目的是用來一次存儲多個資料。數組是程式中實作很多算法的基礎,可以在一定程度上簡化
代碼的書寫。
備注:
1. 數組的好處:數組裡的每個元素都有編号,編号從 0 開始,并且依次遞增,友善操作這
些元素;
2. 使用 java 數組:必須先聲明數組,再給該數組配置設定記憶體;
3. 數組對應在記憶體中一段連續空間。
4. 數組元素必須是相同資料類型,也可以是引用資料類型,但是同一個數組中的元素必須
是同一類資料類型。
8、一維數組的聲明與初始化:
一維數組:可以了解為一列多行、類型相同的資料,其中每個資料被稱為數組元素;
一維數組的聲明方式:
type varname[]; 或 type[] varname;(推薦)
eg:int age[]; int []age;
數組的長度一旦确定,就不能改變,也就數組是定長的;
我的總結:java 語言聲明數組的時候不能指定其長度(元素的個數)
eg:int a[5]; //非法
初始化:
java 中的數組必先初始化才可以使用,所謂初始化就是為數組的數組元素配置設定記憶體,并為每
個數組元素指派;
數組初始化的兩種方式:
靜态初始化:初始化時由我們自己指定每個數組元素的初始值,由系統決定需要的數組長度;
格式:數組名 = new 數組類型[]{元素 1,元素 2,元素 3...元素 n};
簡化文法:數組名 = {元素 1,元素 2,元素 3...元素 n};
動态初始化:初始化時由我們指定數組的長度,由系統為數組元素配置設定初始值;
格式:數組名 = new 數組類型[數組長度];
不能靜态和動态初始化同時使用:
也就是說不能同時指定數組的長度和元素;
eg:
* 聲明數組及初始化
public class demo3 {
int []age = new int[10];
//動态初始化
for (int i = 0; i < age.length; i++) {
age[i] = i;
system.out.print(age[i]+" ");
輸出:0 1 2 3 4 5 6 7 8 9
9、數組的使用:
java 語言的數組索引是從 0 開始的,也就是說數組裡的第一個元素的索引是 0,第二個元素的
索引是 1,依次可以類推。
常見操作:
給數組元素指派
數組名[索引] = 數組類型的值 ;
通路數組元素
數組類型 變量 = 數組名[索引];
得到數組的長度
int len = 數組名.length; //length 是數組的屬性
周遊數組(備注:length 屬性和循環語句)
數組元素的索引範圍(0,長度—1)
eg:判斷數組是否重複
* 判斷數組是否重複
int []age = {1,2,3,4,5,6,5};
for (int i = 0; i < age.length-1; i++) {//雙層循環,定住一個,
再考慮下一個!
for (int j = i+1; j < age.length; j++) {
if(age[i] == age[j]){
system.out.println("有重複的!"+i+" "+j);
break;
求最大值:
public class demo4 {
int age[] = new int[] { 12, 26, 3, 60, 55, 6, 48, 4, 98 };
int max = age[0];
if (max < age[i]) {
max = age[i];
system.out.println(max);
經典用法:冒泡法排序
class bubblesort
public static void main(string args[])
int [] arr={5,1,6,4,2,8,9};
bubble(arr);
printarray(arr);
public static void bubble(int[] arr)
for (int i=0;i<arr.length-1 ;i++ )
for (int y=0;y<arr.length-i-1 ; y++) //讓每一次比較的元素減
少,-1是為了防止數組角标越界;
if(arr[y]>arr[y+1]) //相鄰兩元素相比
int temp = 0;
temp = arr[y];
arr[y] = arr[y+1] ;
arr[y+1] = temp;
public static void printarray(int[] arr)
for (int i=0;i<arr.length ;i++ )
if(i!=arr.length-1)
system.out.print(arr[i]+",");
else
system.out.println(arr[i]);
//選擇排序
int []age = {1,2,36,363,56,95,12,32,1232,3263};
for (int j = i+1; j <= age.length-1; j++) {
if(age[i] > age[j]){
int temp = age[i];
age[i] = age[j];
age[j] = temp;
system.out.println(arrays.tostring(age));
//輸出為:[1, 2, 12, 32, 36, 56, 95, 363, 1232, 3263]
10、配置設定記憶體空間
配置設定記憶體空間
數組名=new 資料類型[數組長度];
new 關鍵字用來實作為數組或對象配置設定記憶體 (堆記憶體)
數組具有固定的長度。擷取數組的長度: 數組名.length
定義數組+配置設定記憶體空間
資料類型[]數組名=new 資料類型[數組長度];
定義數組時不指定長度,配置設定空間時指定數組長度;如:string cities[] = new string[6];
數組元素:
數組名[下标值];
數組下标從 0 開始 scores[0]=75;
數組的記憶體配置設定 棧記憶體和堆記憶體
如定義一個數組 int[]scores 将在棧記憶體中為 scores 配置設定記憶體空間,其值是一個不确定的值。
當執行語句 scores=new int[5]時,将在堆記憶體配置設定連續 5 個空間,每個空間 4 個位元組,用于
存放整型資料,其初始值為 0,然後将該段空間首位址,也就是第一個元素的位址,比如
0*3000,賦給 scores 變量。該位址相當于一個指針,指向堆記憶體中配置設定的空間。此時堆記憶體
中配置設定的 5 個空間可以分别使用 scores[0],一直到 scores[4]來表示。當執行四個指派語句時,
分别用指定值填充到對應元素位置。如果此時将 null 值賦給 scores 時,scores 變量将不再指
向任何位置,此時堆記憶體中配置設定的空間就變成了垃圾,由垃圾回收器在某一時間進行回收。
在方法中定義的變量,包括基本資料類型變量和引用資料類型變量,都将在棧記憶體中配置設定空
間,當超過變量作用範圍後,自動回收
我的總結:初始化=定義數組+配置設定空間+指派
11、二維數組:
二維數組:(其實是一個一維數組,它的每一個元素又是一個一維數組),
可以看做是一張表格。
動态初始化
int[ ][ ] arr = new int[3][2];
定義了一個二維數組,其中有 3 個一維數組,每一個一維數組中有 2 個元素
靜态初始化
int[ ][ ] arr = new int[][]{{1,2},{3,4},{5,6}};
int[ ][ ] arr = {{1,2},{3,4},{5,6}};
int age[][] = new int[][]{{1,2},{3,4},{5,6,7}};
system.out.println(age[0].length);//2
system.out.println(age[2].length);//3
12、操作數組的工具類-arrays
static int binarysearch(type[] a, type key) 使用二分搜尋法來搜尋 key 元素在數組中的索引;若
a 數組不包括 key,傳回負數。(該方法必須已按升序排列後調用)。
static int binarysearch(type[] a, int fromindex, int toindex, type key) 使用二分搜尋法來搜尋
key 元素在數組中從 fromindex 到 toindex 的索引;若 a 數組不包括 key,傳回負數。(該方
法必須已按升序排列後調用)。
static boolean[] copyof(type[] original, int newlength) 複制指定的數組見下面備注
static byte[] copyofrange(type[] original, int from, int to) 将數組的指定範圍複制到一個新數
組。
static boolean equals(type[] a, type[] a2) 如果兩個數組長度相等和元素一一相等,則傳回 true
static void fill(type[] a, type val) 将 a 數組所有元素都賦為 val。
static void fill(type[] a, int fromindex, int toindex, type val) 将 a 數組從 formindex 到 tiondex 索
引之間的元素都賦為 val。
static void sort(type[] a) //sort(int[] arr)對指定的數組按數字升序進行排序。
static void sort(type[] a, int fromindex, int toindex) 對指定數組的從 formindex 到 tiondex 索引
之間的元素按數字升序進行排序。
static string tostring(type[] a) 傳回指定數組内容的字元串表示形式。多個數組元素之間用英
文逗号或空格隔開。
我的總結:使用數組工具類可以節省時間,提高效率,注意常查閱 api;
//使用arrays類
int[] age = new int[] { 12, 26, 3, 60, 55, 6, 48, 4, 98 };
system.out.println(arrays.tostring(age));//直接列印出數組的方
法
int []age2 = {1,2,3,4,5,6,98,65,23};
int i = arrays.binarysearch(age2, 98);
system.out.println(i);
13、java5 新特性對數組的支援:
增強 for 循環 → for-each
for (參數類型 參數名 : 數組名) {
代碼塊
for (int i : age) {
這樣就用 for-each 把數組周遊輸出!
我的總結:for-each 用于數組和 iterable 對象!在以後的集合學習中還會經常用到 for-each
循環。