前面通过main方法介绍了方法的定义形式,对于方法的输入参数来说,还有几个值得注意的地方,接下来分别对输入参数的几种用法进行阐述。
一个方法可以有输入参数,也可以没有输入参数,倘若无需输入参数,则方法定义的圆括号内部直接留空。以打印当前时间为例,下面的showTime方法没有输入参数也能正常实现:

	// 没有输入参数,则方法名称后面的圆括号内部留空。
// showTime方法的用途是显示当前时间
private static void showTime() {
Date date = new Date(); // 创建一个时间对象
int hour = date.getHours(); // 获取当前时钟
int minute = date.getMinutes(); // 获取当前分钟
int second = date.getSeconds(); // 获取当前秒钟
System.out.println("当前时间是"+hour+"时"+minute+"分"+second+"秒");
}

在main方法里面只要以下简简单单的一行代码,即可调用showTime方法,并成功运行showTime内部的时间打印代码:

		showTime();

当然,方法定义的多数情况是存在输入参数的,并且参数格式为“参数类型 参数名称”。像闹钟的设置操作,就必须输入闹钟提醒的时分秒,或者设定闹钟在当前时刻之后的某个时间触发。于是形成了下述的setAlarm方法,该方法允许延迟若干小时后打印日志:

	// 只有一个输入参数,参数格式为“参数类型 参数名称”
// setAlarm方法的用途是设置指定时刻的闹钟,其中时钟为在当前时间上增加若干小时
private static void setAlarm(int addedHour) {
Date date = new Date();
int hour = date.getHours()+addedHour;
int minute = date.getMinutes();
int second = date.getSeconds();
System.out.println("设定的闹钟时间是"+hour+"时"+minute+"分"+second+"秒");
}

如需设定闹钟在一个小时后触发,则调用setAlarm方法时可填写参数1,正如下面这行代码:

		setAlarm(1);

若想输入多个参数,那么在圆括号内通过逗号来分隔参数列表。例如下面的setAlarm方法,支持同时输入小时数和分钟数:

	// 有两个输入参数,参数格式为“参数1类型 参数1名称, 参数2类型 参数2名称”
// 下面的setAlarm方法与上面的setAlarm方法名称相同,但参数个数不同,该情况被称作方法重载。
// 虽然两个方法的方法名称一样,但是编译器仍然能够根据参数个数和参数类型来判断当前要调用的是哪个方法
private static void setAlarm(int addedHour, int addedMinute) {
Date date = new Date();
int hour = date.getHours()+addedHour;
int minute = date.getMinutes()+addedMinute;
int second = date.getSeconds();
System.out.println("设定的闹钟时间是"+hour+"时"+minute+"分"+second+"秒");
}

注意到带两个参数的setAlarm方法和带一个参数的setAlarm方法居然同名,为啥变量不能重名,方法却能重名呢?这是因为这两个方法的参数个数不一样,即使代码里的方法名称看起来相同,其实编译器会偷偷给它俩改名。比如只带一个参数的setAlarm方法,编译器给它的编号可能是“setAlarm_1”;而带两个参数的setAlarm方法,编译器可能给它分配编号“setAlarm_2”。所以只要参数个数不同,或者参数类型不同,代码中的同名方法都会被编译器当作不同的方法,这种情况也称作“方法重载”。
有了方法重载,再来第三个、第四个参数,也能通过重载同名方法来实现。可是如此一来,方法数量就多了许多,有没有一种机制能够动态调整参数的个数呢?该机制在Java中叫做可变参数,意思是参数的个数是允许变化的,只要这些参数的类型保持一致即可。仍旧以闹钟为例,提醒的时间单位时、分、秒分别对应三个整形参数,那么完全可以定义整型的可变参数,参数的数量可多可少,有几个参数就用几个参数。Java的参数“可变”符号利用变量类型后面的三点号“...”来表示,比如“int...”表示整型的可变参数,而“double...”表示双精度型的可变参数。于是采用了可变参数的setAlarm方法便改写成下面这样:

	// 参数类型后面添加三个点号“...”,表示这里的参数数量并不固定,可以有一个、两个,也可以有三个,也可以没有参数。
