两段代码,思路大体是一样的但是输出结果却不同:第一段:
public class DHCC extends Another{ public static void diandao(int[] a)
{
int l = a.length;
int half = l/2;
int tmp;
for(int i=0;i<half;i++)
{
tmp = a[i];
a[i] = a[l-i-1];
a[l-i-1] = tmp;
}
}
public static void main(String[] args) {
int [] a = {1,2,3,4,5,6,7,8,9};
diandao(a);
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
}
}这段代码是将一个为{1,2,3,4,5,6,7,8,9}的数组传入diandao()函数中进行倒序排列,运行以后的输出结果是9 8 7 6 5 4 3 2 1 实现了倒序;第二段代码:public class Another{
public static void diandao(String str){
str = "kkkk";
}
public static void main(String[] args){
String str = "lllll";
changeString(str);
System.out.println(str);
}
}这段代码将一个为"lllll"的字符串传入diandao()中,输出应该是"kkkk"吧,为什么还是 "lllll" 呢?我都对这参数传递方式有点迷糊了,哪位能帮我解释一下,多谢了哦
public class DHCC extends Another{ public static void diandao(int[] a)
{
int l = a.length;
int half = l/2;
int tmp;
for(int i=0;i<half;i++)
{
tmp = a[i];
a[i] = a[l-i-1];
a[l-i-1] = tmp;
}
}
public static void main(String[] args) {
int [] a = {1,2,3,4,5,6,7,8,9};
diandao(a);
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
}
}这段代码是将一个为{1,2,3,4,5,6,7,8,9}的数组传入diandao()函数中进行倒序排列,运行以后的输出结果是9 8 7 6 5 4 3 2 1 实现了倒序;第二段代码:public class Another{
public static void diandao(String str){
str = "kkkk";
}
public static void main(String[] args){
String str = "lllll";
changeString(str);
System.out.println(str);
}
}这段代码将一个为"lllll"的字符串传入diandao()中,输出应该是"kkkk"吧,为什么还是 "lllll" 呢?我都对这参数传递方式有点迷糊了,哪位能帮我解释一下,多谢了哦
public class Another{
public static void diandao(String str){
str = "kkkk";
}
public static void main(String[] args){
String str = "lllll";
changeString(str); /* 这是什么函数?写错了吧*/
System.out.println(str);
}
}那叫引用传参和值传参。
第一个程序,传递的是个数组,属于引用传参。就是会把内存地址传过去。。在diandao函数里对数组做的任何修改,都会保存下来下一个程序,传递的是个String,(PS:虽然String是对象。。但它比较特殊),只是把String里的值传了过去。。在diandao函数里对它的赋值等,只在diandao函数里有效,因为它没有真正的改变String里的值出了这个函数体。。diandao里对它的修改不会影响到外面
所以只会输出lll不输出kkk
11111逆序的结果是什么呢?呵呵
这段代码将一个为"lllll"的字符串传入diandao()中,输出应该是"lllll" 是引用传递,不是值传递
为什么? 传的参数是对象类型或是数据,那一定是 引用传递
说说下概念:
值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值
引用传递:也称地址传递,方法调用时,实际参数的引用(地址,而不是参数值)被传递给方法中的形式参数,在方法执行
中对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数的值的改变将会影响实际参数的值。
基本类型:包括了int ,String ,long 等等, 这类通俗易懂的说,是按值传递的吧.大致就是这样, 如果还想多了解一些,可以多看看教程,和多做题,
值传参 是将copy一份,是两个不同。
引用: 是将地址传过去, 是同一个。
刚查下了下。。呵呵,“在JAVA中只有值传递,没有引用传递这个概念”,这句话是对滴。。当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 是值传递。Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的以上仅供参考
如果在方法里把一个int[] arr改变了 arr = new int[]{1,2,3};
对方法外也完全没有影响。只有在arr[i] = N;的情况下才有影响。 对于对象,只有通过调用对象本身的方法才有影响。
看了这个帖子, 感觉很可怕, 其实很简单的, 大家写几个测试程序跑一下就知道了。
有人居然还拿String是final类型来说事。
String的值是不可变的,StringBuffer却是可以通过append方法改变值。
对于String来说,它是基本类型,引用和原型指向不同的内存,所以改变引用并不改变原始的String的值,但StringBuffer可以
http://topic.csdn.net/u/20081109/16/b37da4ce-61c3-4a51-a90a-3f34b60a9510.html
Java code
public class Another{
public static void diandao(String str){
str = "kkkk";
}
public static void main(String[] args){
String str = "lllll";
changeString(str); /* 这是什么函数?写错了吧,应是diandao(str)*/
System.out.println(str);
}
}
[/Quote]
public static String diandao(String str){
str = "kkkk";
return str;
}
public static void main(String[] args){
String str = "lllll";
System.out.println(diandao(str));
}
}[[/code]
这是我改的,你看看这改后与之前的区别吧,也许会有帮助的。
public static String diandao(String str){
str = "kkkk";
return str;
}
public static void main(String[] args){
String str = "lllll";
System.out.println(diandao(str));
}
}
这是我改的,你看看这改后与之前的区别吧,也许会有帮助的。
String str = "lllll"; str对象是存在在栈里面的,同是在在旁边开辟一个内存空间来存str的引用
在java传递的过程中,只有意义上的传引用,其实是值得传递
除非你有兴趣开发一个不遵从java虚拟机规范的jvm
我们可以不考虑函数调用, 只考虑一个函数内部的逻辑, ok?比如
void foo() {
SomeObject obj = new SomeObject();
SomeObject obj2 = obj; // 分支1:你们说这时候obj的引用变了么?内部某属性变了么?
obj2.setSomeValue(...); // 分支2:你们说这时候obj的引用变化了么?
obj2 = new SomeObject();
}单纯上面的例子, 很明显obj2重新new的时候, 并不影响obj本身。 如果你把obj2理解成一个函数的参数, 就很直观了。实际上函数的参数就是这样的一个obj2 --> void foo2(SomeObject obj) {
//注意这里参数的名字很迷惑人,如果把obj换成obj2是不是好懂点?
}