Day05—方法
1、成員方法
在程式開發中重複代碼的定義,為了友善這些重複的代碼,通過方法來儲存,實作重複地調用。
通路修飾符 傳回值資料類型 方法名(參數清單(資料類型 變量名1,資料類型 變量名2……){
方法體(程式)
[return;] //帶傳回值方法定義(定義時return後面的傳回值與方法定義時的資料類型要比對)
}
2、方法調用格式
(1)不帶參方法的定義和調用
public class Test{
public static void main(String[] args){
//調用方法
isNumber();
}
//定義方法
public static void isNumber(){
int num = 10;
//判斷10是否為偶數
if(num % 2 ==0){
System.out.println("true");
}else{
System.out.println("false");
}
}
}
(2)帶參方法的定義和調用
public class Test{
public static void main(String[] args){
//常量值的調用方法
isNumber(10);
//變量值的調用方法
int num = 9;
isNumber(num);
}
//定義帶一個參數的方法
public static void isNumber(int num){
//判斷是否為偶數
if(num % 2 ==0){
System.out.println("true");
}else{
System.out.println("false");
}
}
}
(3)帶傳回值方法的定義和調用
public class Test{
public static void main(String[] args){
//1、方法名(參數)——一般沒有意義,不推薦
isNumber(10);
//2、資料類型 變量名 = 方法名(參數);
boolean flag = isNumber(10); //判斷完成後相當于 boolean flag = true
System.out.print(flag);
//System.out.print(isNumber(10)); 不要變量接收,直接輸出,一般不推薦
}
//定義帶傳回值的方法
public static void isNumber(int num){
//判斷是否為偶數
if(num % 2 ==0){
return true;
}else{
return false;
}
}
}
(4)方法特點
①方法必須先定義再調用,否則程式将報錯。
②方法調用時,參數數量與類型必須與方法定義中的設定相比對,否則程式将報錯。
③方法不能嵌套定義。
④void表示無傳回值,可以省略return,也可以單獨書寫return,後面不加資料。
⑤調用方法時,void類型的方法直接調用即可;非void類型的方法,推薦使用變量接收調用。
3、形參和實參
(1)形參
方法定義中的參數,等同于變量定義格式。
(2)實參:
方法調用中的參數,等同于使用變量或常量。
4、可變參數
public int method(int...data){ //調用時可以直接傳遞一個數組
int sum = 0;
for (int i = 0; i < data.length; i++) {
sum += data[i];
}
return sum;
}
public int method(String name,int age,int...data){ //在使用中,前兩個參數必須傳遞,可變的參數根據需求進行傳遞
int sum = 0;
for (int i = 0; i < data.length; i++) {
sum += data[i];
}
return sum;
}
5、方法重載
(1)定義
方法名重用的一種技術形式。 一個方法不能滿足要求,需要定義多個不同名稱的方法。
(2)特點
在同一類中,方法名相同,參數的類型或個數不同,跟傳回值沒有關系。
public class Test{
public static void main(String[] args){
int result1 = sum(10,20);
System.out.print(result1);
int result2 = sum(10,20,30);
System.out.print(result2);
double result3 = sum(10.0,20.0,30.5);
System.out.print(result3);
}
//方法重載
public static int sum(int x,int y){
return x + y;
}
public static int sum(int x,int y,int z){
return x + y + z;
}
public static double sum(double x,double y,double z){ //doulbe --->int
return x + y + z;
}
}
6、方法的參數傳遞
(1)方法參數傳遞(基本資料類型)
形參的改變,不影響實參的值
public class Test3 {
public static void main(String[] args) {
int num = 100;
System.out.println("調用change方法前:"+num);
change(num); //形參的改變,不影響實參的值
System.out.println("調用change方法後:"+num);
}
public static void change(int num){
num = 200;
}
}
(2)方法參數傳遞(引用資料類型)
形參的改變,影響實參的值
public static void main(String[] args) {
int[] arr = {10,20,30};
System.out.println("調用change方法前:"+arr[1]);
change(arr); //形參的改變,不影響實參的值
System.out.println("調用change方法後:"+arr[1]);
}
public static void change(int[] arr){
arr[1] = 200;
}
7、方法的遞歸
是一種特殊方法嵌套調用形式,自己調用自己。是一層層帶入,再一層層帶出。
注意:
①遞歸調用必須有結束條件;
②每次調用的時候都需要改變傳遞的參數内容
③遞歸方法影響程式的性能,使用遞推方式
//計算階乘 1! + 2! + 3! + 4! + 5!
public class TestRecursion {
public int factorial(int num) { //實作階乘的方法
if (num == 1) {
return 1;
}
return num * factorial(num - 1);
}
public int sum(int num){
if(num == 1){
return 1;
}
return factorial(num) + sum(num - 1); //5! + sum(4) 4! + sum(3)
}
public static void main(String[] args) {
TestRecursion testRecursion = new TestRecursion();
System.out.println(testRecursion.sum(5)); //153
}
}
8、構造方法
(1)定義
是一種特殊的方法,與類名相同,沒有傳回值 ,不能寫void,寫了void就變成普通方法了。
(2)作用
建立對象時給成員屬性進行初始化。
通路修飾符 類名(參數清單){
構造方法體;
}
注意:
①構造方法在建立對象時被自動調用,當沒有自己定義構造方法時,編譯器會提供一個無參構造方法。
②一個類中至少要有一個構造方法。
③當定義了構造方法時,編譯器不會再提供一個預設的無參數構造方法。