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)如 ...
随机推荐
- js数组和对象相等判断、拷贝详解(结合几个现象讲解引用数据类型的趣事)
序言 最近遇到几个js引用数据类型造成的bug,今天结合bug详细分析一下,避免以后再犯,也希望能帮大家提个醒,强化js基本功. 目录 1.浅拷贝.深拷贝,解决变量赋值相互影响问题 2.判断2个数组. ...
- 小甲鱼Python3笔记
000-愉快的开始 入门容易,学习难,代码量少. 跨平台: Windows, Mac OS, Linux, UNIX. 应用领域: 操作系统 WEB 3D动画 企业应用 云计算等等. 001-我和Py ...
- web端本地与服务端时间校验
当前校验逻辑: 本地和服务端的时间校验绑定在一个通用请求上,这个请求每七分钟会到服务端请求一次,本地拿到服务器时间后,计算请求服务器来回的时间,最后得出与服务器时间的差值,然后每次new Date() ...
- Vue取消eslint语法限制
话不多说,先上图: 当然,这里的警告我是知道怎么回事,原来eslint是一个语法检查工具,但是限制很严格,在我的vue文件里面很多空格都会导致红线警告(可以屏蔽),虽然可以屏蔽,但是在编译的时候老是会 ...
- php 跨数据库调取数据
我的这个是thinkphp,我就在 Application -> Common -> Conf -> config.php 文件里面配置数据库的地方,加入了下面这段代码 //'数据库 ...
- 将本地jar包打包到本地仓库和上传到私服
1.本地jar打包到本地仓库 mvn install:install-file -Dfile=jar包完整地址或相对地址 -DgroupId=自定义的groupID -DartifactId=自定义的 ...
- .NET 应用架构电子书中文版
<.NET 微服务:容器化 .NET 应用架构指南> 本书主要介绍了基于容器和微服务的应用架构和设计原则,以及基于 .NET Core 和 Docker 容器的应用程序开发实践.为了让大家 ...
- HTTPS 原理浅析及其在 Android 中的使用
作者:曹丰斌 本文首先分析HTTP协议在安全性上的不足,进而阐述HTTPS实现安全通信的关键技术点和原理.然后通过抓包分析HTTPS协议的握手以及通信过程.最后总结一下自己在开发过程中遇到的HTT ...
- 解决idea导入项目后依赖报错问题
1.在idea首页 Confige-->setting-->build,execution,deployment-->buildTool-->maven-->work o ...
- JavaScript 异步编程的前世今生(下)
ES6 中的 Generator 在 ES6 出现之前,基本都是各式各样类似Promise的解决方案来处理异步操作的代码逻辑,但是 ES6 的Generator却给异步操作又提供了新的思路,马上就有人 ...