方法的使用与定义
1.定义:
方法的定义由方法名称、参数、返回值类型和方法体组成;
如图,主函数main就是个方法;
public class N {
public static void main(String[]args){
int i=5;
System.out.println(nJie(i));
}
public static int nJie(int n){
if(n==1){
return 1;
}else{
return nJie(n-1)*n;
}
}
}
以上述求阶乘的程序为例:
1.对于一个方法,当不需要返回值时,返回值类型写void即可;
而当要返回值时,必须要注意的是,方法的返回值语句不能忘,即return语句;再一个就是韩沪指的方法必须要和定义的方法返回值相同,下图便是返回值为int,而定义的返回值类型是char,故会有报错。
2.在写程序时,一定要注意实参与形参的数据类型匹配和个数匹配;
3.形参与实参:
形参是定义在方法的()中写入,当实参的的值给形参时,这个过程就叫“按值传递”;对于基本数据类型来说,实参传递形参时可以的,但形参的值的改变不会影响实参的变化。
注意:在方法中声明的变量是局部变量,它的作用域只能在方法当中,即从它声明开始到变量块结束。
4.方法的好处:在开发当中,每一个大的问题都会分解成小的问题,而每一个小的问题即可以用方法来书写。
(1)易于程序的读写与修改、调试等;
(2)方法的调用,减少了冗余的代码,使得它的代码利用率提高;
(3)方便合作,不同的问题交给不同的人员,编写不同的方法,有效。
方法的重载(OVERLOAD)
以下列程序为例:
public class ChangeBig {
public static void main1(String[] args) {
System.out.println(daXiao(5,9));
System.out.println(daXiao(55.6,16.2));
daXiao(3,1.2);
}
public static int daXiao(int a,int b){
if(a>b){
return a;
}else{
return b;
}
}
public static double daXiao(double a, double b){
if(a>b){
return a;
}else{
return b;
}
}
public static void daXiao(int a, double b){
if(a>b){
System.out.println(a);
}else{
System.out.println(b);
}
}
public static void main(String[] args) {
System.out.println(max(5,9));
System.out.println(max(5.1,9.6));
System.out.println(max(5.3,6.9,11));
}
public static int max(int a,int b){
return a>b? a:b;
}
public static double max(double a, double b){
return a>b? a:b;
}
//返回值应为double,但int比double小,故也可以
public static double max(double a,double b,int c){
double ret =max(a,b);
if(ret>c){
return ret;
}else {
return c; //返回int
}
}
}
可以看出,例子中同样的名字可以定义不同的方法,只要它们的参数列表不同即可。
由此,总结重载即为:
(1)方法名相同;(2)参数列表不同(个数、类型);(3)且返回值并不作要求。
方法--------递归思想
1.递归:顾名思义,分为俩个部分:“递”,“归”。即回溯和递推。
2.理解递归:条件:(1)调用自己本身(2)有一个趋近于终止的条件。
3.采用递归时,不要尝试去展开代码,大数据的回溯与递推很难去理解,比如汉诺塔64盘子问题,而是要用横向的思维,是看,起始,过程,结果。
#理解递归,可以采用栈的思想,先进后出。求大问题时,做一半将出现一个小问题压着你,以此类推,只有最顶层的最简单的解决后,再往下推到最后的大问题。递推是一种思想,有事用递推,会浪费内存,占用很多时间,但一部分题天生就就为递归而生,最经典的就是数据结构当中的二叉树。
附汉诺塔问题程序:可自行理解
public class HanNuoTa {
public static void main(String[] args) {
System.out.println("输入要移动的数量:");
Scanner in = new Scanner(System.in);
int i=in.nextInt();
hanNuo(i,'a','b','c');
}
/*
* i:数量
* pan1:起始
*pan2:中转
* pan3:目的
*/
public static void hanNuo(int i,char pan1,char pan2,char pan3){
if (i ==1){
move(pan1,pan3); //从a到c
return;
}else {
hanNuo(i-1,pan1,pan3,pan2); //将底盘以上的盘子移到中转站
move(pan1,pan3); //将底盘的盘子移到目的站
hanNuo(i-1,pan2,pan1,pan3); //将中转站的盘子移到目的站
}
}
public static void move(char pan1,char pan2){
System.out.print(pan1+"->"+pan2+" ");
}
}