专业的JAVA编程教程与资源

网站首页 > java教程 正文

【Java基础】Java中方法的定义和调用

temp10 2024-12-30 06:57:55 java教程 12 ℃ 0 评论

“这里是云端源想IT,帮你轻松学IT”

嗨~ 今天的你过得还好吗?

【Java基础】Java中方法的定义和调用

你要看过世界辽阔

再去评判是好是坏

- 2023.08.07 -


Java语言中的方法Method在其他语言当中也可能被称为函数Function。对于一些复杂的代码逻辑,如果希望重复使用这些代码,并且做到随时任意使用,那么就可以将这些代码放在一个大括号{}当中,起一个名字。使用代码时,直接找到名字调用即可。下面就来详细介绍一下方法的定义与调用。



一、方法的概念

方法(method)是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集,可以被重复调用。

  • 方法必须先创建才可以使用,该过程称为方法定义;
  • 方法创建后并不是直接可以运行的,需要手动调用后才执行,该过程称为方法调用。


二、方法的定义和调用

方法的四种格式为:无参无返回值、有参无返回值、无参有返回值和有参有返回值。

1、无参的方法定义和调用

格式:

//定义方法
public static void 方法名(){
//方法体
}
//调用方法
方法名();

这里需要注意:方法必须先定义后调用!

举例:

public static void main(String[]args){
method();
}
public static void method(){
System.out.println("111");
}


2、带参数的方法定义和调用

格式:

//定义方法
public static void 方法名(参数1,参数2···){
//方法体
}
//调用方法
方法名(参数1,参数2···);


举例:

public static void main(String[]args){
method(1,2);
}
public static void method(int a,int b){
System.out.println(a+b);
}

方法定义时,参数中的数据类型和变量名都不可以省略,缺少其中任意一个,程序将报错。多个参数之间用逗号进行分割。

形参:方法定义中的参数,等同于变量定义的格式:数据类型 变量名;。

实参:方法调用中的参数,等同于直接使用变量或常量。



练习:输入一个数,判断它是否为偶数。

import java.util.Scanner;

public class Demo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
isEvenNumber(x);
}
public static void isEvenNumber(int x){

if (x%2==0)
System.out.println(x+"是偶数");
else
System.out.println(x+"不是偶数");
}

}


3、带返回值的方法的定义和调用

格式:

//定义方法
public static 数据类型 方法名(){
return 返回值数据;
}
//调用方法 定义变量接收方法的返回值,数据类型要和返回值相同
数据类型 变量名 = 方法名();


举例:

public static void main(String[]args){
int num = method();
}
public static int method(){
int a = 10;
return a;
}

return后面的返回值类型要和方法定义时的数据类型相同!



4、带返回值带参数的方法的定义和调用

格式:

//定义方法
public static 数据类型 方法名(参数1,参数2···){
return 返回值数据;
}
//调用方法
数据类型 变量名 = 方法名(参数1,参数2···);


举例:

public static void main(String[]args){
int sum = method(1,2);
}
public static int method(int a,int b){
int s = a+b;
return s;
}


方法的调用过程:

三、方法的通用格式

public static 返回值类型 方法名 (参数){
方法体;
return 数据;
}
  • public static 修饰符,目前的学习先记住格式;
  • 返回值类型 方法操作完毕之后返回的数据的数据类型;
  • 如果方法操作完毕,没有数据返回,这里写void,而且方法体中一般不写return;
  • 方法名:调用方法的时候使用的标识;
  • 参数: 由数据类型和变量名组成,多个参数之间用逗号隔开;
  • 方法体: 完成功能的代码块;
  • return: 如果方法操作完毕,有数据返回,用于把返回的数据给调用者;


定义方法时,要做到两个明确

  • 明确返回值类型:定义方法时就要考虑到是否有数据返回,如果没有写void,如果有写对应 的数据类型;
  • 明确参数:明确参数的类型和个数。


调用方法时注意:

  • void类型的方法,直接调用即可
  • 非void类型的方法,推荐使用变量接收调用的返回值


四、方法的重载

方法重载指在一个类中,有多个方法名相同,但是参数列表不同(参数列表包括:个数、类型、顺序)的方法。

注意:

  • 重载仅对应方法的定义,与方法的调用无关,调用方式参照标准格式,重载仅针对同一个类中方法的名称;
  • 与参数进行识别,与返回值无关,换句话说不能通过返回值来判定两个方法是否相互构成重载。


举例:

public class Demo{
public static void fn(int a){
System.out.println("参数为一个int");
}
public static void fn(double d){
System.out.println("参数为一个double");
}
public static void fn(int a,double d){
System.out.println("参数第一个为int,第二个为double");
}
public static void fn(double d,int a){
System.out.println("参数第一个为double,第二个为int");
}
}



方法重载的特点:

  • 重载仅针对方法的定义而言,与方法的调用无关。
  • 重载仅针对同一个类中方法的名称与参数进行识别,与返回值无关。

不能够通过返回值来判定两个方法是否相互构成重载。

在调用的时候,JVM会通过参数的不同来区分同名的方法。

练习:使用方法重载的思想,设计比较两个整数是否具有相同的方法,兼容全整数类型(byte ,short ,int ,long)。

