亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java中方法使用的深入講解

 更新時(shí)間:2020年10月18日 09:21:43   作者:na小子叫堅(jiān)強(qiáng)  
這篇文章主要給大家介紹了關(guān)于Java中方法使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

方法的使用

1.方法的基本用法

什么是方法,方法就是一個(gè)代碼片段,類(lèi)似于C/C++ 語(yǔ)言中的"函數(shù)"。

1.1方法存在的意義:

  1. 是能夠模塊化的組織代碼(當(dāng)代碼規(guī)模比較復(fù)雜的時(shí)候).
  2. 做到代碼被重復(fù)使用, 一份代碼可以在多個(gè)位置使用.
  3. 讓代碼更好理解更簡(jiǎn)單.
  4. 直接調(diào)用現(xiàn)有方法開(kāi)發(fā),不必重復(fù)造輪子。

1.2方法定義語(yǔ)法

基本語(yǔ)法:

// 方法定義
public static 方法返回值 方法名稱(chēng)([參數(shù)類(lèi)型 形參 ...]){
 方法體代碼;
 [return 返回值];
}
// 方法調(diào)用
返回值變量 = 方法名稱(chēng)(實(shí)參...);

代碼示例:實(shí)現(xiàn)一個(gè)方法實(shí)現(xiàn)兩個(gè)正數(shù)相加

class Test {
 public static void main(String[] args) {
 	int a = 10;
 	int b = 20; 
 // 方法的調(diào)用
 	int ret = add(a, b);
 	System.out.println("ret = " + ret);
 }
 // 方法的定義
 public static int add(int x, int y) {
 		return x + y;
 }
}
// 執(zhí)行結(jié)果
ret = 30

注意事項(xiàng):

  1. 就目前而言,只要在 main 函數(shù)中調(diào)用的方法,需要寫(xiě) public 和 static 這兩個(gè)關(guān)鍵字。
  2. 方法定義時(shí), 參數(shù)可以沒(méi)有,如果有,則每個(gè)參數(shù)都要指定類(lèi)型。
  3. 方法定義時(shí), 返回值也可以沒(méi)有, 如果沒(méi)有返回值, 則返回值類(lèi)型應(yīng)寫(xiě)成 void。
  4. 方法定義時(shí)的參數(shù)稱(chēng)為 “形參”, 方法調(diào)用時(shí)的參數(shù)稱(chēng)為 “實(shí)參”。
  5. 方法的定義必須在類(lèi)之中, java中沒(méi)有函數(shù)聲明的概念,所以代碼書(shū)寫(xiě)在調(diào)用位置的上方或者下方均可。

1.3 方法調(diào)用的執(zhí)行過(guò)程

基本規(guī)則:

  1. 定義方法的時(shí)候, 不會(huì)執(zhí)行方法的代碼。只有調(diào)用的時(shí)候才會(huì)執(zhí)行。
  2. 當(dāng)方法被調(diào)用的時(shí)候, 會(huì)將實(shí)參賦值給形參。
  3. 參數(shù)傳遞完畢后, 就會(huì)執(zhí)行到方法體代碼。
  4. 當(dāng)方法執(zhí)行完畢之后(遇到 return 語(yǔ)句), 就執(zhí)行完畢, 回到方法調(diào)用位置繼續(xù)往下執(zhí)行。
  5. 一個(gè)方法可以被多次調(diào)用。

代碼示例:計(jì)算1!+2!+3!+4!+5!

 public static void main(String[] args) {
 	int sum = 0;
 	for (int i = 1; i <= 5; i++) {
 		sum += factor(i);
 }
	 System.out.println("sum = " + sum);
 }
 public static int factor(int n) {
 	System.out.println("計(jì)算" + n + "的階乘中!");
 	int result = 1;
 	for (int i = 1; i <= n; i++) {
 		result *= i;
 }
	 return result;
 }
}
// 執(zhí)行結(jié)果
計(jì)算 1 的階乘中! 
計(jì)算 2 的階乘中! 
計(jì)算 3 的階乘中! 
計(jì)算 4 的階乘中! 
計(jì)算 5 的階乘中! 
sum = 153

使用方法,避免使用二重循環(huán),當(dāng)然也可以將整個(gè)過(guò)程都放到一個(gè)方法中,讓代碼更簡(jiǎn)單清晰。

1.4 實(shí)參和形參的關(guān)系(重要)

代碼示例:交換兩個(gè)整型變量

class Test {
 public static void main(String[] args) {
 	int a = 10;
 	int b = 20;
	swap(a, b);
 	System.out.println("a = " + a + " b = " + b);
 }
 public static void swap(int x, int y) {
 	int tmp = x;
 	x = y;
	y = tmp;
 }
}
// 運(yùn)行結(jié)果
a = 10 b = 20

