6.3 方法
1、理論基礎
方法的定義:方法是解決一類問題的步驟的有序組合,其包含於類或對象中,它在程序中被創建,在其他地方被引用。
方法的優點:使程序變得更簡短而清晰。有利於程序維護。可以提高程序開發的效率。提高了代碼的重用性。
方法的命名規則:方法的名字的第一個單詞應以小寫字母作爲開頭,後面的單詞則用大寫字母開頭寫,不使用連接符。下劃線可能出現在 JUnit 測試方法名稱中,用以分隔名稱的邏輯組件。一個典型的模式是:test<MethodUnderTest>_<state>
。例如testPop_emptyStack
。
2、定義類的方法
類中除了定義成員變量,還可以定義方法,用於描述對象的行爲,封裝對象的功能。
定義類中的方法:
class 類名{
修飾詞 返回值類型 方法名稱([參數列表]){
方法體………… //方法寫法不變
} //如果有其餘代碼的話下方寫入其餘代碼
}
方法的所有部分:
修飾符:修飾符,這是可選的,告訴編譯器如何調用該方法。定義了該方法的訪問類型。
返回值類型:方法可能會返回值。returnValueType 是方法返回值的數據類型。有些方法執行所需的操作,但沒有返回值。在這種情況下,returnValueType 是關鍵字void。
方法名:是方法的實際名稱。方法名和參數表共同構成方法簽名。
參數類型:參數像是一個佔位符。當方法被調用時,傳遞值給參數。這個值被稱爲實參或變量。參數列表是指方法的參數類型、順序和參數的個數。參數是可選的,方法可以不包含任何參數。
方法體:方法體包含具體的語句,定義該方法的功能。
代碼實例:
public static int age(int birthday){
...
}
代碼實例:
public static int max(int num1, int num2) { //返回兩個整型變量數據的較大值
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result; //有返回值方法中必須要寫的。即return
} //此處只能返回int型
3、方法調用代碼實例
public class TestMax {
public static void main(String[] args) { //主方法
int i = 5;
int j = 2;
int k = max(i, j); //調用
System.out.println( i + " 和 " + j + " 比較,最大值是:" + k);
} //輸出結果:5和2比較,最大的是:5
public static int max(int num1, int num2) { //返回兩個整數變量較大的值
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}
//創建一個有相同名字但參數不同的方法。
//當傳入int型參數時int型的max方法就會被調用,
//當傳入double型參數時double型的max方法就會被調用。
//這就叫做方法重載。
//該代碼段中的double,如果僅有此處不同,則不算是重載
public static double max(double num1, double num2) {
if (num1 > num2)
return num1;
else
return num2;
return result;
}
}
4、方法簽名(方法重載)
方法的簽名包含如下兩個方面:方法名和參數列表
一個類中,不可以有兩個方法的簽名完全相同,即一個類中不可以有兩個方法的方法名和參數列表都
完全相同。而如果一個類的兩個方法只是方法名相同而參數列表不同,是可以的。
簽名=方法名+參數列表(包括參數個數以及參數類型)
編譯錯誤代碼實例:
public class Cashier{
//完全一樣,編譯錯誤
public boolean pay(double money){
……
}
public boolean pay(double money){
……
}
}
編譯正確代碼實例:
public class Cashier{
//方法名相同參數列表不同,編譯正確
public boolean pay(double money){
……
}
//方法名稱相同,參數列表不同,稱之爲方法的重載
public boolean pay(String cardId,String cardPwd){
……
}
}
編譯器在編譯時會根據簽名來綁定調用不同的方法,可以把重載的方法看成是完全不同的方法,只不過恰好方法名相同而已。
Aoo o = new Aoo(); //創建對象
o.say(); //調用第一個方法
o.say("wkj"); //調用第二個方法
o.say("wkj",36); //調用第三個方法
o.say(18,"wkj"); //調用第四個方法
class Aoo{ //方法重載調用自動匹配
void say(){} //第一個方法
void say(String name){} //第二個方法
void say(String name,int age){} //第三個方法
void say(int age,String name){} //第四個方法
//int say(){return 5;} //編譯錯誤,和第一個方法相同
//void say(String name1){} //編譯錯誤,和第二個方法相同
}
5、構造方法
主要功能是爲類中的屬性初始化。
一個對象被創建時,使用構造方法初始化該對象。構造方法和它所在類的名字相同,但沒有返回值。通常使用構造方法給一個類的實例變量賦初值,或者執行其它必要的步驟來創建一個完整的對象。如果沒有自定義構造方法,Java將提供一個默認構造方法,它把所有成員初始化爲0。
構造方法是在類中定義的方法,不同於其他的方法,構造方法的定義有兩點規則:
1、構造方法的名稱必須與類名相同。
2、構造方法沒有返回值,也不能寫void。構造方法也可以重載。
[訪問修飾符] 類名(){
構造方法體;
}
代碼實例:
class MyClass { //一個簡單的構造函數,少了返回值類型
int x;
MyClass(int i) { //以下是構造函數,方法名和類名相同
x = i;
}
}
6、this關鍵字
this關鍵字在方法體中,用於指向調用該方法的當前對象。即哪個對象調用方法,this指的就是哪個對象。嚴格來講在方法中需要通過this關鍵字指明當前對象。
使用場景:
1、表示當前對象。
2、調用本類中的構造方法。
3、表示類中的屬性和構造方法。
構造方法常用於實現對象成員變量的初始化:
class Cell{
int row;
int col;
public Cell (int row,int col){ //兩個參數
this.row = row; //通過this關鍵字來區分成員變量和參數
this.col = col; //將col賦給當前類的
}
}
class TestCell{
public static void main(String args[]){
Cell c1 = new Cell(15,6); //傳入參數
printCell(c1); //c1.row=15並c1.col=6
}
}
7、參數傳遞
參數傳遞一般有兩種,一種是傳值
,另一種是傳地址
。傳值是指在調用方法時,把參數的值直接傳遞給方法,傳地址則是給方法提供參數的地址。
代碼實例:基本數據類型的參數傳遞
public class ParamTransfer{
public int money;
void amethod(int i){
//注意對比形參i和money的值的變化
System.out.println("方法得到的i的值爲:"+i); //輸出:100
i = i * 5;
System.out.println("方法執行語句i=i*5後i的值爲:"+i); //輸出:500
System.out.println("money的值爲:"+this.money); //輸出:100
}
public static void main(String[] args){
ParamTransfer pt=new ParamTransfer();
pt.money=100;
pt.amethod(pt.money); //把money作爲參數傳遞給方法
}
}
6.4 Java時間和日期
1、使用printf格式化日期
printf方法可以很輕鬆地格式化時間和日期。使用兩個字母格式。它以%t
開頭並且以下面表格中的一個字母結尾。
轉換符 | 說明 | 示例 |
---|---|---|
c | 包括全部日期和時間信息 | 星期六 十月 27 14:21:20 CST 2007 |
F | “年-月-日” 格式 | 2007-10-27 |
D | “月/日/年” 格式 | 10/27/07 |
r | “HH:MM:SS PM” 格式(12時制) | 02:25:51 下午 |
T | “HH:MM:SS” 格式(24時制) | 14:28:16 |
R | “HH:MM” 格式(24時制) | 14:28 |
代碼實例:
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
//初始化Date對象
Date date = new Date();
// c的使用。輸出結果:全部日期和時間信息:星期一 九月 10 10:43:36 CST 2012
System.out.printf("全部日期和時間信息:%tc%n",date);
// f的使用。輸出結果:年-月-日格式:2012-09-10
System.out.printf("年-月-日格式:%tF%n",date);
// d的使用。輸出結果:月/日/年格式:09/10/12
System.out.printf("月/日/年格式:%tD%n",date);
// r的使用。輸出結果:HH:MM:SS PM格式(12時制):10:43:36 上午
System.out.printf("HH:MM:SS PM格式(12時制):%tr%n",date);
// t的使用。輸出結果:HH:MM:SS格式(24時制):10:43:36
System.out.printf("HH:MM:SS格式(24時制):%tT%n",date);
// R的使用。輸出結果:HH:MM格式(24時制):10:43
System.out.printf("HH:MM格式(24時制):%tR",date);
}
}
2、Java休眠:sleep
sleep()使當前線程進入停滯狀態,讓出CPU的使用。
代碼實例:
try {
System.out.println(new Date( ) + "\n");
Thread.sleep(1000*3); //休眠3秒
System.out.println(new Date( ) + "\n");
} catch (Exception e) {
System.out.println("Got an exception!");
}