方法详解
方法这种称呼貌似是 Java 中特有的,在其他编程语言(例如:C 语言)中都称为函数(非数学的概念),当然也有有的语言中称为子程序。单无论如何称呼它还是它,其定义如下:
方法(method)是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集
那它有什么作用呢?
提升代码的重复利用率
使程序变得更简短而清晰
有人说可能会说,就这?我想说的是千万不要小看这个复用率和代码的可阅性,在很多时候是能救命的
注意:
方法必须先创建才可以使用,该过程成为方法定义
方法创建后并不是直接可以运行的,需要手动使用后,才执行,该过程成为方法调用
如果不考虑其他因素的情况下一个方法的定义如下
public void printHelloWorld(){
}
2
3
4
当我们抽离一段代码之后,这段代码不可避免的需要和其他代码进行交互。所以就产生了下面的概念
# 参数
起初我以为这个东西没有官方定义,随意的百度了一下结果还真有。百度百科定义如下
参数,也叫参变量,是一个变量。我们在研究当前问题的时候,关心某几个变量的变化以及它们之间的相互关系,其中有一个或一些叫自变量,另一个或另一些叫因变量。如果我们引入一个或一些另外的变量来描述自变量与因变量的变化,引入的变量本来并不是当前问题必须研究的变量,我们把这样的变量叫做参变量或参数。英文名:Parameter。
上面的说法太过专业和复杂,我的理解是,如果把方法看作是一个封闭空间的话,那么参数就是这个封闭空间和外界交互(通讯)的通道
参数还有一个细分,称为形参和实参,以我刚才的比喻的话,形参就是通道本身,而实参则是由通道中经过的具体物品。我们以计算两个数字相加为例,看下方法中的参数怎么使用
public class Demo1{
public static void main(String args[]){
int a=1,b=2;
// 这里的变量 a 和 b 以及 1 和 2 都可以称为实参
add(a,b);
}
// 此处的 num1 和 num2 可以称为形参
public static void add(int num1,int num2){
System.out.println(num1+num2);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
有意思的是 num1 和 num2 都定义了类型,但是好像很少有人去解释为什么。其实也比较容易理解。还以通道为例,既然是通道那必须要有对应的大小,而数据类型的出现就是为定义大小的
# 返回值
依然是来自百度百科的定义
一个函数的函数名既是该函数的代表,也是一个变量。由于函数名变量通常用来把函数的处理结果数据返回给调用函数,即递归调用,所以一般把函数名变量称为返回值,函数的返回值类型是在定义函数时指定的
虽然足够专业,只是不太好理解,我们以使用漏斗倒油为例子,研究下这个返回值
油瓶子可以看作是我们编写的方法(函数)
漏斗或者瓶口可以看作参数
那么问题是我们怎么知道倒满了呢?很简单因为油瓶是透明的,我们通过视觉可以很直观的知道有没有倒满,而有没有倒满这就是我们需要的结果。也就是说它在把油倒完之后会产生一个结果(至于说盛不下的情况暂时不考虑)。同理,代码中也一样,在方法执行完成之后必然产生一个结果,而这个结果就是返回值
其实还有一种情况,就是油倒完了。我们也不知道瓶子满没满,这种情况代码中通过 void 来表示返回值
我知道这样去描述可能不太严谨,只是个人觉得确实可以这样理解
下面我们看下代码
public class Demo1{
// 这种情况用于描述不知道满没满的情况
public static void demo1(){
return;
}
// 这种就是已经有明确结果的情况
public static int demo2(){
return 1;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 种类
感觉今天和瓶子干上了,现实生活中瓶子有各种各样的,那么方法同样也有分类
如果足够细心的话,你可能会发现,我上面的代码除了第一个在描述方法定义之外。其他的方法全部都有 static 这个关键字
这是因为 Java 的入口方法 main 是带有 static 修饰,如果其他方法如果想能够直接被 main 方法调用的话,同样需要被 static 修饰。至于原因,被 static 修饰的方法和变量都会优先被系统加载
同时我们根据一个方法有没有被 static 修饰分为静态方法(即有 static 修饰)和非静态方法(或者实例方法,也就是没有 static 修饰)
它们的调用方式也有所差异,我们看下面的代码
public class Demo1{
// 实例方法
public void test1(){
}
// 静态方法
public static void test2(){
}
public static void main(String args[]){
// 调用实例方法
Demo1 demo1=new Demo1();
demo1.test1();
// 调用静态方法
test2();
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
其实这个还要分方法是不是在同一个类中定义,上面的代码仅仅是演示在同类