文章目录
一、什么是方法
方法和C语言的函数的功能是一样的,但在具体使用上,还是有区别的,区别在定义里面说。
对于方法,在我的脑海中我想象出了生活中的情景去理解它,我将方法比作了思路去进行了理解。:
在我高中时期,当我们学生在做完一套题时,学生有不会的题,就去问自己班的老师去,其中有一道题,老师被问了好多遍,老师就想这个题这么多学生问,可能还有的同学不会i,没有来问,我就去课上讲一下这道题的思路,让不懂的同学都听一下,此时老师把这道题的思路公布出来,讲给所有的同学听,这样就少讲了好多遍,不用单个单个的再给学生重复讲了,提高了效率。
在编程的世界中,也有这样的事情发生,如果有一段代码需要被频繁的使用,那么就把这一段代码写成一个方法,这个方法就是我上面说的老师讲的这道题的思路,思路就是一个方法,一个可以解决一个问题的方法,在需要这一段代码时,只需要调用这个方法就可以,不用再重复编写代码。
对于方法的理解,同志们应该多做一些练习,才能更深刻的理解,方法被创造出来的意义。
二、方法定义
方法是由哪几部分组成的呢?就像一道题的思路,思路由开头,中间和结尾组成。
方法由修饰符+返回值类型+方法名称+参数类型+方法体代码+return 返回值组成,如果返回值类型是void,就不需要return 返回值。
定义方法时,有以下注意事项:
1:对于返回值类型,如果方法不需要返回一个值,返回值类型就是void,void表示的是无类型,中间的字母o,可以理解为空的意思,空就代表没有。具体一点可以理解为:返回值类型就是数据类型,可以向内存申请空间,如果方法不需要返回一个值,我为什么还要申请空间呢?直接给void,很合理,如果方法要返回一个值,就给定合适的数据类型用来接收就可以。我个人理解的这里方法返回的值和给定的数据类型和C语言中的地址和指针类型的变量是相似的,在C语言里面,我是这样理解地址和指针类型的变量的,地址我想象成了一个魂,孤魂野鬼的魂,它必须要找到一个躯壳,来存放自己的魂,躯壳要和自己的魂相对应,如果是一个人类的魂,要找到人类的躯壳,如果是狗狗的魂,要找到狗狗的躯壳里面,所以地址要存放到指针类型的,变量里面时,要找对数据类型,如果是整型的地址,要放到整型的指针变量里面,如果是浮点型的地址,要放到浮点型的变量里面,所以方法返回的值,应该方法应该使用合适的数据类型的变量接收。
2: 方法的名字要使用小驼峰命名:例如isPrime,第二个单词的首字母要大写,大驼峰的意思是,每一个单词的首字母大写,例如:TestDemo
3: 如果参数列表中没有参数,就什么都不写,如果有参数,参数与参数之间使用逗号隔开。
4: 方法必须写在类当中,写在类外面会出错,这里将类比作教室,方法比作学生,如果学生在上课期间跑出教室,那学生就犯错了。
5: 方法不能嵌套定义,意思是不能在一个方法里面,定义一个新的方法,如果要定义一个方法,必须要在方法外定义,方法与方法之间是平等的,将方法比作学生,学生不可能生出学生,这是没有逻辑的。
三、方法调用
方法调用就是去使用方法,如何去使用方法呢?,方法名代表方法,就像我们的名字就可以代表我们个人,写下方法名再将需要传给方法的值,传给方法,等待编译到这行代码时,就会使用这个方法,调用这个方法。
传给方法的值是方法的实参,用来接收传进来的值的是形参,在这里可以将方法比喻成一个加工厂,原材料就是实参,要将原材料送进厂子里去,就要需要地方来存放这些原材料,这个地方就是形参,最后加工厂加工出的产品可以交出来,也可以不交出来,不交出来,就无法使用这个产品,只有交出来,才能使用。
对实参和形参的认识:
对于基本类型来说:
形参只是实参的一份临时拷贝,对形参的修改不能改变实参的值。
实参和形参保存在内存空间的位置不一样。
我将实参和形参这两者的关系,想象成了我生活中的一个情景,我将实参比作在高中时期,一个原装的卷子,这个卷子是老师手写的,要去复印好多份,此时形参是复印出的卷子,如果此时有一个学生将复印的卷子给扔掉了,那么那张手写的卷子会不会受到影响,答案是不会的。
对于引用类型: 学到数组再讲!
四、方法重载
1、什么是方法重载?
方法重载的意思是方法名同时被多个方法所使用,也就是一个人的名字被很多人使用,世界上不可能只有一个人叫马云。
2、为什么会出现方法重载?
这里可以想象一个公厕可以由很多人使用,如果一个公测只能由一个人使用,那得需要建多少公厕,又费时间又费金钱。
在我们编写代码时,是一个道理,为了提高我们的效率,会定义很多方法,如果一个方法对应一个方法名,那需要记很多方法名,这很费劲,所以就规定一个方法名可以由很多方法共用。
3、被称为方法重载的必要条件是什么?
- 方法名必须相同
- 这里可以想象世界上不可能有两个一摸一样的人,即使他们的名字相同,但总会有差异,就像马云和小马云,虽然他们的名字一样,但是他们的身高,智力等等,这些一样吗?肯定是不一样的,对于方法的参数列表也是一样的,方法的参数列表必须不相同,参数列表不相同包括为:参数个数不同+参数次序不同+参数的类型不同,只要有一个不同,就是参数列表不同,也就是马云和小马云他俩身高不一样,这一点就说明了,他俩是不相同的,即使名字是相同的。
- 与返回值的类型是否相同无关
一二点是成为方法重载必须遵循的条件,缺一不可,就像是方法重载是一个学习好的人,你要成为学习好的人,你必须各科成绩都好,才会成为学习好的人,只要有一科不好,就不是学习好的人,你必须满足前面两点,才会称为方法重载,第三点就像是高中的体育课,这门的成绩不会决定你是学习好的学生还是学习不好的学生,即使只有返回值的类型不同,参数列表都相同,仍然不能称为重载。
4、编译器是如何识别出相同名字的方法的呢?
成功在编译器上编写了两个名字相同的方法,编译器是如何识别出这两个不一样的方法的呢?是使用方法签名,进行标识出不同的方法来的。
方法签名是由:方法全路径名+参数列表+返回值类型,这三者构成。
五、递归
1、什么叫递归?
一个方法在执行过程中,或者说在完成任务的时候,调用自己的过程,叫做递归。
对于递归这个过程,我想象出了一个生活中的例子:
我正在家中写作业,然后妈妈叫我去买一瓶酱油,在去的路上,我在路下玩了一会,玩完之后,我去买酱油,买到之后回家,再继续写完作业。
写作业->买酱油->玩,这一个过程叫做递,
玩完->买完酱油->写完作业,这一个过程叫做归。
两个过程合并到一起,叫做递归。
2、为什么要使用递归?
对于为什么使用递归,我又想到了生活中的例子:
就比方说吃一大碗米饭,不可能一口吃完,那就要分好几口才能吃完,直到吃完为止。
递归就是这样的一个过程,一个解决问题的一个过程,吃一碗米饭,可以理解为一个问题,要解决的问题,原问题太复杂,不能一下子解出来,那就把这个原问题拆分,拆成一个与原问题相似,但规模较小的问题,如果还不好解开,就一直拆,直到能够很容易解开为止。
3、递归作为一个过程,什么时候停止?
递归,顾名思义它是一个过程,递出去之后,它要归。
就像你写作业时,妈妈让你买酱油,你在买酱油的路上,玩了一会,玩到天黑了,就该停止了,不能在去干别的了,你就要去买酱油,买完酱油就该回家写作业了。
这个条件就是:天黑,到天黑之后,就要往回走了,不能在往外边走了。
4、详细理解递归这个过程:
5、使用递归的练习题
1、求n的阶乘
现在的问题是:使用方法求n的阶乘,一下子不好求,进行拆分,就像吃米饭一样,可以先求出n-1的阶乘,再乘以 n,再拆,求n-2的阶乘,再乘以n-1,最后拆成只剩下求1的阶乘,就可以完成这个任务了。
public static void main(String[] args) {
System.out.println("请输入:");
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int ret = 0;
ret = jieCheng(n);
System.out.println(ret);
}
public static int jieCheng(int n) {
if(n == 1) {
return n;
} else {
jieCheng(n - 1);
return n * jieCheng(n - 1);
}
}
2、从左到右打印一个数的每一位
现在的问题是:打印每一位,使用方法去解决这个问题,但一下子解不出来,把问题拆分,拆成先不用打印最后一位,打印前面的,再拆,直到拆到打印一位,这个问题可以轻松完成,再继续完成后面的任务。
public static void main(String[] args) {
System.out.println("请输入:");
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
print(n);
}
public static void print(int n) {
if(n < 9) {
System.out.print(n + " ");
} else {
print(n / 10);
System.out.print(n % 10 + " ");
}
}
3、求1-n之和
public static void main(String[] args) {
System.out.println("请输入:");
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int ret = 0;
ret = sum(n);
System.out.println(ret);
}
public static int sum(int n) {
if(n == 1) {
return n;
} else {
sum(n - 1);
return n + sum(n - 1);
}
}
4、逆置数组中的元素
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7,8,9};
int left = 0;
int right = arr.length - 1;
rew(arr,left,right);
System.out.println(Arrays.toString(arr));
}
public static void rew(int[] arr,int left,int right) {
if(left >= right) {
;
} else {
rew(arr,left+1,right-1);
int tmp = 0;
tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
}
}
5、分别打印一个数的二进制位的奇数位和偶数位
public static void main(String[] args) {
System.out.println("请输入:");
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = 1;
System.out.println("奇数位是:");
odd(n,k);
System.out.println();
System.out.println("偶数位是:");
even(n,k);
}
public static void odd(int n,int k) {
if(k == 32 && k % 2 == 1) {
System.out.print((n&1)+" ");
} else if(k < 32){
odd(n >>> 1,k+1) ;
if(k % 2 == 1) {
System.out.print((n & 1) + " ");
}
}
}
public static void even(int n,int k) {
if(k == 32 && k % 2 == 0) {
System.out.print((n & 1) + " ");
} else if(k < 32){
even(n >>> 1,k+1) ;
if(k % 2 == 0) {
System.out.print((n & 1) + " ");
}
}
}