Java开发笔记(二十六)方法的输出参数
前面介绍了方法的输入参数,与输入参数相对应的则为输出参数,输出参数也被称作方法的返回值,意思是经过方法的处理最终得到的运算数值。这个返回值可能是整型数,也可能是双精度数,也可能是数组等其它类型,甚至允许不返回任何参数。与输入参数类似,输出参数也需要定义数据类型,它的返回值类型在方法名称前面定义,具体位置参见方法的定义形式“访问权限类型 可选的static 返回值的数据类型 方法名称(参数类型 参数名称)”。
这里特别要注意,即使方法不返回任何输出参数,也需定义一个名叫void的返回值类型,而不像输入参数若没有则直接留空。方法内部倘若中途就要结束处理,那要在指定地点添加一行“return;”,表示代码执行到这里便退出方法。对于无需返回输出参数的方法,方法末尾既可添加“return;”,也可不添加“return;”,因为此时编译器会自动结束方法。
接下来以求数字的N次方根为例,演示看看如何实现一个返回值类型为void的printNsquareRoot方法。该方法的输入参数包括待求N次方根的数字,以及N次方根的整型数n,为了避免程序运行出错,必须在方法一开头就进行合法性判断,比如N次方根的n必须是自然数,而不能是0或负数;又比如进行开偶次方根运算时,底数不能为负数;一旦输入参数的合法性校验不通过,就应当跳过剩余代码直接结束方法。据此给出方法printNsquareRoot的示例代码:
// 不返回任何数据,也就是不存在输出参数,则返回值类型填void。
// printNsquareRoot的用途是打印指定数字的N次方根
private static void printNsquareRoot(double number, int n) {
if (n <= 0) {
System.out.println("n必须为自然数");
return; // 不带任何参数直接返回,return语句表示该方法的剩余代码都不予执行
} else if (n%2==0 && number<0) {
System.out.println("不能对负数开偶次方根");
return; // 不带任何参数直接返回,return语句表示该方法的剩余代码都不予执行
}
// 下面利用牛顿迭代法求数字的N次方根
double nsquareRoot = number;
for (int i=0; i<n*2; i++) {
nsquareRoot = (nsquareRoot*(n-1)+number/Math.pow(nsquareRoot, n-1))/n;
}
System.out.println(number+"的"+n+"次方根="+nsquareRoot);
//return; // 如果方法的返回值类型为void,则方法末尾的return语句可加可不加
}
因为printNsquareRoot方法不返回具体参数,所以外部可通过格式“方法名称(逗号隔开的参数列表)”调用该方法。下面便是外部调用printNsquareRoot方法的代码例子:
// 下面的printNsquareRoot方法打印指定数字的N次方根
printNsquareRoot(2, 2); // 求数字2的2次方根,即对2开平方
当然许多时候我们更希望求方根方法能够返回具体方根数值,那么就要将方法的返回值类型从void改为double,并且凡是需要结束方法处理的地方,都得使用语句“return 方根数值;”返回输出参数,并且方法末尾必须写明return语句。于是求方根方法便改成了如下的代码:
// 只返回一个数值,则返回值类型填该数值的变量类型。
// getNsquareRoot的用途是计算并返回指定数字的N次方根
private static double getNsquareRoot(double number, int n) {
if (n <= 0) {
System.out.println("n必须为自然数");
return 0; // 输入参数非法,则默认返回0
} else if (n%2==0 && number<0) {
System.out.println("不能对负数开偶次方根");
return 0; // 输入参数非法,则默认返回0
}
// 下面利用牛顿迭代法求数字的N次方根
double nsquareRoot = number;
for (int i=0; i<n*2; i++) {
nsquareRoot = (nsquareRoot*(n-1)+number/Math.pow(nsquareRoot, n-1))/n;
}
return nsquareRoot; // return后面跟着要返回的变量名称,该变量的类型与返回值类型保持一致
}
既然改写后的getNsquareRoot方法存在输出参数,那么外部调用该方法时,应当定义一个变量用来接收方法的返回值,就像下面代码示范的这样:
// 下面的getNsquareRoot方法返回指定数字的N次方根
double number1 = 3;
int n1 = 2;
double nsquareRoot = getNsquareRoot(number1, n1);
System.out.println(number1+"的"+n1+"次方根="+nsquareRoot);
运行上面的方法调用代码,程序的日志输出结果如下所示:
3.0的2次方根=1.7320508100147274
从日志发现,getNsquareRoot方法在计算数字的偶次方根时,只会返回正值方根。这其实是不严谨的,比如3和-3都是9的平方根,然而getNsquareRoot方法只返回3,却把-3给漏掉了。因此需要对该方法加以完善,可考虑将返回值类型改为数组,这样偶次方根的正值和负值都能通过数组返回。于是重新定义一个getNsquareRootArray方法,同时新方法的返回值类型为double[],并修改相关的return语句,把返回的输出参数统统改为数组类型。经过数组改造后的getNsquareRootArray方法代码如下所示:
// 需要返回多个数值(包括0个、1个、2个以及更多),则返回值类型可以填这些数值的数组类型。
// getNsquareRootArray的用途是计算并返回指定数字的N次方根数组(比如2和-2都是4的平方根)
private static double[] getNsquareRootArray(double number, int n) {
if (n <= 0) {
System.out.println("n必须为自然数");
return new double[]{}; // 输入参数非法,则默认返回一个空的双精度数组
} else if (n%2==0 && number<0) {
System.out.println("不能对负数开偶次方根");
return new double[]{}; // 输入参数非法,则默认返回一个空的双精度数组
}
// 下面利用牛顿迭代法求数字的N次方根
double nsquareRoot = number;
for (int i=0; i<n*2; i++) {
nsquareRoot = (nsquareRoot*(n-1)+number/Math.pow(nsquareRoot, n-1))/n;
}
double[] rootArray;
if (n%2 == 0) { // 求偶次方根,则方根有正值和负值两个数值
rootArray = new double[]{nsquareRoot, -nsquareRoot};
} else { // 求奇次方根,则方根只会有一个数值
rootArray = new double[]{nsquareRoot};
}
return rootArray; // return后面跟着rootArray,其变量类型与返回值类型一样都是双精度数组
}
外部调用getNsquareRootArray方法的时候,需要声明一个双精度数组变量,并将方法的输出参数赋值给该变量。下面是外部调用getNsquareRootArray方法的代码例子:
// 下面的getNsquareRootArray方法返回指定数字的N次方根数组
double number2 = 3;
int n2 = 2;
double[] rootArray = getNsquareRootArray(number2, n2);
for (double root : rootArray) {
System.out.println(number2+"的"+n2+"次方根="+root);
}
运行上述测试代码,日志打印结果如下所示:
3.0的2次方根=1.7320508100147274
3.0的2次方根=-1.7320508100147274
可见最新的getNsquareRootArray方法,在计算数字的偶次方根之时,正确返回了两个正负方根。
更多Java技术文章参见《Java开发笔记(序)章节目录》
Java开发笔记(二十六)方法的输出参数的更多相关文章
- Java开发学习(二十六)----SpringMVC返回响应结果
SpringMVC接收到请求和数据后,进行了一些处理,当然这个处理可以是转发给Service,Service层再调用Dao层完成的,不管怎样,处理完以后,都需要将结果告知给用户. 比如:根据用户ID查 ...
- Java开发笔记(十六)非此即彼的条件分支
前面花了大量篇幅介绍布尔类型及相应的关系运算和逻辑运算,那可不仅仅是为了求真值或假值,更是为了通过布尔值控制流程的走向.在现实生活中,常常需要在岔路口抉择走去何方,往南还是往北,向东还是向西?在Jav ...
- Java学习笔记二十六:Java多态中的引用类型转换
Java多态中的引用类型转换 引用类型转换: 1.向上类型转换(隐式/自动类型转换),是小类型到大类型的转换: 2.向下类型转换(强制类型转换),是大类型到小类型的转换: 3.instanceof运算 ...
- python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码
python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ...
- Java开发笔记(九十六)线程的基本用法
每启动一个程序,操作系统的内存中通常会驻留该程序的一个进程,进程包含了程序的完整代码逻辑.一旦程序退出,进程也就随之结束:反之,一旦强行结束进程,程序也会跟着退出.普通的程序代码是从上往下执行的,遇到 ...
- Java开发学习(三十六)----SpringBoot三种配置文件解析
一. 配置文件格式 我们现在启动服务器默认的端口号是 8080,访问路径可以书写为 http://localhost:8080/books/1 在线上环境我们还是希望将端口号改为 80,这样在访问的时 ...
- Java开发学习(二十二)----Spring事务属性、事务传播行为
一.事务配置 上面这些属性都可以在@Transactional注解的参数上进行设置. readOnly:true只读事务,false读写事务,增删改要设为false,查询设为true. timeout ...
- Java开发学习(二十四)----SpringMVC设置请求映射路径
一.环境准备 创建一个Web的Maven项目 参考Java开发学习(二十三)----SpringMVC入门案例.工作流程解析及设置bean加载控制中环境准备 pom.xml添加Spring依赖 < ...
- Java开发学习(二十五)----使用PostMan完成不同类型参数传递
一.请求参数 请求路径设置好后,只要确保页面发送请求地址和后台Controller类中配置的路径一致,就可以接收到前端的请求,接收到请求后,如何接收页面传递的参数? 关于请求参数的传递与接收是和请求方 ...
- Java开发学习(二十八)----拦截器(Interceptor)详细解析
一.拦截器概念 讲解拦截器的概念之前,我们先看一张图: (1)浏览器发送一个请求会先到Tomcat的web服务器 (2)Tomcat服务器接收到请求以后,会去判断请求的是静态资源还是动态资源 (3)如 ...
随机推荐
- Hadoop集群搭建-full完全分布式(三)
环境:Hadoop-2.8.5 .centos7.jdk1.8 一.步骤 1).4台centos虚拟机 2). 将hadoop配置修改为完全分布式 3). 启动完全分布式集群 4). 在完全分布式集群 ...
- java枚举使用 总结
补充几点: 1.枚举对象是可以用 == 比较. 2. TestEnum3反编译结果: F:\tree\Test\src\test>javap TestEnum3* Compiled from & ...
- python从入门到实践-9章类
#!/user/bin/env python# -*- coding:utf-8 -*- # 类名采用的是驼峰命名法,即将类名中每个单词的首字母大写,而不使用下划线.# 对于每个类,都应紧跟在类定义后 ...
- Data Center手册(3): Load Balancer
Load Balancer的类型 DNS Round-Robin 这是一种很常见的分流的方式,具体配置如下: name server有一个zone文件,对于同一个domain,有多个IP www.ex ...
- 利用redis + lua解决抢红包高并发的问题
抢红包的需求分析 抢红包的场景有点像秒杀,但是要比秒杀简单点.因为秒杀通常要和库存相关.而抢红包则可以允许有些红包没有被抢到,因为发红包的人不会有损失,没抢完的钱再退回给发红包的人即可.另外像小米这样 ...
- 一步一步用Canvas写一个贪吃蛇
之前在慕课网看了几集Canvas的视频,一直想着写点东西练练手.感觉贪吃蛇算是比较简单的了,当年大学的时候还写过C语言字符版的,没想到还是遇到了很多问题. 最终效果如下(图太大的话 时间太长 录制gi ...
- IO复用(较详细)
进程与线程的描述 一个进程至少会创建一个线程,多个线程共享一个程序进程的内存.程序的运行最终是靠线程来完成操作的.线程的数量跟CPU核数有关,一个核最多能发出两个线程.线程的操作主要分为:一:给CPU ...
- Hive篇--搭建Hive集群
一.前述 Hive中搭建分为三中方式 a)内嵌Derby方式 b)Local方式 c)Remote方式 三种方式归根到底就是元数据的存储位置不一样. 二.具体实现 a)内嵌Derby方式 使用derb ...
- 6.jQuery(实例)
1.开关灯效果 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- JavaDBF:保存行情实时数据到DBF文件
JavaDBF.jar其实很早都不再更新了,在日新月异的科技圈算得上远古上神的jar包,早该身归混沌了. 但我们的项目要用到,因为之前做的大宗期货交易行情的分析文件依然是dbf文件,没有办法,还得用 ...