方法的概述及基本使用

方法的概述

假设有一个游戏程序,程序在运行过程中,要不断地发射炮弹。发射炮弹的动作需要编写100行的代码,在每次实现发射炮弹的地方都需要重复地编写这100行代码,这样程序会变得很臃肿,可读性也非常差。为了解决代码重复编写的问题,可以将发射炮弹的代码提取出来放在一个{}中,并为这段代码起个名字,这样在每次发射炮弹的地方通过这个名字来调用发射炮弹的代码就可以了。上述过程中,所提取出来的代码可以被看作是程序中定义的一个方法,程序在需要发射炮弹时调用该方法即可

简单来说:方法就是完成特定功能的代码块

在很多语言里面都有函数的定义 , 函数在Java中被称为方法

方法定义格式及格式解释

案例代码-方法定义格式

/*
 * 方法:就是完成特定功能的代码块。
 * 
 * 定义格式:
 * 		修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2...) {
 * 			方法体;
 * 			return 返回值;
 * 		}
 * 格式解释:
 * 		A:修饰符 目前记住public static
 * 		B:返回值类型 用于限定返回值的数据类型
 * 		C:方法名 一个名字,为了方便我们调用方法
 * 		D:参数类型 用于接收调用方法时传入的数据的类型
 * 		E:参数名  用于接收调用方法时传入的数据的变量
 * 		F:方法体 完成功能的代码
 * 		G:return 结束方法,把返回值带给调用者
 * 
 * 方法的两个明确:
 * 		A:返回值类型 明确功能结果的数据类型
 * 		B:参数列表 明确有几个参数,以及参数的类型
 * 
 * 案例:
 * 		求两个数和的案例。
 */

案例代码-方法的编写

package com.init;
public class FuncationDemo2 {
	/*
	 * 写一个方法,用于求和。 两个明确: 返回值类型 int 参数列表 int a,int b
	 */
public static int sum(int a,int b)
{
	return a+b;
}
public static void main(String[] args) {
}

}

案例代码-方法的调用

package com.init;

public class FunctionDemo3 {
	/*
	 * 写一个方法,用于求和。 两个明确: 返回值类型 int 参数列表 int a,int b
	 */
	public static int sum(int a,int b) {
		return a + b;
	}

	public static void main(String[] args) {
		int a, b;
		a = 10;
		b = 20;
		int sum = sum(a,b);
		System.out.println(sum);
		
	}
}

方法调用流程图

方法的练习

案例代码-两个数字比大小

package com.projects;

import java.util.Scanner;
/*
 * 需求:键盘录入两个数据,返回两个数中的较大值
 * 
 * 两个明确:
 * 		返回值类型:int
 * 		参数列表:int a,int b
 */

public class Exercise1 {
	public static int max(int a, int b) {
		return (a > b ? a : b);

	}

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入第一个数字");
		int a = scanner.nextInt();
		System.out.println("请输入第二一个数字");
		int b = scanner.nextInt();
		int max = max(a, b);
		System.out.println("最大值为:" + max);
	}
}

案例代码-两个数字是否相等

package com.projects;

import java.util.Scanner;

import sun.applet.Main;

public class Exercise2 {
	public static int equal(int a, int b) {
		if (a == b) {
			return 1;
		} else {
			return 0;
		}
	}

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入第一个数字");
		int a = scanner.nextInt();
		System.out.println("请输入第二个数字");
		int b = scanner.nextInt();
		if (equal(a, b) == 1) {
			System.out.println("两个数字相等");
		} else {
			System.out.println("两个数字不相等");
		}

	}
}

案例代码-获取三个数最大值

package com.projects;

import java.util.Scanner;
/*
 * 需求:键盘录入三个数据,返回三个数中的最大值
 * 
 * 两个明确:
 * 		返回值类型:int
 * 		参数列表:int a,int b,int c
 */

public class Exercise3 {
	public static int max(int a, int b, int c) {
		return a > b ? (a > c ? a : c) : (b > c ? b : c);
	}

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入第一个数字");
		int a = scanner.nextInt();
		System.out.println("请输入第二个数字");
		int b = scanner.nextInt();
		System.out.println("请输入第三个数字");
		int c = scanner.nextInt();
		int max =max(a, b, c);
		System.out.println("最大值为:"+max);
	}
}

案例代码-void修饰的方法的调用

