C有函数,我们Java有方法!
早在初始Java的那一个博客,我好像就给兄弟们说过,在Java中我们把以前认识到的函数叫做是方法,那么如果单单是为了讲一下方法最基本的使用规则,那我直接把我之前的那篇博客复制粘贴到work里,再把关键字 函数统统换成 方法不就行了?
但是那样显然不符合我的初衷,今天阿涛就在这里给兄弟们说一说,Java方法中需要特别注意的几点!
实参和形参的关系
首先我们要清楚的是,对于函数,只有在我们调用函数的时候,才会给函数开辟一块空间,好像是叫做函数栈帧来着?那同样的,我们高贵的main函数,它就是再牛,他也是一个函数啊,只不过main函数是我们程序的入口,我们就是从main函数进入程序的,所以一开始,我们就会给main函数开辟一块空间,然后每每创建一个变量啊,数组啊之类的,都会往这块函数栈帧底部填充,这好像是叫做一个什么压栈的过程,如果兄弟们水平够高,知道了那个那理解起来一定是事半功倍!但是如果兄弟们目前不懂那个,也无伤大雅,不足以对我们理解造成任何的影响!
那么作为Java新生,我们对于实参和形参的理解极有可能出现偏差,所以阿涛在这里会给兄弟们用代码辅佐以图文进行讲解!保会!
public static void exc(int a,int b){
a=20;
b=10;
}
public static void main(String[] args) {
int a=10;
int b=20;
System.out.println("a="+a+" b="+b);
exc(a,b);
System.out.println("a="+a+" b="+b);
大致的逻辑是,我们写一个exc方法 ,意图是改变我们a,b的值,我们在调用这个方法的前后,分别输出一下a,b看看效果!
不对劲,不对劲……
这一张图一拿出来,有没有轻轻敲醒兄弟们沉睡的心灵?兄弟们是不是有一种拨开云雾见天明的感觉?
正如我刚才说的,每一个方法都会有自己的一块空间,这块空间和外界是隔离的,也正因此,明明我们的实参已经是a了,但是我们仍然可以在方法中创建一个a来接收我们实参的值,那是不是也就是说明,我们方法中变量值的改变,其实也是跟我们实参没有任何关系的呢?改来改去,你改变的至始至终都是形参的值,关我实参何事?我这么说,兄弟们可懂?我知道,有的兄弟们肯定就要用那个什么返回值来反击我了,可是兄弟们如果我们使用实参去接受一个返回值的话,是不是也就是相当于一个赋值操作了?我们还是没有在我们的方法中实现对于实参的改变啊!
那这个时候,是不是比较懂C语言兄弟们就又要说了,我们可以取出a,b的地址,然后使用地址把ab的值给改了,很好,这位小兄弟很有前途,这就是我们后面要讲的关于引用的知识,但是现在的问题是,我们的Java并不是一个底层的语言,我们是没有办法去拿到变量的地址的……我知道你很急,但是你别急,办法总比困难多,我们现在只要理解好这个实参和形参的关系就很棒了!
方法重载
在一个类里,不可以有两个名字相同的方法,在一个方法里面不可以有两个名字相同的变量,这是我们之前的认识,而且这个认识绝对是三观很正,我们确实应该这样子理解,但是,如果我是说如果,我们想实现一个加法方法,但是我们的参数不可能一直是整数吧,做生意的有零有整很正常吧,那怎么办,我们只有一个sum 可以表示加法吧,难道一直sum1234 ?所以说我们的编程就是为了解决实际生活中的问题的,这时候我们适时引出重载这个概念!
先说重载的使用规则:
1.重载的方法,方法名必须一样!
2.重载的方法,参数列表可以不同(参数的类型,数目)!
3.我们对于重载的方法返回类型不做要求,无论一不一样不影响方法之间构成重载!
相信我,我们通过一个sum 重载,兄弟们就会记忆深刻!
public static int sum(int a,int b,int c){
return a+b+c;
}
public static double sum(double a,double b){
return a+b;
}
public static int sum(int a,int b){
return a+b;
}
public static void main(String[] args) {
int a=sum(1,2);
System.out.println(a);
double b=sum(1.1,2.2);
System.out.println(b);
int c=sum(1,2,3);
System.out.println(c);
}
我们可以看到,就结果来说,我们应该是完美完成了任务,就我们写的重载的方法来说,是不是也是和我们之前讲的完全匹配?
此时应该会有好奇宝宝来问了:阿涛阿涛,我们写了这么多名字一样的方法,那程序时如何识别我们到底该使用哪一个呢?首先我们要知道为什么一个作用域里面不能够定义两个名称相同的标识符,这就涉及我们的方法签名的概念了,如果要深入我们的底层给兄弟们讲解可以是可以,但是那样只会加重兄弟们的负担,随着兄弟们知识层面的增长,以后自然会知道的!这里简单说一下就行:方法全路径名+参数列表+返回值类型,这就是我们方法签名的组成。
public static
相信一些细心的兄弟们发现了我们在每一个方法之前都是要加上这两个单词的,public 表示的是访问权限,static 表示的是这是一个静态的方法,就目前来说,我们写的每一个方法之前都加上这个就可以了,现在只要知其然,以后我会教大家如何知其所以然,理解过多反而容易忘记!
好的兄弟们,那么对于方法,我想讲的东西就这么多了,希望我的这篇博客能够帮助到大家!
百年大道,你我共勉!