方法
之前讲解的循环操作,可以解决的是代码重复的问题,但是此时的重复的代码必须是有规律的。那循环操作,能解决所有的代码重复吗?答案肯定是不行的,比如针对于某一种功能的重复操作,循环解决不 了,终于方法就该登场了。
举个例子:
编写一个飞机大战游戏,程序在运行过程中,需要不断地发射子弹。假设发射子弹功能需要编写200行 代码,那么,每次发射子弹都需要重复地编写这200行代码,这样的程序太low了。在开发中我们要遵循DRY原则(Don’t Repeat Youself)—— 不要重复你自己的代码,因为重复意味着维护成本很大, 如果要修改功能代码,则每一个重复的地方都要修改一次,你敢确保每个重复的地方都能改到吗?何况,你不感到厌烦吗?不无聊吗?
为了解决功能代码重复编写的问题,可以把发射子弹的代码提取出来专门放在一个代码块(一对{}) 中,并为这段代码起个唯一的名字,如此,每次发射子弹的时候直接通过这个名字就可以调用发射子弹 的功能代码了。
上述过程中,被提取出来的代码可以就是类中定义的一个方法。
编辑
方法的定义
方法:完成某一特定功能(如:求和,统计数量等)的代码块定义方法。
语法格式:
[修饰符] 返回值类型 方法名称(参数类型 参数名称1,参数类型 参数名称2){ 方法体; [return 返回值;] }
看看main方法的定义。
编辑
格式分析:
(1)修饰符:public、static等,static修饰的方法直接使用类名调用即可,目前都使用static修饰;
(2)返回类型:限定返回值的类型,方法在完成一个功能后:
如果需要给调用者返回结果,就写上返回数据的类型;
如果不需要给调用者返回结果,此时使用关键字void,表示无返回。
(3)方法名称:用于调用方法,遵循标识符规范,使用动词表示,首字母小写,采用用驼峰表示法;
(4)形式参数:方法圆括号中的变量,可以有多个;
(5)方法体:方法的{}中的代码,编写如何完成该功能的代码;
(6)return关键字:在方法体中使用return关键字。
功能1:把值返回给该方法调用者,此时该方法不能使用void修饰;
功能2:结束当前方法。
注意:方法体没有return时,方法的返回类型声明为void,表示无返回。
(7)实际参数:在调用某一个具体方法时,实际传递的参数值。
注意:
(1)方法必须定义在类中,在Java中最小的程序单元是类,必须先有类一个类中可以定义多个方法;
(2)方法和方法是平行的,不能在方法中定义另一个方法方法的定义没有先后顺序。
方法调用
(1)在MethodDemo类中,定义一个求两个整数之和的方法
方法定义分析:
求两个数之和,到底是哪两个整数?说明有两个未知的因素,使用两个int类型变量表示。该方法要求求两个数之和,必定需要给调用者返回一个结果,否则,毫无意义。
static int getSum(int a,int b){ int c = a + b; return c; }
注意:
(1)方法中的int a和int b就是形式参数,即使参数名不叫a和b,也不影响,仅仅是变量名唯一。
(2)方法定义出来,必须要调用才能生效。
方法调用
(1)方法调用格式:因为方法是static修饰的,可以直接用方法所在类的名称调用。
(2)如果方法有返回类型,此时需要返回类型定义变量,接受方法返回的结果,并打印,这才有意义。
(3)调用方法的地方,可以称之为调用者
语法格式:
返回值类型 变量 = 方法所在类名.方法名(实际参数);
(4)调用方法时,传递的参数2和3就是实际参数,简称参数,和顺序,类型有关。
完整代码如下:
public class MethodDemo { static int getSum(int a,int b){ int c = a + b; return c; } public static void main(String[] args) { int result = MethodDemo.getSum(1, 2); System.out.println(result); } }
画图分析:
编辑
方法设计
(1)定义一个方法,打印指定行数的指定字符串
static void print(int line,String output){ for (int i = 0; i < line; i++) { System.out.println(output); } }
调用方法:
public static void main(String[] args) { Demo40.print(7,"Hello"); }
(2)定义一个方法,传入一个int数组,按照格式打印int类型数组
static void printArray(int[] arr){ String str = "["; for (int i = 0; i < arr.length; i++) { str = str + arr[i]; if (i == arr.length - 1) { str = str + "]"; }else { str = str + ","; } } System.out.println(str); }
调用方法:
public static void main(String[] args) { int[] arr = new int[]{1,2,3,4,5}; Demo41.printArray(arr); }
(3)定义一个方法,传入一个int数组,返回指定元素在数组中第一次出现的索引
static int indexOf(int[] arr,int key){ for (int i = 0; i < arr.length; i++) { if (arr[i] == key) { return i; } } return -1; }
调用方法:
public static void main(String[] args) { int[] arr = new int[]{1,2,3,4,5}; System.out.println(Demo42.indexOf(arr, 3)); }
(4)定义一个方法,传入一个int数组,返回该数组所有元素的平均数
static double getAvg(int[] arr){ int total = 0; for (int ele: arr){ total += ele; } return total / arr.length; }
调用方法:
public static void main(String[] args) { int[] arr = new int[]{1,2,3,4,5}; System.out.println(Demo43.getAvg(arr)); }
(5)定义一个方法,传入两个参数,一个double数组表示多个货品的价格,一个double类型的折扣,返回货品总价格
static double getTotalPrice(double[] arr,double cutOff){ double total = 0; for (double ele: arr){ total += ele; } return total * cutOff; }
调用方法:
public static void main(String[] args) { double[] arr = new double[]{1,2,3,4,5}; System.out.println(Demo44.getTotalPrice(arr, 0.5)); }
方法可变参数
在方法中传递数组有一种更简单的方式——方法的可变参数,其本质是一个语法糖,目的是让开发者写 代码更简单。
(1)方法的可变参数其底层是就是一个一维数组类型
(2)可变参数必须作为方法的最后一个参数,避免多个参数的歧义性
(3)推论:方法最多只有一个可变参数
(6)定义一个方法,传入两个参数,一个double数组表示多个货品的价格,一个double类型的折扣,返回货品总价格(使用可变参数)
static double getTotalPrice(double cutOff,double... arr){ double total = 0; for (double ele: arr){ total += ele; } return total * cutOff; }
调用方法:
public static void main(String[] args) { double[] arr = new double[]{1,2,3,4,5}; System.out.println(Demo45.getTotalPrice(0.8, arr)); System.out.println(Demo45.getTotalPrice(0.8, 1,5,9,7)); }
方法重载
(1)参数列表:参数的类型 + 参数的个数 + 参数的顺序
(2)方法签名:方法名称 + 方法参数列表,在同一个类中,方法签名是唯一的,否则编译报错
方法的重载设计(Overload),表示在同一个类中,允许某方法存在一个以上的同名方法,只要它们的参数列表不同即可。
方法重载判断原则:“两同一不同”
两同:在同一个类中,方法名是相同的;
一不同:方法参数列表不同(参数类型、参数个数、参数顺序)。
只要参数类型、参数个数、参数顺序任意一个不同,就叫参数列表不同方法重载的作用:屏蔽了同一功能的方法由于参数不同所造成方法名称不同。
注意:方法重载和方法的返回值类型无关,只是一般要求返回值类型相同。
方法参数的值传递机制
基本类型参数
static void change(int x) { System.out.println("change before,x=" + x); //10 x = 100;// 修改x变量的值 System.out.println("change after,x=" + x);//100 } public static void main(String[] args) { int a = 10; System.out.println("main before,a=" + a);//10 change(a); System.out.println("main after,a=" + a);//100? 10? }
输出结果:
main before,a=10 change before,x=10 change after,x=100 main after,a=10
编辑
当把main方法中a变量的值复制一份,传递给change方法,main方法中的a变量的值不受改变。
引用类型参数
static void change(int[] arr) { System.out.println("change before,arr[0]=" + arr[0]);//10 arr[0] = 30; //修改数组中第一个元素的值 System.out.println("change after,x[0]=" + arr[0]);//30 } public static void main(String[] args) { int[] a = new int[] { 10, 90 }; System.out.println("main before,a[0]=" + a[0]);//10 change(a); System.out.println("main after,a[0]=" + a[0]);//30 }
输出结果:
main before,a[0]=10 change before,arr[0]=10 change after,x[0]=30 main after,a[0]=30
编辑
以上就是Java入门第五天的全部内容了。
资料文档地址:Java开发零基础篇:day05方法.pdf