package com.projects;
/*
 * 需求:写一个方法,在控制台输出10次HelloWorld案例。
 * 
 * 两个明确:
 * 		返回值类型:void
 * 		参数列表:无参数
 * 
 * 如果一个方法没有明确的返回值类型,java提供了void进行修饰。
 * 
 * void修饰的方法的调用:
 * 		A:单独调用
 */

public class Exercise4 {
	public static void hello() {
		for (int i = 1; i <= 10; i++) {
			System.out.println("Hello World!");
		}
	}

	public static void main(String[] args) {
		hello();
	}
}

案例代码-打印1到n之间的数据

package com.projects;

import java.util.Scanner;
/*
 * 需求:写一个方法,传递一个整数(大于1),在控制台打印1到该数据的值。
 * 
 * 两个明确:
 * 		返回值类型:void
 * 		参数列表:int n
 */

public class Exercise5 {
	public static void print(int a) {
		for (int i = 1; i <= a; i++) {
			System.out.println(i);
		}
	}

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入N");
		int a = scanner.nextInt();
	       print(a);
	}
}

案例代码-打印所有的水仙花数

package com.projects;
/*
 * 写一个方法,把所有的水仙花数打印在控制台
 * 
 * 两个明确:
 * 		返回值类型:void
 * 		参数列表:无参数
 */

public class Exercise6 {
	public static void printFlower() {
		for (int x = 100; x < 1000; x++) {
			int ge = x % 10;
			int shi = x / 10 % 10;
			int bai = x / 10 / 10 % 10;

			if ((ge * ge * ge + shi * shi * shi + bai * bai * bai) == x) {
				System.out.println(x);
			}
		}

	}

	public static void main(String[] args) {
		printFlower();
	}
}

方法的重载及参数传递

方法重载的概述和基本使用

在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。

方法重载特点与返回值类型无关,只看方法名和参数列表在调用时,虚拟机通过参数列表的不同来区分同名方法

案例代理-方法重载

package com.reload;
/*
 * 方法重载:在同一个类中,出现了方法名相同的方法,这就是方法重载。
 * 方法重载特点:
 * 		方法名相同,参数列表不同。与返回值无关。
 * 		参数列表不同:
 * 			参数的个数不同。
 * 			参数对应的类型不同。
 * 注意:
 * 		在调用方法的时候,java虚拟机会通过参数列表的不同来区分同名的方法。
 */

public class Exercise {
	public static void main(String[] args) {
		int a = 10;
		int b = 20;

		// 求和
		int result = sum(a, b);
		System.out.println("result:" + result);

		int c = 30;
		// 求和
		//int result2 = sum2(a,b,c);
		//System.out.println("result2:"+result2);
		result = sum(a,b,c);
		System.out.println("result:"+result);
	}
	
	
	//两个float类型的数据求和
	public static float sum(float a,float b) {
		return a + b;
	}

	// 三个整数的求和
	public static int sum(int a,int b,int c) {
		return a + b + c;
	}
	
	/*
	public static int sum2(int a, int b, int c) {
		return a + b + c;
	}
	*/

	// 两个整数的求和
	public static int sum(int a, int b) {
		return a + b;
	}

}

案例代码-方法重载练习之比较数据是否相等

package com.reload;
/*
 * 需求:比较两个数据是否相等。参数类型分别为两个byte类型,两个short类型,两个int类型,两个long类型,
 *     并在main方法中进行测试
 */

public class Exercise2 {
	public static boolean equal(byte a, byte b) {
		System.out.println("byte");
		if (a == b) {
			return true;
		} else {
			return false;
		}
	}

	public static boolean equal(short a, short b) {
		System.out.println("short");
		if (a == b) {
			return true;
		} else {
			return false;
		}
	}

	public static boolean equal(int a, int b) {
		System.out.println("int");
		if (a == b) {
			return true;
		} else {
			return false;
		}
	}

	public static boolean equal(long a, long b) {
		System.out.println("long");
		if (a == b) {
			return true;
		} else {
			return false;
		}
	}

	public static void main(String[] args) {
		// 调用
		System.out.println(equal(10, 20));
		System.out.println("-------------");
		System.out.println(equal((byte) 10, (byte) 20));
		System.out.println("-------------");
		System.out.println(equal((short) 10, (short) 20));
		System.out.println("-------------");
		// System.out.println(compare((long)10, (long)20));
		System.out.println(equal(10L, 20L));
	}
}

