再谈方法
方法的重载
可变形参的方法
方法参数的值传递机制❗❗❗(重要)
递归方法
方法的重载 在同一个类 中,允许存在一个以上的同名 方法,只要它们的参数个数或者参数类型不同 即可。重载与方法的权限修饰符、返回值类型、形参变量名、方法体 没有关系,只看参数列表 ,且参数列表必须不同 ( 参数个数或参数类型 ) 。调用时,根据方法参数列表的不同来区别。如下的5个方法构成了重载:
1 2 3 4 5 6 7 8 9 public void getSum (int x,int y) {return x+y;} public void getSum (double x,double y) {return x+y;} public void getSum (int x,int y,int z) {return x+y+z;} public void getSum (String x,int y) {return x+y;}public void getSum (int y,String x) {return x+y;}public int getSum (int x,int y) {return x+y;} public void getSum (int m,int n) {return m+n;} private void getSum (int i,int j) {return x+y;}
可变形参的方法 JavaSE 5.0 中提供了Varargs(variable number of arguments)机制,允许直接定义能和多个实参相匹配的形参。从而可以用一种更简单的方式,来传递个数可变的实参。
1 2 3 4 public static void test (int a ,String[] books) ;public static void test (int a ,String…books) ;
声明格式:方法名(参数的类型名 …参数名)。
可变参数:方法参数部分指定类型的参数个数是可变多个:0个,1个,2个或多个。
可变个数形参的方法与本类中方法名相同,形参不同的方法之间构成重载。
可变个数形参的方法与本类中方法名相同,形参类型也相同的数组 不构成重载,二者不能共存。
方法的参数部分有可变形参时,需要把可变形参放在形参声明的最后。
在一个方法的形参位置,最多只能声明一个可变个数形参。
1 2 3 4 5 6 7 public void show (String ... strs) {}public void show (String[] strs) {}public void show (String ...strs,int i) {}
方法参数的值传递机制 方法必须由其所在类或对象调用才有意义。若方法含有参数: 📌 形参:方法声明时的参数 📌 实参:方法调用时实际传给形参的参数值 Java方法参数的传递方式仅有值传递 ,即将实际参数值的副本传入方法内,而参数本身不受影响。 📌 形参是基本数据类型 :将实参基本数据类型变量的“数据值 ”传递给形参。 📌 形参是引用数据类型 :将实参引用数据类型变量的“地址值 ”传递给形参。 📌 如果变量是基本数据类型,此时赋值的是变量所保存的数据值。 📌 如果变量是引用数据类型,此时赋值的是变量所保存的数据的地址值。
练习 练习1
练习2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 public class Test2 { public static void main (String[] args) { int a = 10 ; int b = 10 ; method(a,b); System.out.println("a=" +a); System.out.println("b=" +b); } } public static void method (int a,int b) { a = a * 10 ; b = b * 20 ; System.out.println("a=" +a); System.out.println("b=" +b); System.exit(0 ); } public static void method (int a,int b) { PrintStream ps = new PrintStream (System.out){ @Override public void println (String x) { if ("a=10" .equals(x)){ x = "a=100" ; }else if ("b=10" .equals(x)){ x = "b=200" ; } super .println(x); } }; System.setOut(ps); }
exit()方法属于System类,System这个类是在java.lang包中,我们从API文档中找到这个方法(java.lang包在系统运行中自动加载,不需要通过import这个方法,所以可以直接调用该方法)。System.exit(int status)这个⽅法是⽤来结束当前正在运⾏中的java虚拟机。System.exit(0)是正常退出程序,⽽System.exit(1)或者⾮0,表⽰⾮正常退出程序。
练习3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 for (int i = 0 ;i < arr.length;i++){ arr[i] = arr[i] / arr[0 ]; } for (int i = arr.length-1 ;i <= 0 ;i--){ arr[i] = arr[i] / arr[0 ]; } int temp = arr[0 ];for (int i = 0 ;i < arr.length;i++){ arr[i] /= arr[0 ]; }
练习4 1 2 3 4 5 6 int [] arr = new int [10 ];System.out.println(arr); char [] arr1 = new char [10 ];System.out.println(arr1);
1 2 3 4 5 6 7 8 9 10 public class ArrayPrintTest { public static void main (String[] args) { int arr = new int []{1 ,2 ,3 }; System.out.println(arr); char [] arr1 = new char []{'a' ,'b' ,'c' }; System.out.println(arr1); } }
第一个输出用的是println(Object x)方法;第二个用的是println(char x[]),方法体 会遍历数组。
练习5 1 2 3 4 5 6 7 8 9 10 11 12 public class ValueTransferTest { public static void main (String[] args) { String s1 = "hello" ; ValueTransferTest test = new ValueTransferTest (); test.change(s1); System.out.println(s1); } public void change (String s2) { s2 = "hi~~" ; } }
String在字符串常量池 ,是不可变的字符序列,记住存的是地址值,传的就是地址值。
递归方法 递归方法:一个方法体内调用它自身。 📌 方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无须循环控制。 📌 递归一定要向已知方向递归,否则这种递归就变成了无穷递归,类似于死循环。
1 2 3 4 5 6 7 8 public int getSum (int n) { if (n == 1 ){ return 1 ; }else { return n + getSum(n-1 ); } }
1 2 3 4 5 6 7 8 9 10 public int f (int n) { if (n == 0 ){ return 1 ; }else if (n == 1 ){ return 4 ; }else { return 2 *f(n-1 ) + f(n-2 ); } }
1 2 3 4 5 6 7 8 9 public int fibonacci (int n) { if (n == 1 || n == 2 ){ return 1 ; }else { return fibonacci(n-1 ) +fibonacci(n-2 ); } }