public class Compare {
public static void main(String[] args){
System .out.println(compare(10,20));
System .out.println(compare((byte)10,(byte)20);
System .out.println(compare((short)10,(short)20);
System .out.println(compare(10L,20L);
}
public static boolean compare(int a,int b){
System .out.println("int");
return a==b;
}
public static boolean compare(long a,long b){
System .out.println("long");
return a==b;
}
public static boolean compare(byte a,byte b){
System .out.println("byte");
return a==b;
}
public static boolean compare(short a,short b){
System .out.println("short");
return a==b;
}

}

1)如果只在方法调用时输入整数作为参数,可以看出仅仅只调用了一个方法:

public static boolean compare(int a,int b){ System .out.println("int"); return a==b;

因为 在Java中,整数默认是int类型。

2)要想调用其他类型的方法,需要在方法调用时的参数对其进行数据的强制转换。

3)转换为long类型的时候,只需要在整数后面加上L。


五、方法的递归调用

指一个方法在运行过程中自己调用自己。

  • 方法必须有递归的结束条件,条件不满足递归前进,条件满足递归返回;
  • 递归前进段必须要有做出一些变化,向结束条件靠近;
  • 递归调用不一定有返回值;
  • 不能调用次数过多,容易导致栈内存溢出;
  • 尽量使用迭代代替递归。



实例:求5的阶乘。

public static void main(String[] args) {
System.out.println(fun(5));
}

public static int fun(int n) {
if (1 == n)
return 1;
else
return n * fun(n - 1);
}


六、方法的参数传递

1、基本类型的方法参数传递

举例代码:

public class Test1{
public static void main(String[] args){
int a = 10;
System.out.println("调用change方法前a的值为:"+a);
change();
System.out.println("调用change方法后a的值为:"+a);

}\
public static void change(int num){
num = 99;
System.out.println("change方法中num的值为:"+num);
}
}

基本数据类型的参数,形式参数的改变,不影响实际参数。

  • 每个方法在栈内存中,都会有独立的占空间,方法运行结束后就会弹栈消失。
  • 基本类型数据定义后存储在栈内存中,传递值时其实就是将这个值复制给另一个变量。

练习:

public class Test1 {
public static void main(String[] args){
int n=1;
System.out.println("调用前:"+n);
change(n);
System.out.println("调用后:"+n);
}
public static int change(int n){
n=2;
return n;
}
/*程序的执行流程:
Ⅰ、程序一开始会把main()方法加载到栈内存。此时在main()方法中int n =1;
Ⅱ、然后输出main()方法中n的值为1,所以在控制台首次输出的n的值为1。
Ⅲ、然后调用了change()方法,这个方法会被加载到栈内存,
Ⅳ、在运行change()方法的时候,会在栈内存中输入形参 int n;而且,n的初始值是由main()方法中的实参给的,所以此时的n的初值为1。
Ⅴ、进入了change方法之后,修改n的值为2。
Ⅵ、修改完毕之后,change()方法中n的值为2,但是main()方法中n的值仍然为1。
Ⅶ、接着往下执行,change()方法调用完毕,从栈内存消失。
Ⅷ、回到main()方法,再次输出n。
Ⅸ、继续往下执行,当main()方法执行完毕之后,也会从栈内存消失。*/

}

2、引用类型的方法参数传递

举例代码:

public class Test2{
public static void main(String[] args){
int[] arr = {10,20,30};
System.out.println("调用change方法前arr的第一个元素的值为:"+arr[0]);
change();
System.out.println("调用change方法后arr的第一个元素的值为:"+arr[0]);

}\
public static void change(int nums){
//修改nums中第一个元素的值
nums[0] = 99;
System.out.println("change方法中nums的第一个元素的值为:"+nums[0]);
}
}

引用数据类型的参数,形式参数的改变,影响实际参数的值。

  • 引用数据类型的传参传入的是内存地址,内存中会由两个变量同时指向同一个内存的效果,所以即使方法弹栈,堆内存中的数据已经改变,实际参数再次指向这个地址其中的值已经发生了改变。
  • 用数据类型数据存储的时候,其中栈内存中存储变量名和一个堆内存中的地址,堆内存中存储引用数据类型中的数据内容,传递值时其实传递的是内存地址。


练习:

public class Test1 {
public static void main(String[] args){
int[] arr={1,2,3};
System.out.println("调用前:"+arr[1]);

System.out.println("调用后:"+change(arr));
}
public static int change(int[] arr){
arr[1]=6;
return arr[1];
}
}
/*程序的执行流程:
Ⅰ、程序的开始从main()方法开始,
Ⅱ、进入main()方法之后,定义了一个整型的数组,并对其进行了初始化处理。
Ⅲ、此时栈内存中存放的是:方法main()和int[] arr,而该数组的元素值和对应的索引会存放在堆内存中。还会把堆内存中的地址值赋值给栈内存的arr。
Ⅳ、继续往下执行,在控制台输出arr数组索引下标为1的值。
Ⅴ、然后调用change()方法,加载到栈内存中,形参int[] arr也会被加载到栈内存中。此时的形参必须是引用类型,而数组属于引用类型。
Ⅵ、接着往下执行,执行完change()方法之后,change()方法会在栈内存中消失。
Ⅶ、再回到main()方法中,输出arr[1]的值,此时,该值已经被修改,所以在控制台输出的是2。
Ⅷ、执行完main()方法,main()方法也会在栈内存中消失。
*/

}

本文详细介绍了Java中方法的定义和调用方法以及需要注意的事项,在编程中运用方法把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,一定程度上可以减少程序的代码量,帮助我们提高开发效率。


我们下期再见!


END


文案编辑|云端学长

文案配图|云端学长

内容由:云端源想分享


Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表