// 故而此时的输入参数被称为可变参数,意思是参数的数量允许变化,“...”可以看作是方法参数的省略号。
private static void setAlarm(int... addedNumber) {
Date date = new Date();
int hour = date.getHours();
int minute = date.getMinutes();
int second = date.getSeconds();
// 可变参数的数量也是通过“.length”获得
if (addedNumber.length > 0) {
// 获取指定位置的可变参数,依然通过下标“[数字]”实现,就像是访问数组元素一般
hour += addedNumber[0];
}
if (addedNumber.length > 1) {
minute += addedNumber[1];
}
if (addedNumber.length > 2) {
second += addedNumber[2];
}
System.out.println("可变参数设定的闹钟时间是"+hour+"时"+minute+"分"+second+"秒");
}

外部调用带可变参数的方法之时,既允许不输入任何参数,也允许输入多个参数。以下即为拥有可变参数的setAlarm方法的调用代码例子:

		setAlarm();
setAlarm(1, -10, 3);

注意,如果已经存在同名且参数个数确定的方法,则编译器优先调用参数个数确定的方法。只有不存在参数个数确定的同名方法,编译器才会调用定义了可变参数的方法。
输入参数的类型还可以是数组,例如整型数组的参数定义格式为“int[] 参数名称”,这样方法内部就能将该参数当作数组一样来操作。使用了数组参数的闹钟设置方法setAlarmByArray代码示例如下:

	// 编译器认为“int...”与“int[] ”类型相同,
// 所以不允许定义参数分别为“int...”和“int[] ”的同名方法
private static void setAlarmByArray(int[] addedNumber) {
Date date = new Date();
int hour = date.getHours();
int minute = date.getMinutes();
int second = date.getSeconds();
if (addedNumber.length > 0) {
hour += addedNumber[0];
}
if (addedNumber.length > 1) {
minute += addedNumber[1];
}
if (addedNumber.length > 2) {
second += addedNumber[2];
}
System.out.println("设定的闹钟时间是"+hour+"时"+minute+"分"+second+"秒");
}

可见该方法的内部代码竟然与采用可变参数的setAlarm代码是一样的,这缘于编译器把“int...”和“int[]”看作是同一种类型,既然是同一种类型,那么这两个办法就不能叫一样的名称,只能换别的名称才行。此外,二者被外部调用时也有差别,带可变参数的方法,调用时输入的参数列表以逗号分隔;而带数组参数的方法,它的输入参数必须是数组类型,就像下面的调用代码例子那样:

		// 下面setAlarmByArray方法的输入参数为数组类型
int[] addedArray = {1, -10, 3};
setAlarmByArray(addedArray);

至此终于把方法的几种输入参数变化讲完了,最后总结一下与输入参数有关的几个要点:
1、两个名称相同,但是参数个数与参数类型不同的方法,是通过方法重载机制区分开的。
2、输入参数在变量类型后面添加三点号“...”,表示这个输入参数是可变参数,调用时填写的参数数量可多可少。
3、可变参数与数组参数在方法内部的处理代码基本没有区别,但在外部调用时书写的参数形式是不一样的。

 

更多Java技术文章参见《Java开发笔记(序)章节目录

