【Java】java方法详解篇
方法
方法:完成特定功能的饿代码块
作用:
- 提高代码复用性和可维护性
- 但是并不能提高程序的运行效率
定义格式:
- 修饰符
- 返回值类型:用于限定返回值的数据类型
- 方法名:方法的名字,便于我们调用
- 参数类型:用于限定调用方法时传入数据的类型
- 参数名:用于接收调用方法时传入数据的变量(用于告诉方法的使用者,调用该方法时的需要)
- 方法体:完成我们需要的功能的代码
- return语句:结束方法,并把返回值传递给调用者
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2……){
方法体;
return 返回值;
}
注意事项
- 实参的数目,数据类型和顺序需和所调用的方法声明的形式参数列表匹配
- return终止方法的运行并指定返回数据
- java中进行方法调用中传递参数时,遵循值传递的原则(传递的都是数据的副本)
- 基本数据类型传递的时该数据的copy值
- 引用数据类型传递的是该对象引用的copy值,但指向的是同一个对象
void修饰的方法的调用
void:
- 当没有方法返回值时,返回值类型写void
注意:
- 返回值类型为void的方法只能单独调用
- void作为返回值类型的方法,可以不写return语句,或使用ruturn;结束方法,
public static void testOne(){
System.out.println("HelloWorld");
//可以不写return,方法中的代码执行完毕后,方法会自动结束
}
public static void testTwo(){
System.out.println("HelloWorld");
rerurn;
System.out.println("这句话不会执行,因为上面结束了方法");
}
public static void testThree(){
System.out.println("HelloWorld");
return 0;
//void方法不能return值,因为返回值的话必须要有返回值类型
}
方法的重载
方法的重载
-
英文Overload
-
概念:在同一个类中,有多个方法名相同,参数列表不同的方法
-
方法重载的特点
- 参数个数不同
- 参数的数据类型不同(包括数据类型相同,但数据顺序不同,例如:int a,double b 和 double b,int a也是不一样的)
-
方法重载和什么无关
- 和返回值类型无关
- 和参数变量名无关
- 和方法体无关
方法的形参是基本数据类型
- 方法的形参是基本数据类型,形参的值改变不会影响实际参数
- 原因:因为形参是在方法内部定义的一个新的局部变量,与方法外的实际参数变量是2个不同的变量,所以互不影响
方法的形参是引用类型
注意:
- 方法的形参是引用数据类型:形参的值改变是否影响实际参数要看引用关系
- 如果形参是修改自身保存的引用,不会影响实际参数
- 原因:因为形参是调用方法中的一个单独变量,实际参数是定义在main方法中的另一个单独变量,形参改变其保存的引用指向,并不影响实际参数的引用指向
- 如果形参是通过引用修改堆内存中保存的数据,会影响实际参数获取的值
- 原因:因为形参是调用方法中的一个单独变量,实际参数是定义在main方法中的另一个单独变量,形参通过引用修改的是堆内存中的数据,而实际参数也是指向该堆内存中的数据,所以形参修改后,实际参数获取的值也会改变
- 如果形参是修改自身保存的引用,不会影响实际参数
// 形参是引用数据类型,是否影响实际参数
public class demo{
public static void main(String[] args) {
// 数组
System.out.println("------------修改数组的引用指向------------");
int[] arr = {1, 2, 3};
System.out.println("原始值: arr=" + Arrays.toString(arr));
changeArr(arr);
System.out.println("修改后: arr=" + Arrays.toString(arr));
System.out.println("------------通过数组引用修改堆内存中数组的元素值------------");
System.out.println("原始值: arr=" + Arrays.toString(arr));
changeArrElement(arr);
System.out.println("修改后: arr=" + Arrays.toString(arr));
}
// 修改数组的引用: 不会影响实际参数
private static void changeArr(int[] arr) {
arr = new int[]{999, 999};
}
// 通过数组变量的引用修改堆内存中数组的元素: 会影响实际参数
private static void changeArrElement(int[] arr) {
arr[0] = -1;
arr[1] = -1;
arr[2] = -1;
}
}
结果:
递归结构
递归是一种常见的解决问题的方法,即把问题逐渐简单化。递归的基本思想就是“自己调用自己”,一个使用递归技术的方法将会直接或者间接的调用自己。
利用递归可以用简单的程序来解决一些复杂的问题。比如:斐波那契数列的计算、汉诺塔、快排等问题。
例如
void aa(int a) {
if (a<10) {
a++;
aa(a);
}
}
递归结构包括两个部分:
- 定义递归头。解答:什么时候不调用自身方法。如果没有头,将陷入死循环,也就是递归的结束条件。
- 递归体。解答:什么时候需要调用自身方法。
递归的缺陷
简单的程序是递归的优点之一。但是递归调用会占用大量的系统堆栈,内存耗用多,在递归调用层次多时速度要比循环慢的多,所以在使用递归时要慎重。