方法
返回值
方法中的返回值有两种情况,即有返回值和无返回值,如果定义方法时有返回值类型,就需要返回相对应的数据类型
基本数据类型
值传递,不改变自身
引用数据类型
引用传递,改变自身
void
无返回值
1、一个方法只能有一个返回值
2、分支结构的每一个分支都需要正确的返回值
3、返回值可以接收也可以不接收
return 关键字
作用
结束当前方法,返回至调用方法处,如果定义了返回值类型就返回对应类型的数据
【注意】数据类型一致化
格式
return 需要返回的数据;
注意
1、单一职能原则,一个方法只做一件事
2、注意形参和实参数据类型一致化
3、返回值类型和参数没有关系
4、方法名要符合小驼峰命名规则
5、return的下一行代码不会执行
有返回值方法调用
无参有返回值的方法:give me five
class TestMethod1 {
public static void main(String[] args) {
System.out.println(giveMeFive());
}
/**
* 返回一个整数 5
*
* @return 5 int类型
*/
public static int giveMeFive() {
return 5;
}
}
有参有返回值的方法:两个数求和
public class MethodDemo6 {
public static void main(String[] args) {
/*
* 调用自定义getSumOfTwoNumber方法,需要两个int类型的参数,并得到一个int类型的返回值
*
* 参数列表一定要和方法声明上的参数类型完全一致
*/
int total = getSumOfTwoNumber(1, 2);
System.out.println(total);
}
/**
* 两个整数进行求和
*
* @param num1 求和的第一个数
* @param num2 求和的第二个数
* @return 返回两个参数的和,int类型
*/
public static int getSumOfTwoNumber(int num1, int num2){
return num1 + num2;
}
}
【注意】调用带有多参数的方法,要求传入的参数数据类型,个数和顺序还有数据类型必须和方法声明一致
规范化return
在一个方法中,return出现的次数要尽可能得少,为了提高阅读性和逻辑性
class TestMethod4 {
public static void main(String[] args) {
System.out.println(getCompare(3,2));
}
/**
* 比较大小,返回较大的那个数
*
* @param num1 int类型
* @param num2 int类型
* @return int类型的结果
*/
public static int getCompare(int num1, int num2) {
return num1 > num2 ? num1 : num2;
}
}
总结
1、break 是退出当前循环结构,return 是退出当前方法
2、如果返回值类型是 void ,可以返回 null 或者不返回或者 return;
3、一个方法可以有多个 return,但只能有一个返回值
4、返回值可以接收也可以不接收,由调用者决定如何调用
5、分支结构里的每一个分支都需要有正确的返回值
6、对返回值的处理方式因情况而定,可以打印、参与运算或者当做其他方法的实参
7、调用带有多参数的方法,要求传入的参数数据类型,个数和顺序和类型必须和方法声明一致
【注意】方法具有单一职能原则,一个函数只做一件事
方法重载【Overload】
概念
一个类或者接口中定义多个相同名称的方法
要求
1、必须在同一个类中
2、方法名必须一致
3、参数必须不一致(个数,顺序,类型)
4、与访问修饰符、返回值类型无关
public class MethodDemo9 {
public static void main(String[] args) {
// 调用同名方法,传入不同的参数列表,即可实现方法的重载
play();
play("英雄联盟");
play("红色警戒", 2);
play(1, "DNF");
}
public static void play() {
System.out.println("玩王者荣耀");
}
public static void play(String gameName) {
System.out.println("玩" + gameName);
}
public static void play(String gameName, int time) {
System.out.println("玩" + gameName + time + "小时");
}
public static void play(int time, String gameName) {
System.out.println("玩" + gameName + time + "小时");
}
/*
* Duplicate method play(String, int) in type MethodDemo9
*
* 跟返回值类型无关,只关注方法名和参数类型
*/
// public static String play(String gameName, int time) {
// return "玩" + gameName + time + "小时";
// }
}
优点
满足需求多样化,屏蔽使用差异,灵活、方便
总结
方法的重载我们只关注方法名和参数类型,要求方法名必须一致,参数列表必须不一致(个数,顺序,类型)
局部变量
概念
在方法内部或者形参列表上定义的变量(包括mian方法)
作用域
从定义局部变量的那一行到所在的代码块结束
for (int i = 1; i <= 10; i++) {
}
for (int i = 1; i <= 10; i++) {
}
【注意】两个for循环中,i 循环变量分别属于不同的大括号以内,不同的作用域空间,并不冲突
生存期
从方法被调用的时刻算起到函数返回调用处的时刻结束
for (int i = 1; i <= 10; i++) {
}
System.out.println(i); // 报错,找不到符号
【注意】for 循环结束时局部变量 i 的生存期结束,在 for 循环外无法使用 i
单一性,不能重名
// 报错!
for (int i = 1; i <= 10; i++) {
for (int i = 1; i <= 10; i++) {
}
}
【注意】在一个方法内局部变量不能多次定义
值传递
class Test {
public static void main(String[] args) {
int num = 5;
test(num);
System.out.println(num); // 5
}
public static void test(int num) {
num = 10;
}
}
【注意】基本数据类型作为参数传递给局部变量时,传递的是值,局部变量的更改不影响实参本身
| 值传递分析图 |
引用传递
public class MethodDemoC {
public static void main(String[] args) {
int[] arr = new int[5];
System.out.println("调用方法前:" + arr[0]);
test(arr);
System.out.println("调用方法后:" + arr[0]);
}
public static void test(int[] arr) {
arr[0] = 1;
}
}
【注意】引用数据类型传递时传递的是地址,局部变量直接作用于实参本身
| 引用传递分析图 |
总结
局部变量声明在函数中,从定义的那一行开始到函数结束时被销毁
局部变量必须先赋值再使用
局部变量不能重复定义
值传递:基本数据类型的传递不改变实参
引用传递:引用数据类型的传递会改变实参
Java中只有值传递,引用传递传递的是地址值