关于值传递和引用传递,我更喜欢说传递的都是拷贝。
如果拷贝的这份东西就是一个值,那就是值,如果拷贝的东西指向的是一个对象,那就是引用传递。
具体这个引用的值会不会影响之前的值,那还要看这个对象是否是可变对象,如果遇到类似于String 这样的不可变对象,传递的即便是new出来的对象,但进去的值也不会对传递前的值产生任何影响。其他的引用传递,一般都会对之前的对象值产生影响。这个具体分析吧。楼主的情况,两个都不会对a产生影响。但可以将结果值再赋给a
b(a); // a 依然是1
a = c(a); // 将结果2 赋给a
如果拷贝的这份东西就是一个值,那就是值,如果拷贝的东西指向的是一个对象,那就是引用传递。
具体这个引用的值会不会影响之前的值,那还要看这个对象是否是可变对象,如果遇到类似于String 这样的不可变对象,传递的即便是new出来的对象,但进去的值也不会对传递前的值产生任何影响。其他的引用传递,一般都会对之前的对象值产生影响。这个具体分析吧。楼主的情况,两个都不会对a产生影响。但可以将结果值再赋给a
b(a); // a 依然是1
a = c(a); // 将结果2 赋给a
解决方案 »
- 看不懂啊,谁能帮我解释下!
- java项目
- 一段C# 的程序,请各位高手看下,把对应的java程序写下,谢谢了
- 请问有没有高手会开发手机客户端软件
- 哪位大仙用过myeclipse画过界面,教教菜鸟吧
- 谁能帮我完美这个程序?
- jbuilder 9新建一个项目报package ld.gui does not exist 错但这个ld.gui源程在程序中是有的。
- java里要用一些类,为何有些要new有些不要
- 关于private和static的不同的问题
- java网络编成问题,快来看!!!!(在线关注)
- 关于 java.lang.String 的 所谓的 实际上不是的 值传递
- 超多次递归,如何放大空间?
int 简单变量是值传递,Integer 包装类型(new Integer())理应算应用传递了吧,但基本类型的8个对应包装类型都是不可变对象,所以他们传递的还是值,所以依然不可能达到引用传递的效果。
再说,楼主的两个方法b() 和 c() 从功能实现上来说,除了方法名不同,实现完全相同,然后给相同的入参,得到不同的结果,这也是不可能的事情。
int 简单变量是值传递,Integer 包装类型(new Integer())理应算应用传递了吧,但基本类型的8个对应包装类型都是不可变对象,所以他们传递的还是值,所以依然不可能达到引用传递的效果。
再说,楼主的两个方法b() 和 c() 从功能实现上来说,除了方法名不同,实现完全相同,然后给相同的入参,得到不同的结果,这也是不可能的事情。
用vb版的b,c函数就是
function b(byval b1 as integer){
b=b1+1
}function c(byref c1 as integer){
c=c1+1
}用c++版实现就是
function b(int b1){
return b1+1
}function c(int &c1){
return c1+1
}换句话说就是函数c能改变a,函数b不能改变a,这就是传统的传值跟传引用的概念.
问题就是这两个函数用java来实现如何实现?函数b没问题,关键是函数c如何实现?关键就是在函数体内部通过参数来改变a的值.
如果这是真的java确实有点落伍了.
例如要设计一个函数.
返回值决定成功与否(经常用在if判断上),十分方便.
而你要取出来的东西.作为引用参数传入.
然后先判断返回成功,然后再处理引用的参数进行后续操作.虽然java的对象是引用,但是如果是基础数据就比较麻烦.
例如取出字符串长度.唯一可行的变向方法就是把返回值和要取的对象内容都封装到一个类里面.
这样又要在函数后加上一个属性去验证布尔结果或者select case.真的只能说不太科学啊.莫非是因为虚拟机问题,造成的没基础数据引用传递?
http://bbs.csdn.net/topics/390765824?page=1#post-397241922
换为一个可变对象StringBuffer 或 其他的,但是传递的入参就不是int型的了。
StringBuffer 的话,第一个方法,将传递进去的变量改变它指向的内存空间,这样不影响之前的值。
第二个方法,就直接对传递进去的变量操作,因为它指向之前的内存空间,会影响到之前的值。
按理说,包装类型new出来的对象是传递地址的,但基础类型的包装类型都是不可变对象
也就是对象一旦new出来,它的值就不会再改变了,再对它操作,相当于另外new 出新的地址空间了。
public class java {
public static void main(String[] args) {
Integer I = new Integer(7);
int i = 7;
MyInt mi = new MyInt(7);
add1(i);add1(I);add1(mi);
System.out.println(i);
System.out.println(I);
System.out.println(mi);
}
public static Integer add1(Integer i){
i = i+1; // 如果 Integer 有一个 setValue 方法的话
return i;
}
public static int add1(int i){
i=i+1;
return i;
} public static int add1(MyInt i){
i.add1(); // 封装
return i.toInt();
}
}
class MyInt{
private int i;
public MyInt(int i){
this.i = i;
}
public void add1(){
i = i + 1;
}
public String toString(){
return ""+i;
}
public int toInt(){
return i;
}
}
Java根本就废掉了指针,也不让你取地址,所以相应的也只允许你函数调用时传值,所以不可能实现你要的结果。
如果你需要这样做,要么就应该用类封装起来,直接传对象。
要么就应该将结果作为返回值,比如你上面的代码。应该这样写a=c(a)这是Java的语言规则,在Java没有做出修改之前你只能改变你的习惯,如果你觉得没有传引用就写不了代码了,那C和VB才适合你。
12楼确实实现了,用我说的对象是传引用的方法,但你注意到第6行没,你完全建立了个新对象,跟i一毛钱关系都没有.反过来说,即使用i建立的对象,也是个新东西了,不是i的引用.你只是变向实现了这个.这不是引用.
如果有同学想要了解真正的引用传递和值传递的区别,先去看看C++吧!
A: Here you are.
B: Thank you.
A: You are welcome.难道你一定要按照中文的习惯:
A: Give you.
B: Thank you.
A: No thanks.
package com.csdn.test20140530;public class ValuesTest {
public static int a=1;
public static int[] b={1};
public int b(int b1){
b1+=1;
return b1;
} public int c(int[] c1){
c1[0]+=1;
return c1[0];
}
public static void main(String[] args) {
ValuesTest valuesTest = new ValuesTest();
valuesTest.b(a);
valuesTest.c(b);
System.out.println(a);
System.out.println(b[0]);
}
}
这样出来的就是a = 1, b=2了。@vnvlyp 下面的话是他以前讲的很详细,你可以看我以前问你的问题,跟你的很相似。
地址:http://bbs.csdn.net/topics/390804208
在C中有指针类型,而且你可以通过&获取一个变量的地址,所以你可以把一个变量的地址作为参数传进函数,从而通过指针改变变量的值
比如上例中的f(&i),就是取i的地址,然后传递给void f(int * p)中的指针参数p,这样通过指针解引用*p=10你就可以改变原来那个变量的值。但是Java第一没有指针类型,第二不能轻易获取一个变量的地址,所以比如int b = 5; swap(b),你传进去的只是b变量的值,而不是b的地址,而由于没有指针类型,就算你得到了地址,你也无法通过地址改变变量的值。而Java中的引用类型,实际上是被弱化的指针类型,比如int[] a,那么a相当于C中的int *a,就是指向int的一个指针,既然是指针,那么你作为参数传递给函数,就可以达到修改原来变量的值的目的