目录
方法
方法其实就是一段普通的代码片段,并且这段代码可以完成某个特定的功能,而且可以被重复的调用/使用。java 中的方法又叫做 method,在 C 语言中叫做函数。
方法定义
方法定义时:返回值类型、形参列表可以按照需求进行填写。
格式
修饰符 返回值类型 方法名( 形参列表 ){
方法体代码(需要执行的功能代码)
return 返回值;
}
- 修饰符,此项是可选项,不是必须的。
- 返回值类型,此项可以是 java 语言当中任何一种数据类型,包括基本数据类型,也包括所有的引用数据类型,当然,如果一个方法执行结束之后不准备返回任何数据,则返回值类型必须写 void。返回值类型例如:byte,short,int,long,float,double,boolean,char,String,void 等。
- 方法名,此项需要是合法的标识符,开发规范中要求方法名首字母小写,后面每个单词首字母大写,遵循驼峰命名方式,见名知意,例如:login、getUsername、findAllUser 等。
- 形式参数列表(int a, int b),此项又被称为形参,其实每一个形参都是“局部变量”,形参的个数为 0~N 个,如果是多个参数,则采用半角“,”进行分隔,形参中起决定性作用的是参数的数据类型,参数名就是变量名,变量名是可以修改的,也就是说(int a , int b)也可以写成(int x , int y)。
- 方法体,由一对儿大括号括起来,在形参的后面,这个大括号当中的是实现功能的核心代码,方法体由 java 语句构成,方法体当中的代码只能遵循自上而下的顺序依次逐行执行,不能跳行执行,核心代码在执行过程中如果需要外部提供数据,则通过形参进行获取。
示例:使用方法对2个整数求和并返回。
方法的修饰符 返回值类型 方法名 形参列表
public static int add ( int a , int b ){
int c = a + b; 执行代码
return c; 返回值
}
return; 可以立即跳出并结束当前方法的执行。
注意事项:
- 方法没有申明返回值类型,内部不能使用return返回数据。
- 方法申明了具体的返回值类型,内部必须使用return返回对应类型的数据。
- 形参列表可以有多个,甚至可以没有; 如果有多个形参,多个形参必须用“,”隔开,且不能给初始化值。
- 如果方法不需要返回结果,返回值类型必须申明成void(无返回值), 此时方法内部不可以使用return返回数据。
- 方法如果没有参数,或者返回值类型申明为void可以称为无参数、无返回值的方法,依次类推。
方法的调用
方法必须调用才可以跑起来,调用格式:格式
方法名(…);
int sum = add(10, 20);
System.out.println(sum);
常见问题:
- 方法的编写顺序无所谓。
- 方法与方法之间是平级关系,不能嵌套定义。
- 方法的返回值类型为void(无返回值),方法内则不能使用return返回数据,如果方法的返回值类型写了具体类型,方法内部则必须使用return返回对应类型的数据。
- return语句下面,不能编写代码,因为永远执行不到,属于无效的代码。
- 方法不调用就不执行, 调用时必须严格匹配方法的参数情况。
- 有返回值的方法调用时可以选择定义变量接收结果,或者直接输出调用,甚至直接调用;无返回值方法的调用只能直接调用。
案例:
找出数组的最大值。
要求:使用方法,返回任意整型数组的最大值数据。
分析:
-
根据格式编写方法
-
要返回最大值,需要申明返回值类型。
-
需要接收数组, 需要申明形参列表。
-
-
方法内部找出数组的最大值并返回。
public static void main(String[] args) {
// 需求:使用方法,支持找出任意整型数组的最大值返回。
int[] ages = {23, 19, 25, 78, 34};
int max = getArrayMaxData(ages);
System.out.println("最大值数据是:" + max);
System.out.println("-------------------");
int[] ages1 = {31, 21, 99, 78, 34};
int max1 = getArrayMaxData(ages1);
System.out.println("最大值数据是:" + max1);
}
public static int getArrayMaxData(int[] arr){
// 找出数组的最大值返回
int max = arr[0];
// 遍历数组的每个元素与最大值的数据进行比较,若较大则替换
for (int i = 1; i < arr.length; i++) {
if(arr[i] > max){
max = arr[i];
}
}
return max;
}
方法重载
- 同一个类中,出现多个方法名称相同,但是形参列表是不同的,那么这些方法就是重载方法。
方法重载(overload)是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。调用重载方法时,Java 编译器能通过检查调用的方法的参数类型和个数选择一个恰当的方法。方法重载通常用于创建完成一组任务相似但参数的类型或参数的个数不同的方法。调用方法时通过传递给它们的不同个数和类型的实参来决定具体使用哪个方法。
代码满足以下三个条件的时候可以构成方法重载。
- 在同一个类当中。
- 方法名相同。
- 参数列表不同:个数不同算不同,顺序不同算不同,类型不同也算不同
public static void main(String[] args) {
int x1=10;
int x2=20;
int retValue1 =sum(x1,x2);
System.out.println(x1+"+"+x2+"="+retValue1);
long y1 = 10L;
long y2 = 20L;
long retValue2 = sum(y1 , y2);
System.out.println(y1 + "+" + y2 + "=" + retValue2);
double z1 = 10.0;
double z2 = 20.0;
double retValue3 = sum(z1, z2);
System.out.println(z1 + "+" + z2 + "=" + retValue3);
}
public static int sum(int a,int b){
return a+b;
}
public static long sum(long a,long b){
return a+b;
}
public static double sum(double a,double b){
return a+b;
}
注:
- 方法的重载和方法的返回值类型没有关系
- 方法重载和修饰符无关
方法重载的识别技巧
-
只要是同一个类中,方法名称相同、形参列表不同,那么他们就是重载的方法,其他都不管!(如:修饰符,返回值类型都无所谓)
-
形参列表不同指的是:形参的个数、类型、顺序不同,不关心形参的名称。
题目1(训练)
定义一个方法,该方法能够找出两个小数中的较小值并返回。在主方法中调用方法进行测试。
训练提示
- 根据方法的功能描述,方法的参数应该是两个小数。
- 要返回两个小数的较小值,所以返回值类型也是小数类型。
解题方案
操作步骤
- 定义方法getMin(),方法的参数是double a ,double b。
- 在方法中对两个数字进行判断,返回较小值。
- 在主方法中调用getMin()方法并接受返回值。
- 在主方法中打印结果。
参考代码
public class Demo1 {
public static void main(String[] args) {
//调用方法
double min = getMin(3.14, 4.13);
//打印结果
System.out.println("较小值是" + min);
}
//定义求较小值的方法
public static double getMin(double a ,double b){
//对两个小数进行判断
if(a < b){
return a;
}else{
return b;
}
}
}
题目2(训练)
定义一个方法,该方法能够找出三个整数中的最大值并返回。在主方法中调用方法测试执行。
训练提示
- 根据题意,方法中需要使用三个整数,所以方法参数应该是三个整数类型。
- 方法需要有返回值,返回值的类型也是整数类型。
解题方案
操作步骤
- 定义方法getMax(),方法的参数是三个int类型变量a,b,c,方法的返回值是int类型。
- 在方法中使用多分支if…else…判断出最大值并返回。
- 在主方法中调用getMax()方法并接受返回值。
- 在主方法中打印结果。
参考代码
public class Demo2 {
public static void main(String[] args) {
//调用方法传入参数
int max = getMax(33, 44, 11);
//打印最大值
System.out.println("最大值是" + max);
}
//定义获取最大值的方法
public static int getMax(int a ,int b ,int c){
//判断出最大值并返回
if(a > b && a > c){
return a;
}else if(b > a && b > c){
return b;
}else{
return c;
}
}
}
题目3(训练)
通过键盘录入两个整数n和m。n代表行数,m代表列数。定义一个方法,方法的功能是打印n行m列的@符号。执行效果如下:
请输入行数:
4
请输入列数:
5
@@@@@
@@@@@
@@@@@
@@@@@
训练提示
- 方法内需要知道行数和列数,所以参数应该是两个整数类型。
- 方法不需要返回任何值,所以返回值类型应该是void。
解题方案
操作步骤
- 创建键盘录入对象。
- 通过键盘录入n的值代表行数,通过键盘录入m的值代表列数。
- 定义print()方法,方法的参数是两个整数n和m,返回值类型是void。
- 在方法中使用循环嵌套按照指定格式输出内容。
- 在主方法中调用print方法,传入n和m两个参数。
参考答案
public class Demo3 {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
//输入行数
System.out.println("请输入行数:");
int n = sc.nextInt();
//输入列数
System.out.println("请输入列数:");
int m = sc.nextInt();
//调用方法
print(n,m);
}
//定义打印的方法
public static void print(int n, int m){
//循环输入n行
for (int i = 0; i < n; i++) {
//循环输出m列
for (int j = 0; j < m; j++) {
System.out.print("@");
}
//每一行的最后输出换行符
System.out.println();
}
}
}
题目4(训练)
我们知道数学中有九九乘法表。请定义一个方法,方法的功能是打印nn乘法表。在主方法中键盘录入取值范围为[1-9]的变量n,测试方法。执行效果如下:
请输入一个1-9之间的整数:
4
乘法表:
1×1=1
1×2=2 2×2=4
1×3=3 2×3=6 3×3=9
1×4=4 2×4=8 3×4=12 4×4=16
训练提示
- 方法需要一个整数变量n,那么方法的参数如何定义?
- 方法的目的是做打印,那么方法的返回值类型是什么?
解题方案
操作步骤
-
创建键盘录入对象。
-
通过键盘输入一个整数变量n。
-
定义乘法表的方法,方法参数是int类型参数n,返回值类型void。
3.1. 方法内部定义嵌套循环,外层循环从1开始,到n结束,代表打印n行。
3.2.内层循环从1开始,到i结束,代表每行打印i个式子。
3.3.每行最后打印换行。
-
在主方法中对方法进行调用。
参考答案
public class Demo4 {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
//键盘录入一个整数
System.out.println("请输入一个1-9之间的整数:");
int n = sc.nextInt();
//调用方法
method(n);
}
//定义乘法表方法
public static void method(int n) {
System.out.println("乘法表:");
//外层循环n次
for (int i = 1; i <= n; i++) {
//内存循环i次
for (int j = 1; j <= i; j++) {
System.out.print(j + "×" + i + "=" +j*i + "\t");
}
//每行结尾执行换行
System.out.println();
}
}
}
题目5(训练)
在主方法中通过键盘录入三个整数。定义一个方法,方法接收三个整数变量,在方法中从大到小依次打印三个变量。执行效果如下:
请输入第一个整数:10
请输入第二个整数:30
请输入第三个整数:20
从大到小的顺序是: 30 20 10
训练提示
- 方法需要接受三个整数,那么方法的形式参数如何定义?
- 方法没有返回值的需求,返回值类型是什么?
解题方案
操作步骤
-
使用键盘录入分别录入三个整数。
-
定义method方法,方法的参数是三个int类型,方法的返回值类型是void。
2.1. 定义整数变量max用于存储最大值,定义min变量用于存储最小值。
2.2. 使用if…else…多分支判断语句计算三个整数中的最大值并赋值给max。
2.3. 使用if…else…多分支判断语句计算三个整数中的最小值并赋值给min。
2.4. 定义变量mid代表中间数,三个整数的和减去max,再减去min,就是中间数的值。
2.5. 依次打印最大值,中间值和最小值。
-
在主方法中调用method方法,传入参数。
参考答案
public class Demo5 {
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();
System.out.println("请输入第三个整数:");
int c = sc.nextInt();
//调用方法
method(a,b,c);
}
//定义方法
public static void method(int a, int b, int c) {
//定义变量存储最大值
int max = 0;
//定义变量存储最小值
int min = 0;
//判断最大值
if(a > b && a > c ){
max = a;
}else if(b > a && b > c){
max = b;
}else{
max = c;
}
//判断最小值
if(a < b && a < c ){
min = a;
}else if(b < a && b < c){
min = b;
}else{
min = c;
}
//计算中间值
int mid = a + b + c - max - min;
//按照从大到小的顺序输出
System.out.println("从大到小的顺序是:" + max + " "+ mid + " " + min);
}
}
题目6(训练)
数字是有绝对值的,负数的绝对值是它本身取反,非负数的绝对值是它本身。请定义一个方法,方法能够得到小数类型数字的绝对值并返回。请定义方法并测试。
训练提示
- 方法的功能是得到一个小数的绝对值,参数应该是一个小数类型。
- 绝对值需要被返回,返回值类型应该也是小数类型。
解题方案
操作步骤
-
定义一个小数变量num。
-
定义获取绝对值的方法,方法的参数是一个double类型,返回值类型是double。
-
在方法内部使用if…else…判断。
3.1. 如果是负数则对负数取反并返回。
3.2. 如果不是负数则直接返回数字本身。
-
在主方法中调用绝对值方法,传入参数num,并接受返回值。
-
打印返回的结果。
参考答案
public class Demo6 {
public static void main(String[] args) {
double num = -3.14;
//调用方法
double abs = abs(num);
//打印结果
System.out.println(num +"的绝对值是" + abs);
}
//定义绝对值方法
public static double abs(double num){
if(num < 0){
//如果数字是负数则取反
return -num;
}else{
//如果是非负数则返回本身
return num;
}
}
}
题目7(综合)
请定义一个方法,对正数的小数进行四舍五入的操作(不考虑负数情况)。四舍五入之后的结果是一个int整数类型并返回。最后对方法进行测试。
训练提示
- 要求对小数进行操作,方法的参数类型是一个小数类型。
- 操作之后的结果是int整数,那么返回值类型是int类型。
- 四舍五入的操作关键是十分位(小数第一位),如何获取十分位?
解题方案
操作步骤
- 定义一个正数的小数数字num。
- 定义四舍五入的方法,方法的参数是一个double类型num,返回值类型是int类型。
- 将小数乘以10后强转为int,再对10取余,能过获取到十分位数字,赋值给int类型变量a。
- 对a进行判断,如果a小于4则把num强转为int并返回(舍去小数)。
- 如果a大于等于5则把num强转为int后再加一并返回(相当于进一位)。
- 在主方法中调用四舍五入方法,传入参数num,并接收返回值。
- 打印返回的结果。
参考答案
public class Demo7 {
public static void main(String[] args) {
double num = 3.44;
//调用方法
int abs = round(num);
//打印结果
System.out.println(num +"四舍五入之后是" + abs);
}
//定义四舍五入方法
public static int round(double num){
//将小数乘以10后强转为int,再对10取余,能过获取到十分位(小数第一位)
int a = (int)(num * 10) % 10;
if(a < 5){
//如果a小于5,则四舍
return (int)num;
}else{
//如果a大于等于5,则五入
return (int)num + 1;
}
}
}
题目8(综合扩展)
一个大V直播抽奖,奖品是现金红包,分别有{2,588,888,1000,10000}五个奖金。请使用代码模拟抽奖,打印出每个奖项,奖项的出现顺序要随机且不重复。打印效果如下:(随机顺序,不一定是下面的顺序)
888元的奖金被抽出
588元的奖金被抽出
10000元的奖金被抽出
1000元的奖金被抽出
2元的奖金被抽出
训练提示
- 奖项要随机出现,但奖金不是连续的数字,不能被随机产生。能随机产生的只有数组的索引了,可以使用随机索引来代表随机元素。因为索引和元素是一一对应的,
- 哪些奖被抽过了,哪些奖没有被抽过,要定义一个数组来存放已经被抽过的奖项。
- 每个奖项只能被抽出一次,要写一个方法来控制奖项不重复。
解题方案
使用数组存放多个奖金,再使用另一个数组存放已经被抽过的奖金,使用方法来判断某个奖金是否已经被抽取过。
操作步骤
- 定义奖金的数组arr。
- 定义数组brr准备存放已经被抽过的奖金,两个数组长度相同。
- 定义一个变量index,用户代表数组brr的索引。
- 定义方法,判断数组中是否存在某数字,存在返回true,不存在返回false。
- 写一个while循环,如果index<arr.length则说明奖项没有被抽完继续抽取。
- 在循环中使用随机数产生一个随机索引i。
- 使用步骤4的方法判断brr数组中是否包含arr[i]奖金。
- 如果不包含,则打印arr[i]奖金,并且把它放入brr数组中代表已经被抽取过,同时index加一。
参考答案
public class Demo8 {
public static void main(String[] args) {
//1.定义存放奖金的数组
int[] arr = {10000,1000,588,888,2};
//2.定义数组存放已经被取过的奖金
int[] brr = new int[5];
//3.定义变量表示brr的索引
int index = 0;
//4.创建随机数对象
Random r = new Random();
//5.定义循环反复获取随机数,如果index小于arr的长度则继续循环
while(index < arr.length){
//5.1每次生成一个随机索引对应一个奖金
int i = r.nextInt(arr.length);
//5.2调用方法判断这个奖金是否被获取过
boolean b = exist(brr, arr[i]);
//5.3b是false代表这个奖金没有被抽取过
if(!b) {
//5.4把获取之后的奖金存放到brr中
brr[index] = arr[i];
//5.5index索引向后移动一次
index++;
//5.6打印本次被抽出的奖项
System.out.println( arr[i] + "元的奖金被抽出");
}
}
}
//6.定义方法:判断brr数组中是否存在num这个数字
public static boolean exist(int[] brr,int num){
//6.1对数组进行遍历
for (int i = 0; i < brr.length; i++) {
//6.2判断如果找到数字,则返回true
if(brr[i] == num){
return true;
}
}
//6.3如果最终没有找到则返回false
return false;
}
}