方法
1.方法简述
方法(method)就是一段具有独立功能的代码块,不调用就不执行;
方法必须先创建才能使用,该过程成为方法定义
方法创建后并不是直接运行的,需要手动使用后才执行,该过程称为方法调用
2.方法的定义和调用
2.1 方法的定义
A.格式
public static void 方法名(){
方法体
}
2.2 方法的调用
A.格式
方法名();
2.3 方法定义和调用的注意事项
-
方法必须先定义后调用,否则会报错
-
方法与方法之间是平级关系,不能嵌套定义,但可以嵌套调用
-
方法没有被调用的时候,都在内存的方法区中的字节码文件(.class)中存储
-
方法在被调用的时候,需要进入到栈内存中运行
3.方法在内存中的调用过程
package com.huly.mypacdage01;
public class methodTest {
/*
第一步,methodTest这个类的字节码文件会加再到方法区,methodTest.class文件中的主方法和其他方法
会随着.class文件一起加载到方法区
*/
public static void main(String[] args) {
//第二步,虚拟机会自动将主方法调入栈内存中执行
method01();
/*
第三步,由于主方法中只有一句程序语句,且是调用方法method01,所以method01方法会被加载到
栈内存中执行
*/
}
public static void method01(){
method02();
/*
第四步,方法1开始执行后,第一个语句又是调用方法2,所以虚拟机会将方法2也调入栈内存中执行,
此时,栈内存中共有主方法、方法1和方法2三个方法,由于方法2中方法体只有一句输出语句,所以执行完打印2的指令后后方法2运行完毕从栈内存中释放,
此时栈内存中还剩两个方法
*/
System.out.println("1");
//第五步,执行输出指令,打印1
method03();
/*
第六步,调用方法3,虚拟机会将方法3调入到栈内存中执行,此时栈内存中的方法又恢复到三个了,方法3开始执行后
输出3,方法3中也只有一个输出语句,打印之后便从栈内存中释放,方法3的内容执行完毕后方法1中也没有程序语句了,
所以方法1也执行完毕从栈内存中释放。又因为主方法中只有调用方法1的语句,所以在方法1执行完毕之后,主方法也执行完毕从内存中释放
*/
}
public static void method02(){
System.out.println(2);
}
public static void method03(){
System.out.println(3);
}
}
4.带参数方法的定义和调用
4.1.1 带参数方法的定义
A.格式
public static void 方法名(){
方法体
}
B.示例
public static void(数据类型 变量名){
}
public static void method01(int num){
}
public static void method02(int num1,int num2){
}
4.1.2 带参数方法的定义的注意事项
- 方法定义时,参数的数据类型和变量都不能少,缺少任何一个程序都会报错
- 方法定义时,多个参数之间使用逗号分隔
4.2.1 带参数方法的调用
A.格式
方法名(参数);
B.示例
方法名(变量名/常量值);
method(5);
method(5,6);
meithod(a);
4.2.2 带参数方法的调用注意事项
- 方法调用时,参数的数量与类型必须与方法定义中的设置相匹配,否则程序会报错
4.3形参和实参
4.3.1 形参实参的定义和格式
形参:全称形式参数,是指方法定义中的参数
实参:全称实际参数,方法调用中的参数
形参和实参可以是变量也可以是常量
示例:
package com.huly.mypacdage02;
public class methodTest02 {
public static void main(String[] args) {
takeRemainder(10);//实际参与运算的常量,是实参
int a =10;
takeRemainder(a);//实际参与运算的变量,是实参
}
public static void takeRemainder (int num){
//num是定义方法时声明的变量,不调用便不参与运算时形参
if(num%2==0){
System.out.println("1");
}else{
System.out.println("2");
}
}
}
4.3.1 形参实参实战
需求:键盘录入两个数字,输出两个数字之间的奇数
分析:1.
package com.huly.mypacdage03;
import java.util.Scanner;
public class methodTest03 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = 0;
int b = 0;
cycle:while(true) {
System.out.println("请输入第一个数字");
int c = sc.nextInt();
System.out.println("请输入第二个数字");
int d = sc.nextInt();
System.out.println(c);
System.out.println(d);
if (c == d || -1 <= c - d && c - d <= 1) {
System.out.println("请重新输入");
} else {
b = c;
a = d;
break cycle;
}
}
System.out.println("a=" + a);
System.out.println("b=" + b);
takeRemainder02(a, b);
}
public static void takeRemainder02(int a ,int b){
int c = 0 ;
if(a<b){
System.out.println("输出"+a+"到"+b+"之间的奇数");
}else{
System.out.println("输出"+b+"到"+a+"之间的奇数");
c = b;
b = a;
a = c;
}
for(int i = a+1;i<b;i++){
if(i%2==1) {
System.out.println(i);
c++;
}
}
return c;
}
}
4.4 带返回值方法的定义和调用
4.4.1 带返回值方法的定义格式
public static 数据类型 方法名(参数){
return 数据;
}
- 注意事项:
a. 方法定义时,return后面的返回值与方法定义上的数据类型要匹配否则程序将报错
b. return返回的数值可以直接被主方法里面的变量接收
4.4.2 带返回值方法的调用格式
数据类型 变量名 = 方法名(参数);
boolean flag = isEvenNumbet(5);
- 注意事项:
a. //方法名(参数);// 这种调用格式不算错误,但没有意义,返回值的数据没有被接收,和无return值的方法调用效果一样,都只是执行了一次被调用的方法
b. 方法在调用时,可以直接将值赋予被调用方法的形式参数,如:int a =methodTest01(a:10,b:20)。
4…4.3 实战
package com.huly.mypacdage04;
import java.util.Scanner;
public class meithodTest04 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = 0;
int b = 0;
cycle:while(true) {
System.out.println("请输入第一个数字");
int c = sc.nextInt();
System.out.println("请输入第二个数字");
int d = sc.nextInt();
System.out.println(c);
System.out.println(d);
if (c == d || -1 <= c - d && c - d <= 1) {
System.out.println("请重新输入");
} else {
b = c;
a = d;
break cycle;
}
}
System.out.println("a=" + a);
System.out.println("b=" + b);
takeRemainder02(a, b);
int result = takeRemainder02(a,b);
System.out.println(result);
}
public static int takeRemainder02(int a ,int b){
int c = 0 ;
int d = 0;
if(a<b){
System.out.println("输出"+a+"到"+b+"之间的奇数");
}else{
System.out.println("输出"+b+"到"+a+"之间的奇数");
c = b;
b = a;
a = c;
}
for(int i = a+1;i<b;i++){
if(i%2==1) {
System.out.println(i);
d++;
System.out.println("d="+d);
}
}
return d;
}
}
/*
注意事项:1.被输出语句调用,方法仍会执行一遍方法体里面的所有内容,且被输出的值在被调用方法执行完之后才 会打印
2.形参名字和其他方法里面的名字重复不会报错
*/
4.4.4 形参为引用类型的方法调用和取得返回结果
A. 示例一
package com.huly.mypacdage06;
/*
需求:设计一个方法遍历数组,要求遍历结果在一行上显示,且类型为[1, 2, 3, 4, 5],为增加难度,
本次要求键盘录入,输入想输入的数组元素个数之后再遍历
*
解析:1.键盘录入,需要导入Scanner包,输入的元素需要放入数组中,需要用for循环挨个输入
2.输入想输入多少个就输入多少个的数组需要
* */
import java.util.Scanner;
public class methodTest07 {
public static void main(String[] args) {
int[] arr1 = new int[100]; //不会定义长度可变的数组,这里定义一个长度用不完的
Scanner sc = new Scanner(System.in);
//int[] arr = new int[]{};此路暂时不同,不会定义一个不确定长度的数组
int i = 0;
int j = 0;
cycle:while(i<99) {//不知道输入多少次停止,用while循环
System.out.println("请输入第"+(i+1)+"个数据");
j = sc.nextInt();
if(j==-1){
break cycle;
}
arr1[i] = j;
i++;
}
System.out.println("输入元素个数为:"+i);
int[] arr2 = new int[i];
for (int k = 0; k <i; k++) {
arr2[k] = arr1[k];
}
tarverse(arr2);
}
public static void tarverse(int[] arr){
System.out.print("[");
for (int f = 0; f <arr.length; f++) {
if(f+1==arr.length){
System.out.println(arr[f]+"]");
}else {
System.out.print(arr[f]+" ");
}
}
}
}
B. 示例二
package com.huly.mypacdage06;
/*
需求:调用方法返回数组的最大值和最小值
分析:1.方法的返回值只能有一个,所以需要在方法里额外定义一个数组,用来存储取得的最大值和最小值,然后将数组的地址返回给主方法,主方法得到地址之后就可以取得相应的数据
*/
public class methodReturn {
public static void main(String[] args) {
int[] arr = new int[]{22,33,44,55,45};
int result[] = arr1(arr);
System.out.println(result[0]);
System.out.println(result[1]);
}
public static int[] arr1(int[] arr){
int max = arr[0];
for (int i = 0; i <arr.length ; i++) {
if(max<arr[i]){
max = arr[i];
}
}
int min = arr[0];
for (int i = 0; i <arr.length ; i++) {
if(min>arr[i]){
min = arr[i];
}
}
int[] maxandmin = new int[]{min,max};
return maxandmin;
}
}
5 方法的通用格式
public static 返回值类型 方法名(参数){
方法体;
return 数据;
}
public static 修饰符,暂时不需要学习
返回值类型:方法执行完毕后返回的值的数据类型,如果方法执行完毕之后没有数据返回,这里写void,意思是空的数据类型,没有返回值时可以带return也可以不带,带的时候要注意return后面不能又具体的数据,且方法执行到return时自动结束,可以用return;结束方法执行。
方法名:调用方法时候使用的标识符
参数:有数据类型和变量名组成,多个参数之间用逗号隔开
方法体:完成功能的代码块
return:方法执行完后,若有数据返回,用与将返回数据返回给调用者
5.方法的重载
在同一个类中,定义了多个同名的方法,但每个方法具有不同的参数类型或者参数个数,这些同名的方法就构成了重载关系。
即:
同一个类中,方法名相同参数不同的方法就构成了方法的重载,参数不同是指参数的个数、类型和顺序不同。
注意:1.识别方法之间是否是重载关系,只看方法名和参数,跟返回值无关。
2.方法名相同,参数也完全相同称为方法重复性定义,是一种冲突性错误不构成方法 的重载关系