那么可以看到,變量a和b的值并沒(méi)有完成交換。

原因分析:

在這里插入圖片描述

對(duì)于基礎(chǔ)類(lèi)型來(lái)說(shuō),形參相當(dāng)于實(shí)參的拷貝,即傳值調(diào)用。

解決方法:

如果目前想要解決這個(gè)問(wèn)題,可以傳引用類(lèi)型參數(shù)(例如數(shù)組來(lái)解決這個(gè)問(wèn)題)。對(duì)于數(shù)組的使用,現(xiàn)在先做了解,后面我會(huì)總結(jié)。

class Test {
 	public static void main(String[] args) {
		 int[] arr = {10, 20};
 		 swap(arr);
 		 System.out.println("a = " + arr[0] + " b = " + arr[1]);
 }
 	public static void swap(int[] arr) {
		 int tmp = arr[0];
 		 arr[0] = arr[1];
 		 arr[1] = tmp;
 }
}
// 運(yùn)行結(jié)果
a = 20 b = 10

1.5 沒(méi)有返回值的方法

方法的返回值是可選的,有些時(shí)候可以沒(méi)有的。

代碼示例:

class Test {
 	public static void show(int x, int y) {
 		System.out.println("Hello World!");
 }
	 public static void main(String[] args) {
			show();
 }
}
//運(yùn)行結(jié)果:
Hello World!

例如剛才的交換兩個(gè)整數(shù)的方法,也是沒(méi)有返回值的。在使用時(shí)要注意方法是否有返回值,如果有則需要用相同類(lèi)型的變量來(lái)接受。

2.方法的重載

有些時(shí)候我們需要用一個(gè)函數(shù)同時(shí)兼容多種參數(shù)的情況,這時(shí)候我們就用到方法的重載。

2.1重載要解決的問(wèn)題

代碼示例:

class Test {
 public static void main(String[] args) {
 		int a = 10;
 		int b = 20;
 		int ret = add(a, b);
 		System.out.println("ret = " + ret);
 		double a2 = 10.5;
 		double b2 = 20.5;
 		double ret2 = add(a2, b2);
		System.out.println("ret2 = " + ret2);
 }
 public static int add(int x, int y) {
 		return x + y;
 }
}
// 編譯出錯(cuò)
Test.java:13: 錯(cuò)誤: 不兼容的類(lèi)型: 從double轉(zhuǎn)換到int可能會(huì)有損失
    double ret2 = add(a2, b2);        
         ^

由于參數(shù)類(lèi)型不匹配,所以不能直接使用現(xiàn)有的add方法。

2.2 使用重載

代碼示例:

class Test {
 public static int add(int x, int y) {
		 return x + y;
 }
 public static double add(double x, double y) {
 		 return x + y;
 }
 public static double add(double x, double y, double z) {
		 return x + y + z;
 }
 public static void main(String[] args) {
		 int a = 10;
		 int b = 20;
		 int ret = add(a, b);
		 System.out.println("ret = " + ret);
		 double a2 = 10.5;
		 double b2 = 20.5;
		 double ret2 = add(a2, b2);
		 System.out.println("ret2 = " + ret2);
		 double a3 = 10.5;
		 double b3 = 10.5;
		 double c3 = 20.5;
		 double ret3 = add(a3, b3, c3);
		 System.out.println("ret3 = " + ret3);
 }
}

那么可以看到方法名字都叫add,但是有的add是int相加,有的是double相加,有的計(jì)算三個(gè)數(shù)字相加,所以,對(duì)于同一個(gè)方法名字,提供不同版本的實(shí)現(xiàn),稱(chēng)為方法重載。

2.3重載的規(guī)則

針對(duì)同一個(gè)類(lèi):

  1. 方法名相同。
  2. 方法的參數(shù)不同(參數(shù)個(gè)數(shù)或者參數(shù)類(lèi)型)。
  3. 方法的返回值類(lèi)型不影響重載。

代碼示例:

