①方法
文章目录
1. 方法的引入
引例
-
现在有三个需求:
- 编写程序,计算10+20,并输出结果
- 编写程序,计算111+222,并输出结果
- 编写程序,计算333+444,并输出结果
-
请分析:
- 这个程序有哪些缺点?
结论
-
显然这个程序当中的代码没有被复用,我们重复写了大量代码,是可以被优化的
-
这个时候我们就需要这样一种机制:
- 能够重复实现某种特定功能,解决某一类问题
- 每次重复实现功能时,只需要传入具体的数据
- 实现功能后,可以给出一个结果数据
-
这种机制就是Java语言中的方法(method)
-
使用” 方法 “去实现某种特定功能的过程叫做方法的调用(invoke)
2. 方法的定义
一般情况下,定义一个方法是以下语法结构:
[修饰符列表] 返回值类型 方法名 (形式参数列表){
//方法体
}
两个概念
-
[修饰符列表] 返回值类型 方法名 (形式参数列表) 合起来称之方法的声明(也叫方法头)
-
方法的签名:方法名+ (形式参数列表)
-
编译器通过方法签名来判断方法是否重复定义了,方法名和参数列表,如果返回值类型不同而方法名和参数列表一样,也会报错
逐一解释
- 修饰符列表:修饰符列表不是必须的,可以为空不写,现在默认为public static(具体含义面向对象讲)
- 返回值类型:方法可能会有结果,这个结果就是返回值,返回值的数据类型称之为返回值类型
- 返回值类型可以是基本数据类型,也可以是引用数据类型(例如String)
- 此时表示方法拥有返回值,必须显式的指出该返回值,否则编译报错
- 在方法体中用“return”关键字指示返回值,格式为“return + 返回值”
- return后的返回值的数据类型,要和方法声明中的返回值类型保持一致(或者兼容)
- 方法执行到return时,方法执行完毕
- 方法完全可以没有结果,也就是没有返回值,但是方法必须要有返回值类型,用关键字void标记
- 使用void标记的方法,没有返回值,自然也无需指出返回值
- 返回值类型可以是基本数据类型,也可以是引用数据类型(例如String)
- 方法名:给方法起个名字,调用方法时用的,方法名的命名需要遵守规范
- 必须是合法的标识符
- 方法名最好“望文生义”
- 方法名最好是动词
- 方法名遵循首字母小写,其他单词的首字母大写的“小驼峰命名法”
- 形式参数列表:方法在实现功能时,有时需要传入数据。
- 方法在定义时就应该告诉方法的调用者应该传入什么数据,这就是形式参数列表,简称形参列表
- 形参可以是基本数据类型变量,也可以是引用数据类型变量
- 形参的个数不受限,多个形参之间用逗号隔开
- 形参的作用域仅在方法内部,它们都是局部变量
- 形参中起关键决定性作用的是形参的数据类型,形参名只是一个标识符,不会影响方法调用
- 形参列表实际只是一个占位符,并不是真正的参数。
- 调用方法时传入的具体数据参数称之为实际参数,简称实参
- 方法调用时,实参和形参的数据类型要一一对应,并且保持一致(或者兼容)
- 方法在定义时就应该告诉方法的调用者应该传入什么数据,这就是形式参数列表,简称形参列表
- 方法体:方法体包含具体的语句,定义该方法的功能,由大括号包裹起来。
方法的本质
- 方法实际上是可以重复完成特定功能的代码块,是为了代码复用
函数与方法(C++/Java)
- 方法可以认为是一个程序的子程序,在许多程序设计语言中(比如C/C++)用函数这个术语描述命名子程序
- 函数和方法只是用词习惯上和名字叫法上的差别,实质上是一样的结构
注意事项:
- 方法不调用,不执行,各个方法之间是平行关系
- 方法要定义在类体中,方法不能嵌套,方法在类体中定义的顺序对方法调用没有影响
- 对于修饰符列表中有static的方法,在同一个class的main方法中的调用方式是:方法名(实际参数列表)
- 调用一个有返回值的方法,实际上就是操作返回值,void方法不能做任何操作。
3. main()方法
main方法详解:
public static void main(String[] args) {
//方法体
}
- public static表示“公开的,静态的”,具体含义面向对象再讲
- void表示方法没有返回值
- main是方法名,代表这个方法是主方法,是程序的入口方法。
- main不是关键字,但是自定义方法不要用这个名字
- (String[] args)是形参列表,其中String[]是一种引用类型,数组(马上讲),args是一个形参名
- 理论上来说,args可以在符合标识符命名的前提下可以任意写。但是不建议这么做
- main方法是启动程序时给JVM调用的,是程序的入口方法
方法不必一定定义在main方法之后,类当中所有的方法都是平行的关系,所谓顺序执行,指的是main方法中的代码是按顺序来的
4. 小试牛刀
小试牛刀
- 键盘录入两个值,求最大值
- 定义一个方法,求圆的面积
- 方法参数:半径 (radius)
- 圆周率:3.14
- 定义一个计算器(Calculator)它的功能有
- 加,减,乘,除
- 求平方
- 求a的n次方
5. 什么时候需要使用方法?
- 复用代码
- 很多时候我们会在一个方法中写大量的代码去实现某个功能,但是一个方法中代码过多会导致结构臃肿
- 所以很多时候,即便是不需要复用代码,也可以考虑提取出新的方法
- 优化代码结构
- 使程序变得更简短而清晰
- 所以很多时候,即便是不需要复用代码,也可以考虑提取出新的方法
- 提取方法的快捷键Ctrl+Alt+M
方法调用时,传入的实参和形参必须一致吗?
存在类型提升,并不要求完全一致,这里一般指的是基本数据类型的数据转换,基本数据类型和string无法发生转换。引用类型也可以自动类型转换
方法返回值也存在自动类型转换
②方法的重载
1. 方法的重载引入
引例
-
现在有三个需求:
- 编写程序,计算两个int类型数据之和,并输出结果
- 编写程序,计算两个double类型数据之和,并输出结果
- 编写程序,计算两个long类型数据之和,并输出结果
-
请分析:
- 这个程序有哪些缺点?
结论
- 显然这三个方法实现的都是相似的功能,都是求和,只不过是针对的数据类型不同罢了
- 如果它们能够拥有相同的方法名:
- 那么可以方便我们记忆,方便我们去调用这些方法
- 所以在这里,程序有优化的空间
- 如果它们能够拥有相同的方法名:
- 这个时候我们就需要这样一种机制:
- 针对实现相似的功能的方法,允许它们有相同的名字
- 方便记忆,方便调用
- 以上所描述的正是Java的方法重载机制(overload)
2. 方法的重载概述
描述
- Java方法的重载是指一个类中能够定义多个同名方法的现象,在Java当中非常普遍
语法结构:
一个类中的多个方法,具有相同的方法名,但是形参列表不同
- 形参列表不同意味着:
- 形参数量不同
- 形参数量相同时,形参的数据类型不同
- 形参数量和数据类型都相同时,形参的数据类型的顺序不同
- 注意除了上述,其余不同都无法构成方法重载
- 形参的名字不同,可以构成方法重载✖
- 返回值类型不同,可以构成方法重载✖
- 修饰符列表不同,可以构成方法重载✖
- 明确记住,方法的重载只与方法的签名有关
- 即在方法名相同的情况下,方法签名不同,参数列表不同
3. 什么时候使用方法的重载?
- 实现相似的功能(功能差不多,只是传入的参数不同)
出现多个形参匹配的情况,采用就近原则,优先选择最近的结果,比如实参是int类型选择形参int,而不是double
对于有多个参数构成的方法重载,要小心使用,否则可能导致说明不清编译器无法选择,比如形参列表为int double和double,int时
③Junit单元测试
1. 基本使用
学会使用Junit单元测试是开发中必不可少的技能,这里简单介绍一下它的基本使用
准备工具
- IDEA 2018.3
语法
@Test
public void methodName(){
}
注意事项
- 格式上:
- @Test叫做注解,它是和class平行级别的数据类型,不要在一个Test的类中使用Junit单元测试
- 如果你非要在一个Test类中使用@Test注解,语法上也是可以的,会优先选择自身的test,而不是junite的test
- 也就是使用全限定类(注解)名,但是这种用法很麻烦,几乎不会被使用
- public void 是固定格式,不可修改,修改会报错
- 方法的形参列表,必须是空的,否则报错
- @Test叫做注解,它是和class平行级别的数据类型,不要在一个Test的类中使用Junit单元测试
- 做单元测试的类中,不要写main方法,没有太大意义
- 不要在一个叫Test的类中使用,会选择它自身
全限定类名:要区分两个同名的类,要使用到包名,包名+类名叫全限定类名,可以唯一确定一个类
2. 用途说明
单元测试的用途
- 用来写写小demo,验证各种奇怪的idea
- 写代码,写方法,写到一半可以用来提前做个小测试
- 单元测试最重要,最具有实用价值的用途是用来写单元测试代码,提升工程的单元测试覆盖率
- 白盒测试和黑盒测试
- 代码写完后,需要做测试,验证代码的可执行性和可靠性
- 第一步往往就是要做单元测试,称之为白盒测试
- 由于开发对自己写的代码更加熟悉,所以单元测试往往都是开发去写的
- 绝大多数具有规模的公司都会,要求开发在写业务代码的同时进行单元测试
- 单元测试覆盖率往往要求不低于80%,有些公司要求更高
3. 写在最后
写在最后
当然,Junit的内容远比我们现在讲的要多,但是限于目前学习进度,不能也不需要深入去讲
如果大家进入公司,有做单元测试覆盖率的需求,我相信对于那个时候的大家学习一个Junit就是小菜一碟