java如何实现引用传递,java如何实现引用传参类似CC的引用

1,java如何实现引用传参类似CC的引用java只有值传递,没有引用传递java中引用传参是针对对象的变量的,而基本数据类型不能创建对象,因此你用int类型定义的变量传过去的还是变量值!你回去好好看看java的对内存和栈内存的知识就明白了传值就是把某个数值、字符串或类对象复制一份,作为参数传址是把某个数值、字符串或类对象的地址作为参数,没有复制过程,所以当参数位类对象、或字符串时,效率比传值要高 。c++没有诞生前,传址是用指针实现的,但指针容易出错,所以bjarne们发明了引用,其实质还是指针 。我的理解,在这个问题上,c++和java没有区别 。JAVA的基本类型像int都是传值 , 不能传引用;其他的类型都是引用传递 , 想Integer一起自己定义的类型【java如何实现引用传递,java如何实现引用传参类似CC的引用】
2,java 值传递 引用传递值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容 , 是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值 。引用传递:(形式参数类型是引用数据类型参数):也称为传地址 。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址 , 在方法执行中 , 对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来 , 所以方法执行中形式参数的改变将会影响实际参数 。这是个关于栈内存和堆内存的问题List list = new ArrayList(); 这句执行完以后实际在栈内存中产生一个list变量,在堆内存中产生一个ArrayList的对象,list变量的值实际上是堆内存Arraylist的地址,Java中虽然没有指针的概念 , 这个叫引用 , 为了便于理解也可以想象成list指向ArrayList在程序执行了test2(list);之后,实际上在栈内存中又产生了一个新的变量,该变量是传入参数list的复制 , 这时候你可以理解成在栈内存中存在两个变量,一个是main方法中定义的list变量,一个是test2方法中定义的list变量的复制,两个变量都指向堆内存中存在的ArrayList对象 ,  然后在tese2()方法中你执行 list=null;实际上只是改变了在test2中生成的list变量复制的值,list变量的值实际上并没有发生改变,这样解释不知道对你有没有帮助,祝成功^_^你应该将list 设为一个函数内的全局变量,把List list = new ArrayList(); 这句放在main 前面 试试 。。。if(list == null) 中list != null体会一下!你不是在list3()时把list赋值成a了吗?那怎么会为null呢?因为java中没有指针,所以我们说java是值传递 。因为c中,地址传递是通过指针的方式来实现的 。
3,在JAVA中怎么可以使变量进行引用传递啊你这个程序写错了1.测试的拼音是ceshi,不是cheshi2.Cheshi2 c2=new Cheshi2(c1.num);然后res= new Integer(40); new Integer(40),res引用的是新的对象了,不再是原先那个c1.num所以c1.show(); 将显示20,因为在cheshi2方法里没有修改到那个数据-----------------把class Cheshi2 Cheshi2(Integer res) res= new Integer(40); } } 改成class Cheshi2 Cheshi2(Integer res) res= res*2; } }一般编程是在cheshi类中就应该写一个public void setNumO方法,通过调用这个方法来修改这个类里面的值不赞同上一位的说法 。Cheshi2 c2=new Cheshi2(c1.num); 在这里只是将20这个值传进去而不是将空间地址传过去 。并没有改变原有空间的数据在这里可以将类作为参数传进去,然后对num数据进行操作 , 通过打印res发现实际上打印了一个空间地址 , 引用应该传进去一个对象才可以public class Testpublic Test()} public static void main(String[] args)Cheshi c1 = new Cheshi();Cheshi2 c2 = new Cheshi2(c1);c1.show(); }}class CheshiCheshi()num = new Integer(20); } void show()System.out.println(num); } Integer num;}class Cheshi2Cheshi2(Cheshi res)res.num =res.num*2;System.out.println(res); }}class Cheshi2 Cheshi2(Cheshi cheshi)cheshi.num=new Integer(cheshi.num.intValue()*2); } }LZ是初学者吧,推荐本书 , 具体名字记不清了 , 叫《Effxxxxx Java》首先要说的是java里面没有指针这个概念了,java的一个目的就是减少程序员对内存的管理和指针的混乱,对于你的要求,java的实现只能是通过方法来代替你的指针需求也就是b()那个方法代替b private static int a = 1; public static void main(string[] args){ system.out.println(a); a = 2; system.out.println(a+" "+b()); } public static int b(){ return a; } 如果b涉及到赋值的话你可以再private static int b = 0; 然后b()那个方法返回的是 return a+b; 别再纠结这种c时代痛苦的东西了
4,java string怎么传引用传递你是C/C++或是VB转过来的吗?在Java中过多考虑引用(指针)和值之间的关系是步入歧途,这正是Java的设计者极力避免你考虑的问题 。你需要明白的是:1、Java中所有方法的参数的传递都是“值传递”;2、Java中所有对象类型的变量的“值”,本质上说 , 包含了Java堆中的实际对象的地址,你可以大体认为Java的变量对应了C/C++中的指针(其实这里面有更复杂的机制) 。事实上,Java并不像C/C++一样明确的区分“值语义”与“引用语义” , Java栈中也不会存放任何对象的实体(这点与C/C++不同,C/C++栈中可以存放对象实体),所有的Java对象都是在堆中 。概念上的区别在于,我这里提到的“变量”是指Java栈中的内容,对应你说的“引用”;我提到的“对象”是指Java堆中的实体,对应你说的“值” 。而一般Java教材中提到的“值传递”,是指这些“变量”的内容的传递,不是Java堆中的对象实体的传递 。你用字符串来做实验,并推广为所有Java对象的做法,并不是特别合适 。Java的String类型有特殊的处理:所有编译期认识的字符串,都会被放到常量池,于是下面的语句:a = "s";b = "s";a和b并不像其它对象一样有创建的动作 , 都是直接指向常量池中的"s" , 所以你可以得到a==b 。而下面的语句:a = new String("s");b = new String("s");是分别在Java堆中创建了2个对象 , 此时a!=b 。本质上说 , 对于基本数据类型(整数、字符等),Java的符号==,用于判断二者的值是否相等;对于对象类型,Java的符号==,用于判断两个变量是否是“同一个对象”,equals()方法才是用于判断两个对象是否相等 。你希望实现的swap逻辑,在Java中通常认为是无法实现的 。拿你这个例子来说,swapValue()中的tmpValue无论怎么更改,只是改变tmpValue自己的内容(即不断指向不同的对象),并不会改变value中的内容(始终指向同一个对象) 。这也是为什么Java最初说自己永远是值传递 。你只有改变tmpValue指向的对象的值(通过调用这个对象的方法或是更改它的属性),使用value访问时,才能看到这些改变 。为了弥补这个缺陷 , C#才加入了ref关键字,允许传入变量的引用(如果参考C/C++,C#传递的实际是二级指针,它的内容是栈中的变量的地址) 。java中不能对参数做出任何赋值操作,即=操作不行s=s.replace("j","i");想要改变参数s的物理地址 , 即改变实参这是不被允许的就好像如果参数类型是int,你对形参进行++或--以及=操作都是无效的,虽然不会报错这里应该修改一下public class strngbuffer_1public static void main(string args[])string a=new string("java");stringbuffer b=new stringbuffer("java");a=mb_method(a,b);system.out.println(a+b);}public static string mb_method(string s,stringbuffer t)t.append("c");return s.replace("j","i");//你不能对参数做出=操作,但是可以靠返回值将处理后的结果返回程序}} 这跟final什么的没关系,java里就是这样,你用你自己写的类也是一样的结果,我直接给你举例说明吧public class mainpublic static void main(string[] args)objectone o=new objectone(4,3);fun(o);system.out.println(o); } public static void fun(objectone n)objectone s=new objectone();n=s; }}class objectoneprivate int x = 0; private int y = 0; public objectone()this.x=0;this.y=0; } public objectone(int x,int y)this.x=x;this.y=y; } public string tostring()return x+" "+y; } }我们来看看这程序的输出结果:4 3结果是4 3 , 而不是0 0 , 这样你懂了吧 t=t.append("c");的这个操作并不是t=这里起作用了,而是t.append("c");这里起作用了,通过调用t的append()方法,修改了t的属性,而不是t=t.append("c")产生新对象后赋回实参地址了你可以自己在objectone中添加 public void setx(int x)this.x=x; }并在主函数中比较一下o=o.setx();和o.setx()有什么区别

    推荐阅读