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)如 ...
随机推荐
- Java语法细节 - 内存和枚举
目录 Java申请DirectBuffer ByteBuffer的position,limit,capacity,flip操作之间的关系 枚举实现单例模式 Java申请DirectBuffer /*- ...
- cadence电路板布线
设置完约束规则后,便可以开始电路板的布线工作.
- 性能测试学习 第九课--LR12中controller基础知识
1.设计手工场景,理解集合点的策略 2.添加load generator 一.controller基础知识 1.controller的原理 通过场景设计来模拟用户的真实操作并调用vugen中的脚本,然 ...
- go 语言的序列化与反序列化
与c 语言一样, 在网络编程中, go语言同样需要进行序列化与反序列化 在c语言中, 通常需要一块内存缓冲区用来收 发数据.缓冲区一般定义成char *buff类型. 当需要发送 数据时, 直接使用m ...
- CoreProfiler升级到.NetStandard 2.0
致所有感兴趣的朋友: CoreProfiler和相应的Sample项目cross-app-profiling-demo都已经升级到.NetStandrard 2.0和.NetCore 2.0. 有任何 ...
- CS20SI-tensorflow for research笔记: Lecture3
本文整理自知乎专栏深度炼丹,转载请征求原作者同意. 本文的全部代码都在原作者GitHub仓库github CS20SI是Stanford大学开设的基于Tensorflow的深度学习研究课程. Tens ...
- [Swift]LeetCode57. 插入区间 | Insert Interval
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...
- [Swift]LeetCode456. 132模式 | 132 Pattern
Given a sequence of n integers a1, a2, ..., an, a 132 pattern is a subsequence ai, aj, ak such that ...
- [Swift]LeetCode524. 通过删除字母匹配到字典里最长单词 | Longest Word in Dictionary through Deleting
Given a string and a string dictionary, find the longest string in the dictionary that can be formed ...
- 阿里云rds数据库迁移实战(多数据源)
由于某几个业务表数据量太大,数据由业务写,数据部门读. 写压力不大,读却很容易导致长时间等待问题(读由单独系统进行读),导致连接被占用,从而容易并发稍稍增长导致全库卡死! 于是,就拆库呗. 业务系统拆 ...