可变参数
修饰符 返回值类型 方法名(【非可变参数部分的形参列表,】参数类型... 形参名){ }
(1)一个方法只能有一个可变参数
(2)可变参数必须是形参列表的最后一个
示例
class Count { // 完成数组 所有元素的求和 // 原始写法 public int getSum1(int[] arr) { int sum = 0; for (int i = 0; i < arr.length; i++) { sum += arr[i]; } return sum; } // 可变参数写法 public int getSum2(int... arr) { int sum = 0; for (int i = 0; i < arr.length; i++) { sum += arr[i]; } return sum; } } // 创建对象 Count c = new Count(); int[] arr = { 1, 4, 62, 431, 2 }; int sum1 = c.getSum1(arr); //可变参数既可以传递数组,又可以直接传递数组的元素 int sum2 = c.getSum2(arr); System.out.println(sum2); int sum3 = c.getSum2(1, 4, 62, 431, 2); System.out.println(sum3);
方法重载
-
-
参数列表:数据类型个数不同,数据类型不同,数据类型顺序不同。
-
重载方法调用:JVM通过方法的参数列表,调用不同的方法。
//求两个整数的最大值 public int max(int a,int b){ return a>b?a:b; } //求三个整数的最大值 public int max(int a, int b, int c){ return max(max(a,b),c); } //求两个小数的最大值 public double max(double a, double b){ return a>b?a:b; }
- 形参:在定义方法时方法名后面括号中的变量名称称为形式参数(简称形参),即形参出现在方法定义中。 - 实参:调用者方法中调用另一个方法时,方法名后面括号中的参数称为实际参数(简称实参),即实参出现在调用者方法中。 - 方法的参数传递机制:实参给形参赋值 - 方法的形参是基本数据类型时,形参值的改变不会影响实参; - 方法的形参是引用数据类型时,形参地址值的改变不会影响实参,但是形参地址值里面的数据的改变会影响实参,例如,修改数组元素的值,或修改对象的属性值。 - 注意:String、Integer等特殊类型除外
示例
/* 陷阱1:在方法中,形参 = 新new对象,那么就和实参无关了 */ class Test{ public static void change(MyData my){ my = new MyData();//形参指向了新对象 my.num *= 2; } public static void main(String[] args){ MyData m = new MyData(); m.num = 1; change(m);//调用完之后,m对象的num属性值仍然为1 } } class MyData{ int num; }
-
-
递归的分类:
-
递归分为两种,直接递归和间接递归。
-
直接递归称为方法自身调用自己。
-
间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。
-
-
注意事项:
-
递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
-
在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
-
后续补充示例
即数组的元素可以是基本数据类型,也可以是引用数据类型。当元素是引用数据类型是,我们称为对象数组。
注意:对象数组,首先要创建数组对象本身,即确定数组的长度,然后再创建每一个元素对象,如果不创建,数组的元素的默认值就是null,所以很容易出现空指针异常NullPointerException。
示例
class MyDate{ int year; int month; int day; } class Test{ public static void main(String[] args){ MyDate[] arr = new MyDate[3];//创建数组对象本身,指定数组的长度 for(int i=0; i<arr.length; i++){ arr[i] = new MyDate();//每一个元素要创建对象 arr[i].year = 1990 + i; arr[i].month = 1 + i; arr[i].day = 1 + i; } } }
public static void main(String[] args) { Test test=new Test(); test.hello(0); public void hello(int a){ System.out.println("hello world"+a); if(a<2){ a++; hello(a); 实例调用函数的时候 直接传递实参,和函数在同一个作用域,函数内声明了类型,在栈内存中开启空间,所以不用在调用的时候在声明类型