Java学习 day02_Method

①方法

1. 方法的引入

引例

  • 现在有三个需求:

    • 编写程序,计算10+20,并输出结果
    • 编写程序,计算111+222,并输出结果
    • 编写程序,计算333+444,并输出结果
  • 请分析:

    • 这个程序有哪些缺点?

结论

  • 显然这个程序当中的代码没有被复用,我们重复写了大量代码,是可以被优化的

  • 这个时候我们就需要这样一种机制:

    • 能够重复实现某种特定功能,解决某一类问题
    • 每次重复实现功能时,只需要传入具体的数据
    • 实现功能后,可以给出一个结果数据
  • 这种机制就是Java语言中的方法(method

  • 使用” 方法 “去实现某种特定功能的过程叫做方法的调用(invoke

2. 方法的定义

一般情况下,定义一个方法是以下语法结构:

[修饰符列表] 返回值类型 方法名 (形式参数列表){
	//方法体
}

两个概念

  • [修饰符列表] 返回值类型 方法名 (形式参数列表) 合起来称之方法的声明(也叫方法头

  • 方法的签名:方法名+ (形式参数列表)

  • 编译器通过方法签名来判断方法是否重复定义了,方法名和参数列表,如果返回值类型不同而方法名和参数列表一样,也会报错

逐一解释

  • 修饰符列表:修饰符列表不是必须的,可以为空不写,现在默认为public static(具体含义面向对象讲)
  • 返回值类型:方法可能会有结果,这个结果就是返回值,返回值的数据类型称之为返回值类型
    • 返回值类型可以是基本数据类型,也可以是引用数据类型(例如String)
      • 此时表示方法拥有返回值,必须显式的指出该返回值,否则编译报错
      • 在方法体中用“return”关键字指示返回值,格式为“return + 返回值”
      • return后的返回值的数据类型,要和方法声明中的返回值类型保持一致(或者兼容)
      • 方法执行到return时,方法执行完毕
    • 方法完全可以没有结果,也就是没有返回值,但是方法必须要有返回值类型,用关键字void标记
      • 使用void标记的方法,没有返回值,自然也无需指出返回值
  • 方法名:给方法起个名字,调用方法时用的,方法名的命名需要遵守规范
    • 必须是合法的标识符
    • 方法名最好“望文生义”
    • 方法名最好是动词
    • 方法名遵循首字母小写,其他单词的首字母大写的“小驼峰命名法”
  • 形式参数列表:方法在实现功能时,有时需要传入数据。
    • 方法在定义时就应该告诉方法的调用者应该传入什么数据,这就是形式参数列表,简称形参列表
      • 形参可以是基本数据类型变量,也可以是引用数据类型变量
      • 形参的个数不受限,多个形参之间用逗号隔开
      • 形参的作用域仅在方法内部,它们都是局部变量
      • 形参中起关键决定性作用的是形参的数据类型,形参名只是一个标识符,不会影响方法调用
    • 形参列表实际只是一个占位符,并不是真正的参数。
      • 调用方法时传入的具体数据参数称之为实际参数,简称实参
      • 方法调用时,实参和形参的数据类型要一一对应,并且保持一致(或者兼容)
  • 方法体:方法体包含具体的语句,定义该方法的功能,由大括号包裹起来。

方法的本质

  • 方法实际上是可以重复完成特定功能的代码块,是为了代码复用

函数与方法(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 是固定格式,不可修改,修改会报错
    • 方法的形参列表,必须是空的,否则报错
  • 做单元测试的类中,不要写main方法,没有太大意义
  • 不要在一个叫Test的类中使用,会选择它自身

全限定类名:要区分两个同名的类,要使用到包名,包名+类名叫全限定类名,可以唯一确定一个类

导依赖 junit jar包

2. 用途说明

单元测试的用途

  • 用来写写小demo,验证各种奇怪的idea
  • 写代码,写方法,写到一半可以用来提前做个小测试
  • 单元测试最重要,最具有实用价值的用途是用来写单元测试代码,提升工程的单元测试覆盖率
    • 白盒测试和黑盒测试
    • 代码写完后,需要做测试,验证代码的可执行性和可靠性
    • 第一步往往就是要做单元测试,称之为白盒测试
      • 由于开发对自己写的代码更加熟悉,所以单元测试往往都是开发去写的
    • 绝大多数具有规模的公司都会,要求开发在写业务代码的同时进行单元测试
      • 单元测试覆盖率往往要求不低于80%,有些公司要求更高

3. 写在最后

写在最后

当然,Junit的内容远比我们现在讲的要多,但是限于目前学习进度,不能也不需要深入去讲

如果大家进入公司,有做单元测试覆盖率的需求,我相信对于那个时候的大家学习一个Junit就是小菜一碟

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值