方法:就是完成特定功能的代码块
定义格式:
修饰符 返回值类型 方法名(参数类型 参数名1, 参数类型 参数名2, ...) { 方法体; return 返回值; }格式解释: 修饰符:目前记住这里使用public static即可 返回值类型: 用于限定返回值的数据类型 方法名: 方便我们调用方法 参数类型:用于限定调用方法时传入的数据的数据类型 参数名: 用于接受调用方法时传入的数据的变量 方法体: 完成特定功能的代码 return 返回值: 结束方法,并且把返回值带给调用者
需求:求两个数据之和
两个明确:
public static 返回值类型 sum(参数类型 参数名1, 参数类型 参数名2, ...) {...} 返回值类型:明确方法结果的数据类型 int 参数列表:明确有几个参数参加,每个参数都是什么数据类型 int a, int b注意事项:方法与方法是平级关系,不能嵌套定义
public static int sum(int a, int b) { int c = a + b; return c; }方法调用:(有明确返回值的方法的调用)
单独调用,没有意义赋值调用(我们推荐的方式)输出调用 public static void main(String[] args) { //根据方法名来调用 //sum(); //调用方法不仅仅看方法名,还要看方法的参数(个数和类型) //sum(10,20); (单独调用,无意义) //该方法返回了一个int类型的值,所以我们应该用已int类型的变量接受 int result = sum(10,20); System.out.println("result:"+result); //输出调用 System.out.println(sum(10,20)); } public static int sum(int a, int b) { int c = a + b; return c; }练习1
需求:键盘录入两个数据,返回两个数中的较大值
思考:键盘录入两个数据的动作放在哪里比较合适? 假如键盘录入数据的动作放在了返回两个数中较大值的方法里面,那么我如果不想返回键盘录入的数据的较大值,我只想返回两个固定值的较大值,我们又得修改代码了。这个时候发现是不合理的,所以我们应该把键盘录入数据的动作放在main方法中。
命名习惯:
类: 如果是一个单词,首字母大写。Student 如果是多个单词,每个单词的首字母大写。HelloWorld方法 和变量命名是一样的规则。 如果是一个单词,首字母小写。sum() 如果是多个单词,从第二个单词开始,每个单词首字母大写。getMax() public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入第一个数据"); int a = sc.nextInt(); System.out.println("请输入第二个数据"); int b = sc.nextInt(); int max = getMax(a,b); System.out.println("max:"+max); } public static int getMax(int a, int b) { if(a > b) { return a; }else { return b; } }练习2
需求:键盘录入两个数据,比较两个数据是否相等
两个明确: 返回值类型:boolean 参数列表:int a, int b
public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入第一个数字"); int a = sc.nextInt(); System.out.println("请输入第二个数字"); int b = sc.nextInt(); //调用方法(返回什么数据类型就用什么数据类型接收) boolean c = compare(a,b); System.out.println(c); } public static boolean compare(int a, int b) { if(a == b) { return true; }else { return false; } }需求:写一个方法,在控制台输出10次HelloWorld案例
两个明确:
返回值类型:void参数列表:没有参数如果一个方法没有明确的返回值类型,也不能把返回值类型空出来。这里应该写void表示该方法无返回值类型。
public static void main(String[] args) { //单独调用 printHelloWorld(); //输出调用 //System.out.println(printHelloWorld()); //赋值调用 //void v = printHelloWorld(); } public static void printHelloWorld() { for(int x=1; x<=10; x++) { System.out.println("HelloWorld"); } }void修饰的方法只能单独调用
练习1
需求:写一个方法,把所有水仙花数打印在控制台
两个明确:
返回值类型:void参数列表: public static void main(String[] args) { //调用方法 printFlower(); } 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); } } }练习2
需求:写一个方法,打印1到n之间的数据(n是调用的时候传递过来的) 隐含:n>=1
两个明确:
返回值类型:void参数列表:int public static void main(String[] args) { printNumber(3); printNumber(5); } public static void printNumber(int n) { for(int x=1; x<=n; x++) { System.out.println(x); } }方法重载:在同一个类中,出现了方法名相同的情况。
方法重载的特点:
方法名相同,参数列表不同。(参数的个数不同;参数对应的数据类型不同)方法重载与返回值无关注意事项:在调用方法的时候,java虚拟机会根据方法名及参数列表的不同来区分方法。
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); int result2 = sum(a,b,c); System.out.println("result2:"+result2); } /* //求三个数据的和 public static int sum2(int a, int b, int c) { return a + b + c; } */ 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 sum(int a, int b) { return a + b; }需求:比较两个数据是否相等。参数类型分别为两个byte类型,两个short类型,两个int类型,两个long类型,并在main方法中进行测试。
public static void main(String[] args) { System.out.println(compare(10,20)); System.out.println(compare((byte)10,(byte)20)); System.out.println(compare((short)10,(short)20)); System.out.println(compare(10L,20L)); } public static boolean compare(byte a, byte b) { /* if(a == b) { return true; }else { return false; } */ System.out.println("byte"); return a == b; } public static boolean compare(short a, short b) { System.out.println("short"); return a == b; } public static boolean compare(int a, int b) { System.out.println("int"); return a == b; } public static boolean compare(long a, long b) { System.out.println("long"); return a == b; }基本数据类型作为方法的参数传递,形式参数的改变不影响实际参数。 引用数据类型作为方法的参数传递,形式参数的改变直接影响实际参数。
形式参数:用于接收实际参数的变量实际参数:实际参与运算的数据 public static void main(String[] args) { int a = 10; int b = 20; System.out.println("a:" + a + ",b:" + b);//a:10,b:20 change(a, b); 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 } 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]);//1,2,3,4,5 } change(arr); for (int x = 0; x < arr.length; x++) { System.out.println(arr[x]);//1,4,3,8,5 } } public static void change(int[] arr) { for (int x = 0; x < arr.length; x++) { //如果数组的元素是偶数,值就变成了以前的2倍 if (arr[x] % 2 == 0) { arr[x] *= 2; } } }练习1
需求:把遍历数组改进为方法实现,并调用方法
两个明确:
返回值类型:void参数列表:int[] arr public static void main(String[] args) { int[] arr = {11,22,33,44,55}; //调用方法 //printArray(arr); //我们已经实现了需求,但是我们想要如下的效果 //[元素1, 元素2, 元素3, ...] //我们的结果应该是这样的:[11, 22, 33, 44, 55] printArray(arr); } /* public static void printArray(int[] arr) { for(int x=0; x<arr.length; x++) { System.out.println(arr[x]); } } */ public static void printArray(int[] arr) { System.out.print("["); for(int x=0; x<arr.length; x++) { //判断是否是最后一个元素 if(x == arr.length) { System.out.print(arr[x]); }else { System.out.print(arr[x]+", "); } } System.out.println("]"); }练习2
需求:把获取数组最值改进为方法实现,并调用方法
两个明确:
返回值类型:int参数列表:int[] arr public static void main(String[] args) { int[] arr = {24,36,90,75,81}; //调用方法 int max = getMax(arr); System.out.println("max:"+max); } 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; }