1.1 方法概述
经过前几节的学习,相信大家都有了一定的编码基础,而且我们的执行代码都是写在主方法 main 里面的,接下来我们介绍一下自定义方法是如何实现的呢?
假设有一个游戏程序,程序在运行过程中,要不断地发射炮弹(植物大战僵尸)。发射炮弹的动作需要编写 100 行的代码,在每次实现发射炮弹的地方都需要重复地编写这 100 行代码,这样程序会变得很臃肿,可读性也非常差。
为了解决代码重复编写的问题,可以将发射炮弹的代 码提取出来放在一个{}中,并为这段代码起个名字,这样在每次发射炮弹的地方通过这个名字来调用发射炮弹的代码就可以了。上述过程中,所提取出来的代码可以被看作是程序中定义的一个方法,程序在需要发射炮弹时调用该方法即可。
1.2 定义格式
- 简单的说:方法就是完成特定功能的代码块
- 在很多语言里面都有函数的定义
- 函数在 Java 中被称为方法
- 格式
- 修饰符 返回值类型 方法名(参数类型 参数名 1,参数类型 参数名 2…) {
方法体;
return 返回值;
}
- 修饰符 返回值类型 方法名(参数类型 参数名 1,参数类型 参数名 2…) {
- 格式解释
- 修饰符 目前记住 public static
- 返回值类型 用于限定返回值的数据类型
- 方法名 一个名字,为了方便我们调用方法
- 参数类型 用于接收调用方法时传入的数据的类型
- 参数名 用于接收调用方法时传入的数据的变量
- 方法体 完成功能的代码
- return 结束方法,把返回值返回给调用者
- 写一个方法首先有两点需要明确
- 返回值类型 明确功能结果的数据类型
- 参数列表 明确有几个参数,以及参数的类型
- 注意事项:方法定义完成之后,没有调用没有意义,不调用不执行。
例:求和
package com.study.demo.methoddemo;
/**
* @Auther: lds
* @Date: 2018/10/29 10:13
* @Description: 求和
*/
public class MethodDemo01 {
/*
* 写一个方法,用于求和。
* 两个明确: 返回值类型 int 参数列表 int a,int b
*/
public static int sum(int a, int b) {
/*int c = a + b;
return c;*/
return a + b;
}
}
- 求和方法的调用(有明确返回值)
- 使用格式:方法名(参数);
- 单独调用
sum(10,20); - 输出调用
System.out.println(sum(10,20)); - 赋值调用,推荐方式
int s = sum(10, 20);
// s+=100;
System.out.println("s:"+s);
- 求和图解
练习:获取三个数据中的较大值
package com.study.demo.methoddemo;
import java.util.Scanner;
/**
* @Auther: lds
* @Date: 2018/10/29 10:17
* @Description:获取三个数据中的较大值
*/
public class MethodDemo02 {
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();
// 调用方法
int max = getMax(a, b, c);
System.out.println("max:" + max);
}
// 返回三个数中的最大值
public static int getMax(int a, int b, int c) {
if (a > b) {
if (a > c) {
return a;
} else {
return c;
}
} else {
if (b > c) {
return b;
} else {
return c;
}
}
}
}
1.3 Void 修饰的方法
-
格式
修饰符 void 方法名(参数类型 参数名 1,参数类型 参数名 2…) {
方法体;
return 返回值;
} - 没有明确返回值的函数调用:
- 其实就是 void 类型方法的调用
- 只能单独调用
例:写一个方法,在控制台输出 10 次 HelloWorld 案例。
package com.study.demo.methoddemo;
/**
* @Auther: lds
* @Date: 2018/10/29 10:20
* @Description:在控制台输出 10 次 HelloWorld
*/
public class MethodDemo03 {
public static void main(String[] args) {
// 单独调用
printHelloWorld();
}
// 在控制台输出 10 次 HelloWorld
public static void printHelloWorld() {
for (int x = 1; x <= 10; x++) {
System.out.println("HelloWorld");
}
}
}
例:定义一个方法,传递一个整数(大于 1),在控制台打印 1 到该数据的值。
package com.study.demo.methoddemo;
/**
* @Auther: lds
* @Date: 2018/10/29 10:24
* @Description:定义一个方法,传递一个整数(大于 1),在控制台打印 1 到该数据的值。
*/
public class MethodDemo04 {
public static void main(String[] args) {
printNumber(10);
System.out.println("-------------------");
printNumber(100);
}
// 在控制台打印 1 到该数据 n 的值
public static void printNumber(int n) {
for (int x = 1; x <= n; x++) {
System.out.println(x);
}
}
}
1.4 方法重载
- 方法重载概述
- 在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型
不同即可
- 在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型
- 方法重载特点
- 与返回值类型无关,只看方法名和参数列表
- 在调用时,虚拟机通过参数列表的不同来区分同名方法
- 基本使用
package com.study.demo.methoddemo;
/**
* @Auther: lds
* @Date: 2018/10/29 10:31
* @Description:
*/
public class MethodDemo05 {
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;
// 求和
result = sum(a, b, c);
System.out.println("result:" + result);
}
// 两个 float 类型的数据求和
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;
}
}
1.5 方法参数传递问题
- 参数传递概述
可以理解当我们要调用一个方法时,我们会把指定的数值,传递给方法中的参数,这样方法中的参数就拥有了这个指定的值,可以使用该值,在方法中运算了。这种传递方式,我们称为参数传递 - 在这里,定义方法时,参数列表中的变量,我们称为形式参数
- 调用方法时,传入给方法的数值,我们称为实际参数
- 参数是基本类型及图解
形式参数的改变不影响实际参数。
package com.study.demo.methoddemo;
/**
* @Auther: lds
* @Date: 2018/10/29 10:41
* @Description:参数是基本类型
*/
public class ArgsDemo01 {
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
}
}
- 参数是引用数据类型及图解
package com.study.demo.methoddemo;
/**
* @Auther: lds
* @Date: 2018/10/29 10:41
* @Description:参数是引用类型
*/
public class ArgsDemo01 {
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
}
}
练习:定义方法,实现数组元素求和
package com.study.demo.methoddemo;
/**
* @Auther: lds
* @Date: 2018/10/29 10:49
* @Description:定义方法,实现数组元素求和
*/
public class MethodDemo06 {
public static void main(String[] args) {
// 定义数组
int[] arr = {1, 2, 3, 4, 5};
//调用数组元素求和方法
int sum = sum(arr);
System.out.println("sum:" + sum);
}
/*
* 定义数组元素求和方法
* 两个明确:
* 返回值类型:int
* 参数列表:int[] arr
*/
public static int sum(int[] arr) {
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
return sum;
}
}