您的位置 首页 java

愉快地学Java语言:第六章 方法

导读

本文适合 Java 入门,不太适合Java中高级软件工程师。本文以《Java程序设计基础篇》第10版为蓝本,采用不断提出问题,然后解答问题的方式来讲述。本篇文章只是这个系列中的一篇,如果你喜欢这种讲解方式,或者觉得从中能学到知识,可以关注我,以便查阅本系列其他文章。

让我们开始愉快地学习Java语言吧!

1定义方法

我们用方法干嘛呢?

想下这样的情景,由上万行代码构成的程序,一行一行地从头写到尾,其中包含了好多重复代码,或者极为相似的部分,是不是做了很多无用功,因为有那么多重复的内容。

于是,想到一个办法,将这样的代码抽取出来,独立成代码块,并为这个块命名,然后再用到这段代码的地方,以其名称代替,代码一定会得到极大的简化,开发效率也会大幅度提高。

能给方法下一个描述性的定义吗?

方法是为完成一个操作而组合在一起的语句组。

方法的语法结构是什么样的呢?

语法定义:

修饰符 返回值类型 方法名(参数列表){

// 方法体;

一个或多个语句;

}

我们把修饰符,返回值类型,方法名,参数列表被称为方法头。

方法可以有返回值,也可以没有;有的话,好理解,譬如我们学过的数值型,字符型,字符串型,那么没有返回值呢,怎么表达?

没有返回值就用void表示。

参数列表中声明了参数类型,个数,顺序,但不给变量赋值,它就像一个 占位符 ,我们称之为 形参 。而当调用方法时,传递给方法的值被称为 实参

形参和实参有啥区别呢?

形参不是方法中用到的值,实际用到的值是实参。

方法可以有参数列表也可没有。

方法名和参数列表共同构成了 方法签名

2方法调用

调用就是执行方法中的代码。

那么怎么写代码呢?

下面的例子定义并实现了selectionSort方法。修饰符为public和 static ,返回值类型为int[],方法名为selectionSort,参数列表为int[] arr。在main方法中调用了selectionSort方法,并将实参arr传递给形参arr。(int[]是数组类型,后面会讲到)

那么这段代码是怎么起作用的呢?

当调用目标方法时,控制权就从主调方法转向目标方法,产生的结果就是开始执行被调方法。当被调方法结束后,控制权重新回到主调方法,执行目标方法之后的代码。就像上面main方法中,被调方法后面还有打印数组元素的语句,当方法执行完,返回数组后,开始执行打印语句。

大家发现main方法和selectionSort方法的区别了吗?

一个有返回值,一个没有返回值,有返回值的方法体内包含return语句,无返回值的没有return语句。

有返回值的方法必须包含return语句,那么无返回值的方法呢?

无返回值的方法可以包含,也可以不包含。若包含的话必须写作:

return;

也就是return后不跟变量。

那么return语句应该位于方法的什么位置呢?

先看两个例子。

注意那个警告了吗?75行是个无用的代码!因为执行到return方法就结束了。

将上例稍稍改下:

报错了,这是为啥呢?

因为我们使用了if选择语句,这样就导致并不是所有情况下,都指明方法有返回值。但if块的执行条件是true也就是会永远执行,那么rreturn语句一定会执行的。估计编译器判断不出这个逻辑。

让我们改正它:

这回不报错了,但还是有警告。

来看这么一段简单的代码

没有问题了。

由此看见,一般,return是方法体的最后一条语句,除非有多个return存在。

让我们来看看方法调用的细节。首先明确几个概念。

活动记录:它是一块内存区域,保存了被调用方法的参数和变量。

堆栈:又称调用堆栈、执行堆栈、运行时堆栈、机器堆栈。

每当调用一个方法时,系统会创建一个活动记录(也称为活动框架),用于保存方法中的参数和变量。

当一个方法调用另一个方法时,调用者的活动记录保持不动,一个新的活动记录被创建用于被调用的新方法。一个方法结束返回到调用者时,其相应的活动记录也被释放。

3参数传递

调用方法时以传值方式将实参传递给形参,称为按值传递。

那么如果有多个形参,形参与实参如何匹配呢?

按照定义的形参的顺序来匹配,并且类型要兼容,数量要一致。

例如,给上面实现的selectionSort方法传递float[]类型的参数会报错。

selectionSort定义了一个形参,而你给他传递两个实参,会报错。

类型兼容的含义大家还记得吗?

就是一种类型转换成另一种类型时不需要显示转型。

4 重载 方法

定义:实现一个方法,使其方法名与原方法相同,而形参列表不同即为重载方法。

如何对定义进行解读呢?形参列表不同包括哪些情形呢?

形参数量不同,或形参类型不同。只有这两种情形。

那么如果两个方法的返回值不同算不算重载呢?

根据定义,无法通过返回值不同来重载方法。

能不能通过修饰符不同来重载方法呢?

根据定义,也不行。

重载方法后,有了几个同名的方法,那么编译器有没有可能无法判断该调用那个呢?

有可能,称这种情形为歧义调用。

导致歧义调用的原因是,1是整型直接量,默认是int型,那么int型值传给double是不需要显示转型的。因此会匹配到两个方法。要解决这一问题,可以更明确地指定参数类型:

5变量 作用域

定义:变量可以被引用的范围

方法中定义的变量叫 局部变量 ,那么参数列表中的变量呢?

它也是局部变量,它的作用域是整个方法。

局部变量的作用域是从它开始定义的地方起,到它所在块结束为止。

块什么时候结束呢?

块是有{}括起来的部分,那么}标识了块的结束。

例如,下面的代码中for循环定义了变量i,那么在循环体外是无法引用它的。

每天30分钟,坚持一个月就能为Java开发打下坚实的基础!努力学习吧!

也许你还想看看其他章节的内容:

文章来源:智云一二三科技

文章标题:愉快地学Java语言:第六章 方法

文章地址:https://www.zhihuclub.com/200308.shtml

关于作者: 智云科技

热门文章

网站地图