导读
本文适合 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开发打下坚实的基础!努力学习吧!
也许你还想看看其他章节的内容: