Java方法返回值详解
每个方法都是为了完成某个特定的功能,例如:登录功能、求和功能等,既然是功能,那么当这个功能完成之后,大多数情况下都会有一个结果的,比如,登录成功了或者失败了(true/false),求和之后最后的结果是100或者200,当然也有极少数的情况下是没有结果的。这个结果本质上就是一个数据,那么既然是一个数据,就一定会有对应的类型,所以在方法定义的时候需要指定该方法的返回值类型。
java语言中方法的返回值类型可以是任何一种数据类型,包括基本数据类型,也包括引用数据类型,例如:byte,short,int,long,float,double,boolean,char,String,Student(自定义类)等。当然,如果这个方法在执行完之后不需要返回任何数据,返回值类型必须写void关键字,不能空着不写。
关于方法的返回值在使用的时候有哪些注意事项呢,我们来看几段代码:
public static int method1(){
}
以上程序在编译的时候,报错了,错误信息是“缺少返回语句”,为什么呢?这是因为该方法在声明的时候指定了方法结束之后返回int类型的数据,但是以上方法体中并没有编写“返回数据”的代码。也就是说当一个方法在声明的时候返回值类型不是void的情况下,要求方法体中必须有负责“返回数据”的语句。这样的语句怎么写呢?答案是:“return 数据;”(大家还记得第六章节控制语句中的返回语句吗?这个就是),并且要求这个“数据”的类型要和声明的返回值类型一致,要不然编译器就会报错了。代码这样写就没问题了:
public static int method1(){
/*
return 1;
return 0;
return 100;
*/
int a = 100;
int b = 200;
return a + b;
}
如果代码这样写呢?
public static int method1(){
return 1;
System.out.println("hello world!");
}
编译以上程序,我们可以看到编译器报错了,提示的错误信息是:“System.out.println("hello world!");”这行代码是无法访问的语句。这是为什么呢?因为在方法中如果一旦执行了带有“return”关键字的语句,此方法就会结束,所以以上的程序中“System.out.println("hello world!");”这行代码是永远无法执行到的,所以编译报错了。得到的结论是:带有return关键字的语句只要执行,所在的方法则执行结束。
那这样写呢?
public static int method1(){
boolean flag = true;
if(flag){
return 1;
}
}
还是编译报错,错误信息是“缺少返回语句”,为什么呢?实际上方法在声明的时候指定了返回值类型为int类型,java语法则要求方法必须能够“百分百的保证”在结束的时候返回int类型的数据,以上程序“return 1;”出现在if语句的分支当中,对于编译器来说,它只知道“return 1;”有可能执行,也有可能不执行,所以java编译器报错了,不允许程序员这样编写代码。来看以下代码:
public static int method1(){
boolean flag = true;
if(flag){
return 1;
}else{
return 0;
}
}
这样就能编译通过了,为什么呢?这是因为编译器能够检测出以上的if..else..语句必然会有一个分支执行,这样就不缺少返回语句了。其实以上代码也可以这样写:
public static int method1(){
boolean flag = true;
if(flag){
return 1;
}
return 0;
}
以上代码也可以达到同样的效果,因为“return 1;”如果不执行,则一定会执行“return 0;”,当然,如果执行了“return 1;”则方法一定会结束,“return 0;”也就没有执行的机会了。再看下面的代码:
public static int method1(){
boolean flag = true;
if(flag){
return 1;
System.out.println("第1行");
}
System.out.println("第2行");
return 0;
System.out.println("第3行");
}
以上程序还是编译报错,哪里出错了,为什么呢?其中“第1行”和“第3行”代码没有执行机会,编译报错,但“第2行”是有执行机会的。通过以上程序我们可以得出这样的结论:在同一个“域”中,“return”语句后面是不能写任何代码的,因为它无法执行到。
如果只是单纯的完成以上代码的功能我们也可以这样写:
public static int method1(){
boolean flag = true;
return flag ? 1 : 0;
}
所以,一个功能的实现,代码可以写很多种不同的方式,慢慢培养吧同学们,这需要一个过程,千万戒骄戒躁。我们接着看关于返回值还有哪些注意事项:
public static void method2(){
return 10;
}
以上代码编译报错,为什么呢?这是因为一个方法在声明的时候返回值类型定义为void,这就表示该方法执行结束的时候不能返回任何数据,而以上程序中编写了“return 10;”这样的代码,自然编译器会报错的。也就是说前后说法要一致,声明的时候有返回值,那么代码编写的时候就必须有“return 值;”这样的语句。如果声明的时候没有返回值,那么方法结束的时候就不能编写“return 值;”这样的语句。那么,大家再来看看以下的代码:
public static void method2(){
return;
}
经过测试,以上的代码编译通过了,也就是说当一个方法的返回值类型是void的时候,方法体当中允许出现“return;”语句(注意:不允许出现“return 值;”),这个语法的作用主要是用来终止方法的执行。当一个方法的返回值类型是void的时候,在方法执行过程中,如果满足了某个条件,则这个方法可能就没必要往下继续执行了,想终止这个方法的执行,此时执行“return;”就行了。有一些同学在最初的学习过程中,对break和return认识的不够清晰,我们来研究一下,请看以下代码:
public static void main(String[] args) {
for(int i = 1; i <= 10; i++){
if(i == 5){
break;
}
System.out.println("i = " + i);
}
System.out.println("hello world!");
}
运行结果如下图所示:
图7-4:break测试
public static void main(String[] args) {
for(int i = 1; i <= 10; i++){
if(i == 5){
return;
}
System.out.println("i = " + i);
}
System.out.println("hello world!");
}
运行结果如下图所示:
图7-5:return测试
通过以上的测试,我们可以得出break和return根本不是一个级别的,break用来终止循环,return用来终止一个方法的执行。接下来再看一段代码:
public static int method3(){
return;
}
经过测试,以上代码编译报错,错误信息是:缺少返回值,为什么呢?这是因为方法在声明的时候规定了返回int类型的值,但是在方法体当中执行了“return;”语句,并没有返回具体的值,所以“return;”只能出现在返回值类型是void的方法中。
接下来我们来看看,当一个方法执行结束之后怎么接收这个返回值呢?请看下面代码:
public static void main(String[] args) {
//可以编译也可以正常运行
sumInt(10 , 20);
int retValue = sumInt(100 , 200);
System.out.println("计算结果 = " + retValue);
//编译报错,返回值类型是int,不能采用byte接收
//byte retValue2 = sumInt(1 , 2);
}
public static int sumInt(int a , int b){
return a + b;
}
运行结果如下图所示:
图7-6:测试怎么接收返回值
通过以上的测试我们得知,方法执行结束之后的返回值我们可以接收,也可以不接收,不是必须的,但大多数情况下方法的返回值还是需要接收的,要不然就没有意义了,另外方法的返回值在接收的时候采用变量的方式接收,要求这个变量的数据类型和返回值类型一致(当然,也可以遵守自动类型转换规则)。