方法中参数传递

方法的参数是基本类型的时候

  • 形式参数的改变不影响实际参数。
  • 形式参数:用于接收实际数据的变量  
  • 实际参数:实际参与运算的变量

代码案例-参数传递

package com.reload;

public class Exercise3 {
	public static void main(String[] args) {
		// 定义变量
		int a = 10;
		int b = 20;
		System.out.println("方法外改变前");
		System.out.println("a:" + a + ",b:" + b);// a:10,b:20

		System.out.println("方法内改变前");
		change(a, b);
		System.out.println("方法内改变后");
		System.out.println("a:" + a + ",b:" + b);
		// a:10,b:20
	}

	public static void change(int a, int b) { // a=10,b=20
		System.out.println("a:" + a + ",b:" + b);// a:10,b:20
		a = b; // a=20;
		b = a + b;// b=40;
		System.out.println("a:" + a + ",b:" + b);// a:20,b:40
	}

}

案例代码-方法的形式参数为引用数据类型

package com.reload;
/*
 * 方法的参数是引用类型:
 * 		形式参数的改变直接影响实际参数
 */

public class Exercise4 {
	public static void main(String[] args) {
		// 定义数组
		int[] arr = { 1, 2, 3, 4, 5 };
		// 遍历数组
		for (int x = 0; x < arr.length; x++) {
			System.out.println(arr[x]);
		}
		System.out.println("----------------");
		change(arr);
		for (int x = 0; x < arr.length; x++) {
			System.out.println(arr[x]);
		}
	}

	public static void change(int[] arr) {
		for (int x = 0; x < arr.length; x++) {
			// 如果元素是偶数,值就变为以前的2倍
			if (arr[x] % 2 == 0) {
				arr[x] *= 2;
			}
		}
	}

}

方法&数组的练习

案例代码-方法练习之数组遍历

package com.reload;

/*
 * 需求:把遍历数组改进为方法实现,并调用方法
 */

public class Exercise5 {
public static void print(int[] arr) {
	for (int i = 0; i < arr.length; i++) {
		System.out.println(arr[i]);
	}
}
public static void main(String[] args) {
	int[] arr= {1,2,3};
	print(arr);
}
}

方法练习之数组获取最值

package com.reload;
/*
 * 需求:把获取数组最值改进为方法实现,并调用方法
 */

public class Exercise6 {
	public static void main(String[] args) {
		// 定义数组
		int[] arr = { 34, 67, 10, 28, 59 };

		// 获取数组中的最大值
		// //定义参照物
		// int max = arr[0];
		// //遍历,依次比较,大的留下来
		// for(int x=1; x<arr.length; x++) {
		// if(arr[x] > max) {
		// max = arr[x];
		// }
		// }

		// 用方法改进
		int max = getMax(arr);
		System.out.println("max:" + max);

		// 获取数组中的最小值,用方法实现
		int min = getMin(arr);
		System.out.println("min:" + min);

	}

	// 获取数组中的最小值的方法
	public static int getMin(int[] arr) {
		int min = arr[0];

		for (int x = 1; x < arr.length; x++) {
			if (arr[x] < min) {
				min = arr[x];
			}
		}

		return min;
	}

	/*
	 * 两个明确: 返回值类型:int 参数列表:int[] arr
	 */
	public static int getMax(int[] arr) {
		int max = arr[0];
		for (int x = 1; x < arr.length; x++) {
			if (arr[x] > max) {
				max = arr[x];
			}
		}

		return max;
	}

}

案例代码-方法练习之数组元素求和

package com.reload;
/*
 * 需求:写一个方法,用于对数组进行求和,并调用方法。
 */

public class Exercise7 {
	public static void main(String[] args) {
		// 定义数组
		int[] arr = { 1, 2, 3, 4, 5 };
		
		// //定义求和变量
		// int sum = 0;
		// //获取数组中的每一个元素
		// for(int x=0; x<arr.length; x++) {
		// sum += arr[x];
		// }
		
		//用方法改进
		int sum = sum(arr);
		
		System.out.println("sum:"+sum);
	}
	
	/*
	 * 两个明确:
	 * 		返回值类型:int
	 * 		参数列表:int[] arr
	 */
	public static int sum(int[] arr) {
		int sum = 0;
		
		for(int x=0; x<arr.length; x++) {
			sum += arr[x];
		}
		
		return sum;
	}

}