记下自己一直比较模糊的东西(1)
来源:互联网 发布:org.apache.tools下载 编辑:程序博客网 时间:2024/05/17 03:06
返回值问题
,如果返回值类型不是void时,需要保证有值返回,例如下面的方法就有语法错误:
例如如下代码:
/**
* 参数传递代码示例
*/
public class TransferValueDemo {
public static void main(String[] args) {
int m = 10;
int[] a = {1,2,34};
test(m,a);
System.out.println(m);
System.out.println(a[0]);
}
public static void test(int n,int[] t){
n = 0;
t[0] = 123;
}
}
则执行该程序以后,程序的输出结果是:10 123。则在调用test方法时,同样都是传入参数,为什么变量m的值未改变,而a[0]的值发生了改变呢?下面就来说明该问题。
在参数传递时,一般存在两种参数传递的规则,在Java语言中也是这样,这两种方式依次是:
l 按值传递(by value)
按值传递指每次传递参数时,把参数的原始数值拷贝一份新的,把新拷贝出来的数值传递到方法内部,在方法内部修改时,则修改的时拷贝出来的值,而原始的值不发生改变。
说明:使用该方式传递的参数,参数原始的值不发生改变。
l 按址传递(by address)
按址传递指每次传递参数时,把参数在内存中的存储地址传递到方法内部,在方法内部通过存储地址改变对应存储区域的内容。由于在内存中固定地址的值只有一个,所以当方法内部修改了参数的值以后,参数原始的值发生改变。
说明:使用该方式传递的参数,在方法内部修改参数的值时,参数原始的值也发生改变。
在Java语言中,对于那些数据类型是按值传递,那些数据类型是按址传递都作出了硬性规定,如下所示:
l 按值传递的数据类型:八种基本数据类型和String
l 按址传递的数据类型:除String以外的所有复合数据类型,包括数组、类和接口
按照这里的语法规则,则上面的代码中变量m的类型是int,属于按值传递,所以在方法内部修改参数的值时m的值不发生改变,而a的类型是数组,属于按址传递,所以在方法内部修改参数的值时,原始的值发生了改变。
按值传递和按址传递在实际使用时,需要小心,特别是在方法内部需要修改参数的值时。有些时候,对于按值传递的参数需要修改参数的值,或者按址传递时,不想修改参数的值,下面是实现这两种方式时的示例代码。
按值传递时通过返回值修改参数的值:
/**
* 按值传递的类型通过返回值修改参数的值
*/
public class TransferValueDemo1 {
public static void main(String[] args) {
int m = 10;
m = test1(m); //手动赋值
System.out.println(m);
}
public static int test1(int n){
n = 15;
return n;
}
}
在该示例代码中,通过把修改以后的参数n的值返回,来为变量m赋值,强制修改按值传递参数的值,从而达到修正参数值的目的。
按址传递时通过重新生成变量避免修改参数的值:
/**
* 按址传递时通过重新生成变量避免修改参数的值
*/
public class TransferValueDemo2 {
public static void main(String[] args) {
int[] a = {1,2,3};
test2(a);
System.out.println(a[0]);
}
public static void test2(int[] m){
int[] n = new int[m.length];
for(int i = 0;i < m.length;i++){
n[i] = m[i];
}
n[0] = 10;
}
}
在该示例代码中,通过在方法内部创新创建一个数组,并且把传入数组中每个参数的值都赋值给新创建的数组,从而实现复制数组内容,然后再修改复制后数组中的值时,原来的参数内容就不发生改变了。
这里系统介绍了Java语言中参数传递的规则,深刻理解这些规则将可以更加灵活的进行程序设计。例如使用复合数据类型按址传递的特性可以很方便的实现多参数的返回,代码示例如下:
public int test3(int[] m,int[] n){……}
则该方法中,实际上返回了三种值,一个int的返回值,数组m的值,数组n的值,这只是参数传递的一种基本使用,在JDK提供的API文档中也大量的存在该方法。
- 记下自己一直比较模糊的东西(1)
- 记下自己一直比较模糊的东西(2)
- 记下自己的欠款
- 周末复习html,最基础的知识,记下自己不太记得的东西
- 还是自己写的东西比较放心
- 记录一些对mfc理解以前比较模糊的东西
- 该是记下点东西的时候!
- 关于svm的自己一直比较困惑的点
- C++堆和栈详细介绍-自己一直模糊与易错的地方..
- 想想还是用自己的博客写东西比较好
- 记下一个比较特殊的布局用法
- 记下两个比较有用的地址
- 记下一些东西。。。
- 好东西,记下来
- 今天开始,记下自己走过的路
- 记下 自己学习 tinyxml 的事情
- 记下自己java面试的经历(转)
- 自己的坑 要记下来
- firebug console API
- 用Draw2D绘制UML图(译)
- CPropertyPage如何检测数据有效性并返回
- 常用正则表达式
- 使用FB41进行PID调整的说明
- 记下自己一直比较模糊的东西(1)
- 字符串匹配算法
- Linux 2.6下SPI设备模型--------基于AT91RM9200分析
- JavaScript 判断日期是否正确
- 一道面试题:举例说明[存储过程],[视图]和[自定义函数]的应用场合
- 团队
- javaScript中URL编码转换
- (转载)从番茄花园事件,到国产知识产权说开去
- 泛型DAO在JPA中的应用