Java开发笔记(二十五)方法的输入参数的更多相关文章

  1. Java开发学习(二十五)----使用PostMan完成不同类型参数传递

    一.请求参数 请求路径设置好后,只要确保页面发送请求地址和后台Controller类中配置的路径一致,就可以接收到前端的请求,接收到请求后,如何接收页面传递的参数? 关于请求参数的传递与接收是和请求方 ...

  2. Java学习笔记二十五:Java面向对象的三大特性之多态

    Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...

  3. Java开发笔记(十五)短路逻辑运算的优势

    前面提到逻辑运算只能操作布尔变量,这其实是不严谨的,因为经过Java编程实现,会发现“&”.“|”.“^”这几个逻辑符号竟然可以对数字进行运算.譬如下面的代码就直接对数字分别开展了“与”.“或 ...

  4. python3.4学习笔记(二十五) Python 调用mysql redis实例代码

    python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...

  5. Java开发笔记(一百五十)C3P0连接池的用法

    JDBC既制定统一标准兼容了多种数据库,又利用预报告堵上了SQL注入漏洞,照理说已经很完善了,可是人算不如天算,它在性能方面不尽如人意.问题出在数据库连接的管理上,按照正常流程,每次操作完数据库,都要 ...

  6. Java开发笔记(九十五)NIO配套的文件工具Files

    NIO不但引进了高效的文件通道,而且新增了更加好用的文件工具家族,包括路径组工具Paths.路径工具Path.文件组工具Files.先看路径组工具Paths,该工具提供了静态方法get,输入某个文件的 ...

  7. Java开发笔记(一百五十一)Druid连接池的用法

    C3P0连接池自诞生以来在Java Web领域反响甚好,业已成为hibenate框架推荐的连接池.谁知人红是非多,C3P0在大型应用场合中暴露了越来越多的局限性,包括但不限于下列几点:1.C3P0管理 ...

  8. Java开发学习(二十二)----Spring事务属性、事务传播行为

    一.事务配置 上面这些属性都可以在@Transactional注解的参数上进行设置. readOnly:true只读事务,false读写事务,增删改要设为false,查询设为true. timeout ...

  9. Java开发学习(二十四)----SpringMVC设置请求映射路径

    一.环境准备 创建一个Web的Maven项目 参考Java开发学习(二十三)----SpringMVC入门案例.工作流程解析及设置bean加载控制中环境准备 pom.xml添加Spring依赖 < ...

  10. Java开发学习(二十六)----SpringMVC返回响应结果

    SpringMVC接收到请求和数据后,进行了一些处理,当然这个处理可以是转发给Service,Service层再调用Dao层完成的,不管怎样,处理完以后,都需要将结果告知给用户. 比如:根据用户ID查 ...

随机推荐

  1. 面试题5-[剑指offer] 二维数组中的查找

    题目 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...

  2. DevExpress XtraTabbedMdiManager删除Page

    DevExpress XtraTabbedMdiManager删除Page 时,xtraTabbedMdiManager1.Pages.Remove()是没用的. 正确的应该是xtraTabbedMd ...

  3. MVC是什么

    MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码 ...

  4. No Spring WebApplicationInitializer types detected on classpath 问题的一种解决办法

    今天在idea中编译部署工程,tomcat报了这个错误: No Spring WebApplicationInitializer types detected on classpath 导致前端页面访 ...

  5. [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型)

    [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模 ...

  6. 【RL-TCPnet网络教程】第12章 TCP传输控制协议基础知识

    第12章      TCP传输控制协议基础知识 本章节为大家讲解TCP(Transmission Control Protocol,传输控制协议),通过本章节的学习,需要大家对TCP有个基本的认识,方 ...

  7. [Swift]LeetCode136. 只出现一次的数字 | Single Number

    Given a non-empty array of integers, every element appears twice except for one. Find that single on ...

  8. [Swift]LeetCode583. 两个字符串的删除操作 | Delete Operation for Two Strings

    Given two words word1 and word2, find the minimum number of steps required to make word1 and word2 t ...

  9. python传入不确定个数参数

    Python3自带的一个函数为 zip ,使用方式如下: In: print zip([1, 2],[3, 4]) Out: [(1, 3), (2, 4)] In: print zip([1, 2] ...

  10. Python内置函数(19)——eval

    英文文档: eval(expression, globals=None, locals=None) The arguments are a string and optional globals an ...