一、方法的介绍
方法(method)是一些代码打包起来,然后可以在需要的地方重复使用。
方法是程序中最小的执行单元。
方法只有在被调用时才会执行。
方法的好处:提高代码的复用性、提高代码的可维护性。
二、方法的定义和调用
方法定义后并不是直接运行的,需要手动使用才能执行,该过程称为方法调用。
2.1 基本方法
基本方法的定义格式:
定义: public static void 方法名(){ 方法体; } 调用: 方法名();
/*
方法练习:
定义一个方法,打印整数10+20的和
*/
public class Demo {
public static void main(String[] args) {
//调用
add();
}
//
public static void add(){
//定义两个变量
int a = 10;
int b = 20;
//求和
int sum = a + b;
System.out.println("sum=" + sum);
}
}
2.2 带参数的方法
带参数的方法的定义格式:
定义: public static void 方法名(类型1 参数名1, 类型2 参数名2,......){//形参 方法体(Java代码); } 调用: 方法名(数据1,数据2,......);//实参
public class Demo{
public static void main(String[] args) {
add(10,20);
add(10,30);
}
//求和的方法:计算两个数字的和
//参数:int num1, int num2
public static void add(int num1, int num2) {
int result = num1 + num2;
System.out.println(result);
}
}
形参:形式参数,方法中定义的参数。例如:int num1, int num2
实参:实际参数,实际传入的参数。例如:add(10,20);中的10和20
2.3带返回值的方法
方法的返回值其实就是方法运行的最终结果。
当我们调用一个方法时,如果方法的执行结果会在后续程序中用到,那么就需要这个方法将运行的结果返回。
带返回值方法的定义:
带返回值的方法 定义: public static 返回值的类型 方法名(形参列表){ 方法体; return 结果; } 调用: 类型 变量名 = 方法名(实参列表);
public class Demo{
public static void main(String[] args) {
//调用方法获取10和20的和与平均值,并在main方法中打印
int sum= add(10, 20);
int avg = add(10, 20)/2;
System.out.println("和为:" + sum);
System.out.println("平均值为:" + avg);
}
//定义方法求和
public static int add(int num1, int num2){
int result = num1 + num2;
return result;
}
}
2.4方法总结
-
方法不调用就不执行。
-
方法调用时,实参必须跟形参匹配;返回值必须跟return结果匹配。
-
方法与方法之间是平级关系,不能嵌套定义。
-
方法的执行顺序和编写顺序无关,但和调用顺序有关。
-
方法的返回值类型为void,表示该方法没有返回值,可以省略return不写。
-
在void方法中可单独书写return,表示结束方法,return后不能跟任何内容。
-
return语句下方,不能编写代码,因为return表示返回结果,方法结束。
三、方法的案例
3.1 计算1~n的和
需求:计算1~n的和
分析:
-
方法是否需要接收数据进行处理? 需要接收n具体的值,因此形参声明为:int n
-
方法是否需要返回数据? 需要返回1~n的求和结果,因此返回值类型声明为int
-
方法内部的具体实现:完成求1-n的和并返回。
public class Demo1 {
public static void main(String[] args) {
int sum = getSum(100);
System.out.println("1~100的和为:" + sum);
}
public static int getSum(int n){
int sum = 0;
for (int i = 1; i <= n; i++) {
sum += i;
}
return sum;
}
}
3.2 判断奇偶
需求:判断一个整数是奇数还是偶数,并把判断的结果在方法内输出出来
分析:
-
方法是否需要接收数据进行处理? 需要接收一个整型来判断,因此形参声明为:int num
-
方法是否需要返回数据? 方法内部判断完后直接输出结果即可,无需返回,因此返回值类型声明为void
-
方法内部的业务:通过if语句判断num是奇数还是偶数,并输出结果。
public class Demo2 {
public static void main(String[] args) {
Judge(90);
}
public static void Judge(int num){
if(num % 2 == 0){
System.out.println(num + "是偶数");
}else {
System.out.println(num + "是奇数");
}
}
}
3.3 比较两个int类型的数组是否一样
需求:如果两个int类型的数组,元素个数,对应位置的元素内容都是一样的则认为这2个数组是一模一样的
分析:
-
方法是否需要接收数据进行处理? 需要接收两个int类型的数组,因此,形参声明为:int[] arr1, int[] arr2
-
方法是否需要返回数据? 方法判断完后需要返回:true、false,因此,返回值类型声明为boolean类型
-
方法内部的业务:判断两个数组内容是否一样。
public class Demo4 {
public static void main(String[] args) {
int[] arr1 = {1,2,4};
int[] arr2 = {1,2,3};
boolean result = Judge(arr1, arr2);
System.out.println(result);
}
public static boolean Judge(int[] a,int[] b){
//比较两个数组的长度,如果长度不一致,返回false,程序退出
if(a.length != b.length){
return false;
}else {//长度一致
//利用循环,获取数组的索引和数据,将相同索引位置的数据进行比较
for (int i = 0; i < a.length; i++) {
if(a[i] != b[i]){//相同索引位置的数据不等,返回false
return false;
}
}
return true;
}
}
}
四、方法的重载
在同一个类中,出现了名称相同,但形参列表不同的多个方法,这些方法构成了重载关系。
-
同名不同参,与返回值无关。
-
形参列表不同,主要包括三个维度:类型、数量、顺序(前提条件:方法多个参数,参数类型不相同)。
-
调用方法的时候,Java虚拟机会通过参数的不同区分同名的方法。
/*
重载案例:
使用方法重载的思想,设计比较两个整数是否相同的方法,名为compare,
兼容全整数类型(byte,short,int,long)
*/
public class Demo2 {
public static void main(String[] args) {
System.out.println(compare(10,50));
}
public static boolean compare(byte a, byte b){
return a == b;
}
public static boolean compare(short a, short b){
return a == b;
}
public static boolean compare(int a, int b){
return a == b;
}
public static boolean compare(long a, long b){
return a == b;
}
}
五、方法的执行原理
5.1 方法的执行原理
方法被调用的时候,是进入栈内存中运行。
栈特点:先进后出。
5.2 参数传递
Java的参数传递机制都是:值传递
值传递:指的是在传输实参给方法的形参的时候,传输的是实参变量中存储的值的副本。
实参:全称实际参数,是指方法调用中的参数
形参:全称形式参数,是指方法定义中的参数, 作用是接收实参中的数据
1、**基本类型参数传递的是实参的副本(是保存在变量中的值**,实参与实参副本(新的数据)是两块内存的东西)
/*
基本类型参数传递的是: 变量中保存的值
*/
public class Demo1 {
public static void main(String[] args) {
int a = 10;
change(a);
System.out.println(a); // 10
}
public static void change(int a) {
System.out.println(a); // 10
a = 20;
System.out.println(a); // 20
}
}
1.执行change() 方法中的 System.out.println(a); // 10
2.执行change() 方法中的a = 20; System.out.println(a); // 20
3.执行main() 方法中的 System.out.println(a); // 10
2、**引用类型参数传递的是变量中保存的地址值**。由于传递的是地址,当方法中的将值改变时,其他地方也会受影响。
/*
引用类型参数传递的是: 变量中保存的地址值
*/
public class Demo2 {
public static void main(String[] args) {
int[] arrs = new int[]{10, 20, 30};
change(arrs);
System.out.println("main: " + arrs[1]);//222
}
public static void change(int[] arrs) {
System.out.println("方法内1:" + arrs[1]);//20
arrs[1] = 222;
System.out.println("方法内2:" + arrs[1]);//222
}
}
1.执行change() 方法中的 System.out.println("方法内1:" + arrs[1]);//20
2.执行change() 方法中的 arrs[1] = 222; System.out.println("方法内2:" + arrs[1]);//222
3.执行main() 方法中的 System.out.println("main: " + arrs[1]);//222