Java基础第五天
方法
方法概述
假设有一个游戏程序,程序在运行过程中,要不断地发射炮弹(植物大战僵尸)。发射炮弹的动作需要编写100行的代码,在每次实现发射炮弹的地方都需要重复地编写这100行代码,这样程序会变得很臃肿,可读性也非常差。为了解决代码重复编写的问题,可以将发射炮弹的代码提取出来放在一个{}中,并为这段代码起个名字,这样在每次发射炮弹的地方通过这个名字来调用发射炮弹的代码就可以了。上述过程中,所提取出来的代码可以被看作是程序中定义的一个方法,程序在需要发射炮弹时调用该方法即可。
方法定义及格式
简单的说:方法就是完成特定功能的代码块
在很多语言里面都有函数的定义
函数在Java中被称为方法
格式:
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2…) {
函数体;
return 返回值;
}
方法格式的解释说明
修饰符 比较多,后面会详细介绍。目前public static
返回值类型 用于限定返回值的数据类型
方法名 一个名称,为了方便我们调用方法
参数类型 限定调用方法时传入参数的数据类型
参数名 是一个变量,接收调用方法时传入的参数
方法体 完成功能的代码
return 结束方法以及返回方法指定类型的值
返回值 程序被return带回的结果,返回给调用者
方法案例
如何写一个方法呢?两个明确
返回值类型 明确功能结果的数据类型
参数列表 明确有几个参数,以及参数的类型
按照格式和两个明确来完成如下功能
求两个数据之和的案例
代码:
/*
方法:完成特定功能的代码块。
注意:在很多语言里面有函数的定义,而在Java中函数被称为方法。
方法格式:
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2...) {
方法体语句;
return 返回值;
}
详细解释:
修饰符:目前就用 public static。后面我们再详细的讲解其他的修饰符。
返回值类型:就是功能结果的数据类型。
方法名:符合命名规则即可。方便我们的调用。
参数:
实际参数:就是实际参与运算的。
形式参数;就是方法定义上的,用于接收实际参数的。
参数类型:就是参数的数据类型
参数名:就是变量名
方法体语句:就是完成功能的代码。
return:结束方法的。
返回值:就是功能的结果,由return带给调用者。
要想写好一个方法,就必须明确两个东西:
A:返回值类型
结果的数据类型
B:参数列表
你要传递几个参数,以及每个参数的数据类型
需求:求两个数据之和的案例
方法的执行特点:
不调用,不执行。
如何调用呢?(有明确返回值的调用)
A:单独调用,一般来说没有意义,所以不推荐。
B:输出调用,但是不够好。因为我们可能需要针对结果进行进一步的操作。
C:赋值调用,推荐方案。
案例一:
class FunctionDemo { public static void main(String[] args) { //System.out.println("Hello World!"); for(int x = 0;x < 4; x++){ for(int y = 0; y < 5; y++){ System.out.print("*"); } System.out.println(); } System.out.println("-------------"); for(int x = 0;x < 6; x++){ for(int y = 0; y < 7; y++){ System.out.print("*"); } System.out.println(); } System.out.println("--------------"); printXing(3,4); System.out.println("--------------"); printXing(6,7); System.out.println("--------------"); printXing(8,9); } public static void printXing(int m,int n) { for(int x = 0;x < m; x++){ for(int y = 0; y < n; y++){ System.out.print("*"); } System.out.println(); } } }
案例二:键盘录入三个数据,返回三个数中的较大值
import java.util.Scanner; class Test1 { 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 = compare(a,b,c); System.out.println("最大的数字="+max); } public static int compare(int a,int b,int c) { int max; if(a > b){ if(a > c){ max = a; }else{ max = c; } }else{ if(b > c){ max = b; }else{ max = c; } } return max; } }
键盘录入两个数据,比较两个数是否相等
import java.util.Scanner; class Test2 { 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(); boolean result = compare(a,b); System.out.println("输出的结果为"+result); } public static boolean compare(int a,int b) { boolean c = (a == b)?true:false; return c; } }
方法注意事项
方法不调用不执行
方法与方法是平级关系,不能嵌套定义
方法定义的时候参数之间用逗号隔开
方法调用的时候不用在传递数据类型
如果方法有明确的返回值,一定要有return带回一个值
没有明确返回值的函数调用:
其实就是void类型方法的调用
只能单独调用
void类型返回值的方法调用:
单独调用
输出调用(错误)
赋值调用(错误)
返回值为void类型的方法练习
键盘录入行数和列数,输出对应的星形
import java.util.Scanner; class Test3 { 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(); print(a,b); } public static void print(int a,int b) { for(int i = 0;i < a; i++){ for(int j = 0; j < b; j++){ System.out.print("* "); } System.out.println(); } } }
键盘录入一个数据n(1<=n<=9),输出对应的nn乘法表
import java.util.Scanner; class Test4 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); //System.out.println("Hello World!"); int n = scanner.nextInt(); Jiu(n); } public static void Jiu(int n) { for(int i = 1;i <= n; i++){ for(int j = 1;j <= i ; j++){ System.out.print(i+"*"+j+"="+i*j+"\t"); } System.out.println(); } } }
方法重载
方法重载概述
在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。
方法重载特点
与返回值类型无关,只看方法名和参数列表
在调用时,虚拟机通过参数列表的不同来区分同名方法
需求:我要求数的和
我们的需求不断的发生改变,我们就对应的提供了多个求和的方法。
但是呢,他们的名字是不一样的。
而我们又要求方法命名做到:见名知意。
但是,很明显,现在没有做到。
那么,肿么办呢?
针对这种情况:方法的功能相同,参数列表不同的情况,为了见名知意,Java允许它们起一样的名字。
其实,这种情况有一个专业名词:方法重载。
方法重载:
在同一个类中,方法名相同,参数列表不同。与返回值类型无关。
参数列表不同:
A:参数个数不同
B:参数类型不同
class FunctionDemo4 { public static void main(String[] args) { System.out.println(sum(10,20)); System.out.println(sum(10,20,30)); System.out.println(sum(10,20,30,40)); System.out.println(sum(10.5f,20f)); } public static int sum(int a,int b) { System.out.println("int"); 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,int c,int d) { return a + b + c + d; } public static float sum(float a,float b) { System.out.println("float"); return a + b; } }
比较两个数据是否相等。参数类型分别为两个byte类型,两个short类型,两个int类型,两个long类型,并在main方法中进行测试
class FunctionTest6 { public static void main(String[] args) { //测试 byte b1 = 3; byte b2 = 4; System.out.println("byte:"+compare(b1,b2)); //测试 short s1 = 5; short s2 = 5; System.out.println("short:"+compare(s1,s2)); } //byte类型 public static boolean compare(byte a,byte b) { System.out.println("byte"); return a == b; } //short类型 public static boolean compare(short a,short b) { System.out.println("short"); return a == b; } //int类型 public static boolean compare(int a,int b) { System.out.println("int"); return a == b; } //long类型 public static boolean compare(long a,long b) { System.out.println("long"); return a == b; } }