方法
1 方法的概述
将特定功能的代码使用代码块放在一起,并且具有自己的名字。可以重复利用的代码,就是方法。
2 方法的格式
- 方法就是完成特定功能的代码块
- 在很多语言里面都有函数的定义
- 函数在java中就称之为方法
- 格式
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2...){
方法体;
return 返回值;
}
- 格式解释
- 修饰符:目前先记住就是 public static
- 返回值类型:就是确定最终return的返回值的数据类型
- 方法名:如果只有一个单词,那么就小写,如果有多个,第一个单词小写,其他单词首字母大写
- 参数列表: 参数的数据类型 参数1… 多个参数中间有,隔开
- 方法体:就是重复利用的特定功能代码
- return :是一个关键字 会立即结束当前方法,并且会将返回值返回到方法外面。
注意:方法不能嵌套
注意:方法定义在其他方法的上面或者下面是无所谓的,不会影响方法的执行顺序。
3 方法的调用
方法如果没有被调用,方法中的代码是不会执行的。
方法调用的格式:
方法名(参数);
哪一行调用方法,方法的返回值就返回到哪一行
- 定义方法,比较两个数字是否相等
// 比较两个数字是否相等 相等时返回true,不相等时返回false
public static boolean compare(int x,int y){
// if (x == y){
// return true;
// }else {
// return false;
// }
return x == y;
}
- 定义方法,获取三个数字的最大值
// 定义一个方法,获取三个数字的最大值
public static int getMax(int a,int b,int c){
int max1 = (a > b) ? a : b;
return (max1 > c) ? max1 : c;
}
4 void修饰的方法
void代表方法不需要返回值。
格式:
修饰符 void 方法名(参数列表){
方法体;
return;
}
- 在控制台输出所有的水仙花数
// 定义一个方法,把所有的水仙花数打印在控制台上
public static void flowers(){
for (int i = 100;i < 1000;i++){
int ge = i % 10;
int shi = i / 10 % 10;
int bai =i / 100 % 10;
if ((ge * ge * ge + shi * shi * shi + bai * bai * bai) == i){
System.out.println("水仙花数是" + i);
}
}
}
5 方法的重载
在一个java类中,允许方法有相同的名称,但是参数列表需要不一致。
参数列表不一致:
- 参数的个数不一样
- 参数的类型不一样
- 多个参数的情况下,参数的数据类型顺序不一样
本质上只要在调用方法时能够区分开方法,就可以重载。
方法的重载和修饰符以及返回值类型无关。
6 方法参数传递的问题
- 形式参数(形参):在方法定义时,在小括号内的参数。
- public static void sum(int a,int b){}
- 实际参数(实参):在方法调用时,传入小括号中的参数。
- sum(10,20);
注意:
- 对于基本数据类型和String,形式参数的改变不会影响实际参数。
public class TestDemo5 {
public static void main(String[] args) {
// 对于基本数据类型和String,形式参数的改变不会影响实际参数。
int a = 10;
int b = 20;
System.out.println(a);//10
System.out.println(b);//20
change(a,b);
System.out.println(a);//10
System.out.println(b);//20
}
public static void change(int x,int y){
x *= 10;
y *= 10;
System.out.println("x = " + x);//100
System.out.println("y = " + y);//200
}
}
- 对于引用数据类型(不包含String),形式参数的改变会影响实际参数。
public static void main(String[] args) {
// 对于引用数据类型(不包含String),形式参数的改变会影响实际参数
int[] array = {10,20,30};
System.out.println(array[0]);//10
System.out.println(array[1]);//20
System.out.println(array[2]);//30
change(array);
System.out.println(array[0]);//100
System.out.println(array[1]);//200
System.out.println(array[2]);//300
}
public static void change(int[] array){
array[0] *= 10;
array[1] *= 10;
array[2] *= 10;
System.out.println(array[0]);//100
System.out.println(array[1]);//200
System.out.println(array[2]);//300
}
7 方法的递归
在本方法执行的使用调用自身方法
- 定义方法,求1到传入数字的和
/**
* sum(10) = 10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1
* sum(10) = 10 + sum(9)
* sum(10) = 10 + 9 + sum(8)
* ...
* sum(10) = 10 +9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1
*/
public static int sum(int num){
// sum(num) = num + sum(num - 1)
if (num == 1){
return 1;
}
return num + sum(num - 1);
}
使用递归一定要记得留递归的出口,否则会出现StackOverflowError 栈溢出错误
8 练习
- 汉诺塔问题
有三个金刚石塔。第一个塔上面从小到大摆放着64个黄金圆盘。现在把圆盘按大小顺序重新放到另一个塔上。并且规定,在小圆盘上不能放大圆盘。在三个塔之间一次只能移动一个圆盘。
要求将64个黄金圆盘最理想的移动轨迹打印在控制台上。
/**
* 定义一个方法,实现汉诺塔移动问题
* @param n 代表的是盘子的数量
* @param A 代表需要移动盘子的柱子
* @param B 代表中间辅助的柱子
* @param C 代表需要将盘子移动到的柱子
*/
public static void hanio(int n,char A,char B,char C){
if (n == 1){
System.out.println(A + "-->" + C);
}else {
hanio(n - 1, A, C, B);
System.out.println(A + "-->" + C);
hanio(n - 1, B, A, C);
}
}