1、方法定义:
- 方法是一种语法结构,它可以把一段代码封装成一个功能,以便重复调用
方法的完整格式:
修饰符 返回类型 方法名(形参列表){
方法体代码(需要执行的功能代码)
return 返回值;
}
package com.define;
public class MethodDemo1 {
public static void main(String[] args) {
//掌握定义方法的完整格式,搞清楚使用方法的好处
//需求:加入很多程序员都要进行两个整数求和的操作
//1、李工
int rs=sum(10,20);
System.out.println("和是:" + rs);
//2、张工
int rs2=sum(13,24);
System.out.println("和是:" + rs2);
}
public static int sum(int a,int b){
int c=a+b;
return c;
}//public static是方法的修饰符
}
结果:
具体运行情况与C语言的自定义函数相同5.8 5.9_C语言_函数1-CSDN博客
方法的调用流程 --Debug
说明:
- 方法的修饰符:目前暂时都使用public static 修饰
- 方法声明了具体的返回值类型,内部必须使用return返回对应类型的数据。
- 形参列表可以有多个,甚至可以没有,但如果有多个形参,多个形参必须用“,”隔开,且不能给初始化值
使用方法的好处:
- 提高了代码的复用性,提高了开发效率
- 让程序的逻辑更清晰
2、方法的其他形式:
方法的其他形式
- 方法定义时:需要按照方法解决的实际业务需求,来设计合理的方法形式解决问题。
1、方法是否需要接收数据处理
需要数据处理,就要定义一些形参列表,来接收数据;如果这个方法不需要接收数据来处理,这个方法就不需要设计形参列表
2、方法是否需要返回数据
注意事项:
- 如果方法不需要返回数据,返回值类型必须申明成void(无返回值申明),此时方法内部不可以使用return返回数据
3、方法使用时的常见问题:
4、方法的案例:
1、计算1-n的和
分析:
1、需要接收数据n的值,因此形参声明为int n
2、需要返回1-n的求和结果,因此返回值类型声明为int
3、方法内部业务:完成求1-n的和并返回
package com.define;
public class MethodTest1 {
public static void main(String[] args) {
int rs=add(5);
System.out.println("1-5的和是:" + rs);
}
public static int add(int n){
int sum=0;
for(int i=1;i<=n;i++)
{
sum+=i;
}
return sum;
}
}
2、判断一个整数是奇数还是偶数
需求:
- 判断一个整数是奇数还是偶数,并把判断的结果输出来
分析:
- 1、需要接收一个整数来判断,形参声明为int number
- 2、不需要返回数据,方法内部判断完后直接输出结果即可,无需返回,返回值类型声明为:void
- 3、通过if判断number是奇数还是偶数,并输出结果。
package com.define;
public class MethodTest2 {
public static void main(String[] args) {
judg(11);
}
public static void judg(int number)
{
if(number%2==0)
{
System.out.println(number + "是偶数");
}
else
{
System.out.println(number + "是奇数");
}
}
}
方法在计算机中的执行原理:
- 方法被调用的时候,是进入到栈内存中运行的 栈:先进后出,用完的回清理掉
5、Java的参数传递机制
Java的参数传递机制都是:值传递
值传递:指的是在传输实参给方法的形参的时候,传输的是实参变量中存储的值的副本
实参:在方法内部定义的变量
形参:定义方法是“(...)”中所声明的参数
1、基本类型的参数传递
2、引用类型的参数传递
package com.parameter;
public class MethodDemo2 {
//引用类型的参数传递
public static void main(String[] args) {
int[] arrs=new int[]{10,20,30};
change(arrs);//这个数组变量arrs就是一个引用类型的参数,
// 这个数组变量里面存储的就是数组的地址
System.out.println("main:" + arrs[1]);
}
public static void change(int[] arrs)//arrs作为形参来接这个数组的地址
{
System.out.println("方法内1:" + arrs[1]);
arrs[1]=234;
System.out.println("方法内2:" + arrs[1]);
}
}
基本类型和引用类型的参数在传递时:
- 都是值传递
- 基本类型的参数传输存储的数据值
- 引用类型的参数传输存储的地址值
6、引用类型参数传递的相关案例
案例1
打印int类型的数组内容
需求:
- 输出一个int类型的数组内容,要求输出格式为:[11,22,33,44,55]。
分析:
1、方法需要接收一个int类型的数组,形参声明为int[] arr
2、方法内部直接输出数组内容即可,无需返回,返回类型为void
3、方法内部:遍历数组,并输出相应的内容
package com.parameter;
public class MethodTest3 {
public static void main(String[] args) {
int[] arr = new int[]{11,22,33,44,55};
printArray(arr);
int[] arr2 =null;
printArray(arr2);
int[] arr3={};
printArray(arr3);
}
public static void printArray(int[] arr){
//要考虑接收到的参数不是空地址
if(arr==null){//说明这个arr指向的是空地址
System.out.println(arr);//null
return;//跳出当前方法
}
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
/*if(i==arr.length-1)
{
System.out.print(arr[i]);
}
else
{
System.out.print(arr[i] + ",");
}*/
System.out.print(i==arr.length-1 ? arr[i] : arr[i] + "," );
}
System.out.println("]");
}
}
结果:
案例2
比较两个int类型的数组是否一样,返回true或false
需求:
- 如果两个int类型的数组,元素个数,对应位置的元素内容都是一样的则认为这两个数组是一摸一样的
分析:
1、方法需要接收两个int类型的数组,形参声明为int[] arr1,int[] arr2
2、方法判断完后需要返回true或false,返回值类型声明为boolean类型
3、方法内部:判断两个数组内容是否一样
package com.parameter;
public class MethodTest4 {
public static void main(String[] args) {
/*int[] arr1=null;
int[] arr2=null;
System.out.println(equals(arr1, arr2));//true*/
/*int[] arr1=null;
int[] arr2= {10,20,30};
System.out.println(equals(arr1, arr2));//false*/
/*int[] arr1= {10,20,30,40};
int[] arr2= {10,20,30};
System.out.println(equals(arr1, arr2));//false*/
/*int[] arr1= {10,21,30};
int[] arr2= {10,20,30};
System.out.println(equals(arr1, arr2));//false*/
int[] arr1= {10,20,30};
int[] arr2= {10,20,30};
System.out.println(equals(arr1, arr2));//true
}
public static boolean equals(int[] arr1,int[] arr2){
//1、判断arr1和arr2是否都是null
if(arr1==null&&arr2==null){
return true;
}
//2、arr1或者arr2是null
if(arr1==null || arr2==null)
{
return false;
}
//3、arr1和arr2都不为null,判断两个数组的长度是否一样,如果长度不一样,直接返回false
if(arr1.length!=arr2.length)
{
return false;//不相等
}
//4、两个数组长度一样,接着比较他们的内容是否一样
//arr1 =[10,20,30]
//arr2 =[10,20,30]
for (int i = 0; i < arr1.length; i++) {
//判断当前位置两个位置的元素是否不一样,不一样直接返回false
if(arr1[i] != arr2[i])
{
return false;//不相等
}
}
return true;//两个数组是一样的
}
}
7、方法重载
方法重载:
- 一个类中,出现多个方法的名称相同,但是他们的形参列表是不同的,那么这些方法就称为方法重载了。
为什么不会出现错误,因为在调用他们的时候是不会出现冲突的。
方法重载的注意事项
- 一个类中,只要一些方法的名称相同、形参列表不同,那么它们就是方法重载了,其他的都不管(如:修饰符、返回值类型是否一样都无所谓)
- 形参列表不同指的是:形参的个数、类型、顺序不同,不关心形参的名称。
方法重载的应用场景:
- 开发中常需要为处理一类业务,提供多种解决方案,此时用方法重载来设计是很专业的。
案例导学
开发武器系统,功能需求如下:
- 1、可以默认发一枚武器
- 2、可以指定地区发射一枚武器
- 3、可以指定地区发射多枚武器
package com.overload;
public class MethodTest2 {
public static void main(String[] args) {
fire();
fire("B国");
fire("C国",999);
}
public static void fire()
{
System.out.println("默认给A国发射了一枚武器");
}
public static void fire(String country){
System.out.println("发射了一枚武器给" + country);
}
public static void fire(String country,int number){
System.out.println("发射了" + number + "枚武器给" + country);
}
}
结果:
优化:
package com.overload;
public class MethodTest2 {
public static void main(String[] args) {
fire();
fire("B国");
fire("C国",999);
}
public static void fire()
{
fire("A国");
}
public static void fire(String country){
fire(country,1);
}
public static void fire(String country,int number){
System.out.println("发射了" + number + "枚武器给" + country);
}
}
结果:
8、补充知识
在方法中单独使用return关键字
- return:可以用在无返回值的方法中,作用是:立即跳出并结束当前方法的执行
return、break、continue
- retrun:跳出并立即结束所在方法的执行
- break:跳出并结束当前所在循环的执行
- continue:结束当前所在循环的当次执行,进入下一次执行