1.方法:
将具有独立功能的代码块组织成为一个整体,使其成为具有特殊功能的代码集。
2.方法必须先创建才可以使用,该过程称为方法定义。
方法必须先定义后调用,否则程序会报错。
3.方法创建后并不是直接运行的,需要手动使用后才可执行,该过程称为方法调用。
4.方法定义
1)不带参数的方法定义格式:
public static void 方法名(){
//方法体,根据实际需求编写的代码块
}
2)带参数的方法定义格式:
public static void 方法名(参数1,参数2,....){//参数的一般格式:数据类型 变量名
//方法体
}
方法定义时,参数中的 数据类型 和变量名 都不可以省略,缺少其中任意一个,程序将报错。多个参数之间用逗号进行分割。
5.方法调用
1)不带参数的方法调用格式:
方法名();
2)带参数的方法调用格式:
方法名(参数);//参数为变量名或常量值,多个参数之间用逗号分割
方法调用要在main()方法中调用,因为这是程序的入口。
当方法调用出现以后,会进入到相应的方法中,程序从上到下开始执行。
方法调用时的参数的数量与类型,必须与方法 定义中的设置相匹配,否则程序报错。
6.形参:方法定义中的参数,等同于变量定义的格式:数据类型 变量名;
。
7.实参:方法调用中的参数,等同于直接使用变量或常量。
8.练习:输入一个数,判断它是否为偶数
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+"是偶数");elseSystem.out.println(x+"不是偶数");}}
9.练习:输入两个数,输出其中的最大值
import java.util.Scanner;public class Test {public static void main(String[] args){Scanner sc = new Scanner(System.in);int x = sc.nextInt();int y = sc.nextInt();isMax(x,y);}public static void isMax(int x,int y){int max;max = x>y?x:y;System.out.println("两个数中的最大值为:"+max);}
}
10.带返回值方法的定义:
//格式
public static 数据类型 方法名(参数){
return 数据;//return后面的返回值与方法定义上的数据类型要匹配
}
11.带返回值方法的调用:
//格式1:
方法名(参数);//参数为常量或变量
//格式2:
数据类型 变量名 = 方法名(参数);
方法的返回值通常使用变量进行接收。
方法调用时:
Ⅰ、void类型的方法,直接调用即可。
Ⅱ、非void类型的方法,一般用变量接收调用。
12.方法是平阶关系,不能嵌套定义。
13.void 表示无返回值,可以省略 return ,也可以单独书写 return ,后面不加任何数据。
14.方法定义的通用格式:
public static 返回值类型(参数){//明确返回值类型,如果方法操作完毕之后有数据返回,就写对应的数据类型。如果没有,就写void。还要明确参数的类型和数量。
方法体;
return 数据;
}
/* public static 是修饰符。返回值类型:方法操作完毕之后,返回的数据的类型。如果方法操作完毕没有数据返回,返回值类型写void,而且方法体中一般不写return。方法名:调用方法时使用的标识。参数:由数据类型和变量名组成,多个参数之间用逗号隔开。方法体:完成功能的代码块。return :如果方法操作完毕有数据返回,用于把数据返回给调用者。*/
15.方法重载:同一个类中定义的多个方法之间的关系,满足一定条件的多个方法相互构成重载。
条件:
Ⅰ、多个方法在同一个类中。
Ⅱ、多个方法具有相同的方法名。
Ⅲ、多个方法的参数不相同(数据类型不同或数量不同)。
16.方法重载的特点:
1)重载仅针对方法的定义而言,与方法的调用无关。
2)重载仅针对同一个类中方法的名称与参数进行识别,与返回值无关。
不能够通过返回值来判定两个方法是否相互构成重载。
在调用的时候,JVM会通过参数的不同来区分同名的方法。
17.练习:使用方法重载的思想,设计比较两个整数是否具有相同的方法,兼容全整数类型(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;}}
Ⅰ、如果只在方法调用时输入整数作为参数,可以看出仅仅只调用了一个方法:
public static boolean compare(int a,int b){ System .out.println("int"); return a==b;
因为 在Java中,整数默认是int类型。Ⅱ、 要想调用其他类型的方法,需要在方法调用时的参数对其进行数据的强制转换。
Ⅲ、转换为long
类型的时候,只需要在整数后面加上L
。
18.方法的参数传递:
1)对于基本数据类型的参数,形参的改变不影响实参的值。
2)练习:
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()方法执行完毕之后,也会从栈内存消失。*/}
19.引用类型的方法参数传递:
1)对于引用类型的参数,形参的改变影响实参的值。
2)练习:
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()方法也会在栈内存中消失。
*/