class Test {
 public static void main(String[] args) {
	 int a = 10;
	 int b = 20;
	 int ret = add(a, b);
	 System.out.println("ret = " + ret);
 }
 public static int add(int x, int y) {
	 return x + y;
 }
 public static double add(int x, int y) {
	 return x + y;
 }
}
// 編譯出錯(cuò)
Test.java:13: 錯(cuò)誤: 已在類(lèi) Test中定義了方法 add(int,int)
  public static double add(int x, int y) {
        ^ 1 個(gè)錯(cuò)誤

那么可以看到,當(dāng)兩個(gè)方法的名字相同,參數(shù)也相同,但是只有返回值不同的時(shí)候,不構(gòu)成函數(shù)重載。

3.方法遞歸

3.1遞歸的概念

一個(gè)方法在執(zhí)行過(guò)程中調(diào)用自身, 就稱(chēng)為 “遞歸”。

遞歸相當(dāng)于數(shù)學(xué)上的 “數(shù)學(xué)歸納法”, 有一個(gè)起始條件, 然后有一個(gè)遞推公式。

例如, 我們求 N!

起始條件: N = 1 的時(shí)候, N! 為 1。這個(gè)起始條件相當(dāng)于遞歸的結(jié)束條件。

遞歸公式: 求 N! , 直接不好求, 可以把問(wèn)題轉(zhuǎn)換成 N!=> N*(N-1)!

代碼示例:遞歸求 N 的階乘

public static int factor(int n) {
 if (n == 1) {
  return 1;
 }
 return n * factor(n - 1); // factor 調(diào)用函數(shù)自身
}
public static void main(String[] args) {
 int n = 5;
 int ret = factor(n);
 System.out.println("ret = " + ret);
}
// 執(zhí)行結(jié)果
ret = 120

有了方法遞歸,可以發(fā)現(xiàn)不用使用循環(huán),那么他的過(guò)程是怎么執(zhí)行的,且看下面分析。

3.2遞歸執(zhí)行過(guò)程分析

遞歸的程序的執(zhí)行過(guò)程不太容易理解, 要想理解清楚遞歸, 必須先理解清楚方法的執(zhí)行過(guò)程", 尤其是 "方法執(zhí)行結(jié)束之后,回到調(diào)用位置繼續(xù)往下進(jìn)行。

代碼示例:遞歸求 N 階乘,加上"日志"版本

public static int factor(int n) {
 	 System.out.println("函數(shù)開(kāi)始, n = " + n);
 	if (n == 1) {
  		 System.out.println("函數(shù)結(jié)束, n = 1 ret = 1");
		  return 1;
 }
 	int ret = n * factor(n - 1);
 	System.out.println("函數(shù)結(jié)束, n = " + n + " ret = " + ret);
 	 	return ret; 
}
public static void main(String[] args) {
 	int n = 5;
 	int ret = factor(n);
 	System.out.println("ret = " + ret);
}
// 執(zhí)行結(jié)果
函數(shù)開(kāi)始, n = 5
函數(shù)開(kāi)始, n = 4
函數(shù)開(kāi)始, n = 3
函數(shù)開(kāi)始, n = 2
函數(shù)開(kāi)始, n = 1
函數(shù)結(jié)束, n = 1 ret = 1
函數(shù)結(jié)束, n = 2 ret = 2
函數(shù)結(jié)束, n = 3 ret = 6
函數(shù)結(jié)束, n = 4 ret = 24
函數(shù)結(jié)束, n = 5 ret = 120
ret = 120

執(zhí)行過(guò)程圖:

在這里插入圖片描述

3.3遞歸練習(xí)

代碼示例1:按順序打印一個(gè)數(shù)字的每一位(例如 1234 打印出 1 2 3 4)

public static void print(int num) {
 if (num > 9) {
  print(num / 10);
 }
 System.out.println(num % 10);
}

代碼示例2:遞歸求 1 + 2 + 3 + … + 10

public static int sum(int num) { 
 if (num == 1) { 
 return 1; 
 } 
 return num + sum(num - 1); 
}

代碼示例3:寫(xiě)一個(gè)遞歸方法,輸入一個(gè)非負(fù)整數(shù),返回組成它的數(shù)字之和. 例如,輸入 1729, 則應(yīng)該返回1+7+2+9,它的和是19

public static int sum(int num) { 
 if (num < 10) { 
 	return num; 
 } 
 return num % 10 + sum(num / 10); 
}

代碼示例4:求斐波那契數(shù)列的第N項(xiàng)

public static int fib(int n) { 
 if (n == 1 || n == 2) { 
	 return 1; 
 } 
 return fib(n - 1) + fib(n - 2); 
}

用遞歸來(lái)求解,可以發(fā)現(xiàn)求前幾項(xiàng)是非常快速的,但當(dāng)我們求fib(40)的時(shí)候,發(fā)現(xiàn)程序運(yùn)行速度極慢,原因是遞歸會(huì)造成大量的重復(fù)運(yùn)算。

那么有效的解決方法就是利用迭代的方法來(lái)求解。

public static int fib(int n) { 
 	int f1 = 1; 
 	int f2 = 1; 
 	int cur = 0; 
	 for (int i = 3; i <= n; i++) { 
 		cur = f1 + f2; 
 		f2 = f1; 
 		f1 = cur; 
 } 
	 return cur; 
}
//此時(shí)可以發(fā)現(xiàn)求解fib(40)非常的快,結(jié)果是102334155

3.4遞歸小結(jié)

  1. 遞歸是一種重要的編程解決問(wèn)題的方式。
  2. 有些問(wèn)題天然就是使用遞歸方式定義的(例如斐波那契數(shù)列, 二叉樹(shù)等), 此時(shí)使用遞歸來(lái)解就很容易。
  3. 有些問(wèn)題使用遞歸和使用非遞歸(循環(huán))都可以解決. 那么此時(shí)更推薦使用循環(huán), 相比于遞歸, 非遞歸程序更加高效。

總結(jié)

到此這篇關(guān)于Java中方法使用的文章就介紹到這了,更多相關(guān)Java方法使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot ThreadLocal 簡(jiǎn)單介紹及使用詳解

    SpringBoot ThreadLocal 簡(jiǎn)單介紹及使用詳解

    ThreadLocal 叫做線(xiàn)程變量,意思是 ThreadLocal 中填充的變量屬于當(dāng)前線(xiàn)程,該變量對(duì)其他線(xiàn)程而言是隔離的,也就是說(shuō)該變量是當(dāng)前線(xiàn)程獨(dú)有的變量,這篇文章主要介紹了SpringBoot ThreadLocal 的詳解,需要的朋友可以參考下
    2024-01-01
  • SpringBoot實(shí)現(xiàn)發(fā)送郵件任務(wù)

    SpringBoot實(shí)現(xiàn)發(fā)送郵件任務(wù)

    這篇文章主要為大家詳細(xì)介紹了SpringBoot實(shí)現(xiàn)發(fā)送郵件任務(wù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • Spring Boot Web應(yīng)用程序配置詳解

    Spring Boot Web應(yīng)用程序配置詳解

    這篇文章主要介紹了Spring Boot Web應(yīng)用程序配置詳解,本文中將介紹一些Web應(yīng)用程序最常用的配置,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • 微服務(wù)eureka和nacos案例詳解

    微服務(wù)eureka和nacos案例詳解

    這篇文章主要介紹了微服務(wù)eureka和nacos,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • Spring Security基本原理詳解

    Spring Security基本原理詳解

    這篇文章主要介紹了Spring Security基本原理詳解,springsecurity底層實(shí)現(xiàn)為一條過(guò)濾器鏈,就是用戶(hù)請(qǐng)求進(jìn)來(lái),判斷有沒(méi)有請(qǐng)求的權(quán)限,拋出異常,重定向跳轉(zhuǎn),需要的朋友可以參考下
    2023-05-05
  • Java中快速排序優(yōu)化技巧之隨機(jī)取樣、三數(shù)取中和插入排序

    Java中快速排序優(yōu)化技巧之隨機(jī)取樣、三數(shù)取中和插入排序

    快速排序是一種常用的基于比較的排序算法,下面這篇文章主要給大家介紹了關(guān)于Java中快速排序優(yōu)化技巧之隨機(jī)取樣、三數(shù)取中和插入排序的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • 詳解java中BigDecimal精度問(wèn)題

    詳解java中BigDecimal精度問(wèn)題

    這篇文章主要介紹了java BigDecimal精度問(wèn)題,對(duì)精確計(jì)算感興趣的同學(xué),可以參考下
    2021-05-05
  • 詳解Java的位運(yùn)算

    詳解Java的位運(yùn)算

    這篇文章主要介紹了詳解Java的位運(yùn)算,程序中的所有數(shù)在計(jì)算機(jī)內(nèi)存中都是以二進(jìn)制的形式儲(chǔ)存的。位運(yùn)算就是直接對(duì)整數(shù)在內(nèi)存中的二進(jìn)制位進(jìn)行操作,需要的朋友可以參考下
    2023-04-04
  • SpringBoot?SpringSecurity?JWT實(shí)現(xiàn)系統(tǒng)安全策略詳解

    SpringBoot?SpringSecurity?JWT實(shí)現(xiàn)系統(tǒng)安全策略詳解

    Spring?Security是Spring的一個(gè)核心項(xiàng)目,它是一個(gè)功能強(qiáng)大且高度可定制的認(rèn)證和訪(fǎng)問(wèn)控制框架。它提供了認(rèn)證和授權(quán)功能以及抵御常見(jiàn)的攻擊,它已經(jīng)成為保護(hù)基于spring的應(yīng)用程序的事實(shí)標(biāo)準(zhǔn)
    2022-11-11
  • Java集合基礎(chǔ)知識(shí) List/Set/Map詳解

    Java集合基礎(chǔ)知識(shí) List/Set/Map詳解

    這篇文章主要介紹了Java集合基礎(chǔ)知識(shí) List/Set/Map,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03

最新評(píng)論