- 浏览: 45704 次
- 性别:
- 来自: 南京
文章分类
最新评论
class Demo{ private static int num= 2; public static void changePri(int a){ a = 10; } public static int changeObj(Demo demo){ demo.num = 5; return demo.num; } public static void main(String[] args) { int a = 12; changePri(a); System.out.println(a);//12 Demo demo = new Demo(); changeObj(demo); System.out.println(demo.num);//5 } }
这段代码的主要部分调用了两个很相近的方法,changeObj()和changePri()。唯一不同的是它们一个把对象作为输入参数,另一个把Java中的基本类型int作为输入参数。并且在这两个函数体内部都对输入的参数进行了改动。
java中的八大基本数据类型:int long float double short byte char boolean
看似一样的方法,程序输出的结果却不太一样。changeObj()方法真正的把输入的参数改变了,而changePri()方法对输入的参数没有任何的改变。
从这个例子知道Java对对象和基本的数据类型的处理是不一样的。和C语言一样,当把Java的基本数据类型(如int,char,double等)作为入口参数传给函数体的时候,传入的参数在函数体内部变成了局部变量,这个局部变量是输入参数的一个拷贝,所有的函数体内部的操作都是针对这个拷贝的操作,函数执行结束后,这个局部变量也就完成了它的使命,它影响不到作为输入参数的变量。
这种方式的参数传递被称为"值传递"。而在Java中用对象的作为入口参数的传递则缺省为"引用传递",也就是说仅仅传递了对象的一个"引用",这个"引用"的概念同C语言中的指针引用是一样的。当函数体内部对输入变量改变时,实质上就是在对这个对象的直接操作。
class MyDemo { public static void operate(StringBuffer x, StringBuffer y) { x.append(y); y = x; System.out.println(x + "," + y); } public static void main(String[] args) { StringBuffer a = new StringBuffer("A"); StringBuffer b = new StringBuffer("B"); operate(a, b); System.out.println(a + "," + b); } } 结果: AB,AB AB,B
解释: 很明显你这里传递的是地址(引用)传递2个StringBuffer 对象! 注意啦: x 会指向 a 所指向的内存(可以理解为都指向A),y 会指向 b 所指向的内存,(可以理解为都指向B) x.append(y); //这句话把 y 指向的值追加给x指向的值,这个时候x 和a 指向的内存都是AB,y指向的内存仍然是B y=x;//这句话就是把 x 的值 附值给 y, 附的是地址! 这样 a,y,x 同时值向 AB,b仍然指向 B System.out.println(x+","+y); 这里所以打印 AB,AB System.out.println(a+","+b); 这里所以打印 AB ,B 引用参数的传递是把原来的地址传递给新的变量,原来引用的仍然在那里!
下面还是例子:
//在函数中传递基本数据类型, public class Test { public static void change(int i, int j) { int temp = i; i = j; j = temp; } public static void main(String[] args) { int a = 3; int b = 4; change(a, b); System.out.println("a=" + a); System.out.println("b=" + b); } } 结果为: a=3 b=4 原因就是 参数中传递的是 基本类型 a 和 b 的拷贝,在函数中交换的也是那份拷贝的值 而不是数据本身;
public class Test { public static void change(int[] counts) { counts[0] = 6; System.out.println(counts[0]); } public static void main(String[] args) { int[] count = { 1, 2, 3, 4, 5 }; change(count); } } 结果是:6 在方法中 传递引用数据类型int数组,实际上传递的是其引用count的拷贝,他们都指向数组对象,在方法中可以改变数组对象的内容。即:对复制的引用所调用的方法更改的是同一个对象。
这个要和下面的比较下: class A { int i = 0; } public class Test { public static void add(A a) { a = new A(); a.i++; } public static void main(String args[]) { A a = new A(); add(a); System.out.println(a.i); } } 输出结果是0 在该程序中,对象的引用指向的是A ,而在change方法中,传递的引用的一份副本则指向了一个新的OBJECT,并对其进行操作。 而原来的A对象并没有发生任何变化。 引用指向的是还是原来的A对象。 class A { int i = 0; } public class Test { public static void add(A a) { //a = new A(); a.i++; } public static void main(String args[]) { A a = new A(); add(a); System.out.println(a.i); } } 输出结果是1
String 不改变,数组改变 public class Example { String str = new String("good"); char[] ch = { 'a', 'b', 'c' }; public static void main(String args[]) { Example ex = new Example(); ex.change(ex.str, ex.ch); System.out.print(ex.str + " and "); System.out.println(ex.ch); } public void change(String str, char ch[]) { str = "test ok"; ch[0] = 'g'; } } 程序3输出的是 good and gbc. String 比较特别,看过String 代码的都知道, String 是 final的。所以值是不变的。 函数中String对象引用的副本指向了另外一个新String对象,而数组对象引用的副本没有改变,而是改变对象中数据的内容. 对于对象类型,也就是Object的子类,如果你在方法中修改了它的成员的值,那个修改是生效的,方法调用结束后,它的成员是新的值,但是如果你把它指向一个其它的对象,方法调用结束后,原来对它的引用并没用指向新的对象。
发表评论
-
Non-terminating decimal expansion; no exact representable decimal result
2015-05-20 09:46 814异常信息:Non-terminating decimal ex ... -
java中静态代码块的用法 static用法详解
2013-06-18 17:14 769(一)java 静态代码块 ... -
java中的native关键字
2013-06-18 14:35 857JNI是Java Native Interface的 缩写。从 ... -
Java fina 方法和类
2013-06-18 14:34 826final方法 将方法声明为final那有两个原因: ... -
Java transient关键字
2013-06-18 14:33 793java关键字Transient 转自http:/ ... -
Java Assert使用
2013-06-14 14:01 1259主要总结一下在eclipse中如何使用断言。 (一)首先明确 ... -
Java中接口的使用方法简介
2013-06-14 13:48 2304接口申明必须有interface ... -
堆和栈的区别
2013-06-14 12:50 755堆和栈的区别 栈与堆 ... -
HashSet详解:不能重复(对象的哈希代码一样),无序
2012-09-27 16:05 1210HashSet中不允许有重复的元素。例如: Set hash ... -
java i++和++i
2012-08-28 10:30 677//i++是在一个先使用后加1,即先使用i的值,后让i+1 ... -
java 可变长参数
2012-08-15 17:08 865有时候,我们传入到方法的参数的个数是不固定的,为了解决这个问题 ... -
字符编码问题
2012-07-26 16:14 723String newStr = new String(oldS ... -
java发邮件包commons-email-1.0.jar
2012-07-26 16:11 815java发邮件的包commons-email-1.0.jar -
获取图片的宽和高 java
2012-07-26 16:09 919有两种要考虑的情况: 一种是:(图片在本地可以预览到),方法如 ... -
java面试题解惑 之 多线程(转)
2012-07-20 15:25 9701,多线程 线程或者说 ... -
java定时器应用举例
2012-07-20 14:32 737package myThread; import jav ... -
Java中的IO整理完整版(二)
2012-07-12 16:41 617BufferedReader的小例子 注意: Buffere ... -
Java中的IO整理完整版(一)
2012-07-12 14:22 738【案例1】创建一个新文件 import java.io.*; ...
相关推荐
java 值传递和引用传递的比较区别,包括代码及详解
Java:按值传递还是按引用传递详细解说
本人经过长时间收集的最经典、最有说服力、最易懂的关于值传递和引用传递的详解资料~包看包会~发出去真有些不舍得~
主要介绍了 Java 值传递和引用传递详解及实例代码的相关资料,需要的朋友可以参考下
不管是按值传递还是按引用传递,都是把栈中的数据备份了一份给参数变量,只不过值类型备份的是具体的数值,而引用类型备份的是内存地址
Java面向对象值传递和引用传递Java面向对象值传递和引用传递Java面向对象值传递和引用传递Java面向对象值传递和引用传递
主要为大家详细介绍了Java值传递和引用传递,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递....
java学习java语言的值传递和引用传递
这个在Java里面是经常被提起的问题,也有一些争论,似乎最后还有一个所谓的结论...事实上,这很容易让人迷惑,下面先分别看看什么是按值传递,什么是按引用传递,只要能正确理解,至于称作按什么传递就不是个大问题了。
java 中没有引用传递,都是值传递的,可以通过传递副本修改对象的,副本交换,并不影响原引用
主要介绍了Java中值传递和引用传递的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
当一个变量为一个参数传入方法内部的时候,会有两种不同的传递方式:值传递和引用传递。 值传递的特点:不管方法内部对传进去的参数作任何改变,也不会影响方法外部的变量的值 引用传递的特点:方法内部对传...
Java中的值传递和引用传递的区别.doc
Java语言中参数值传递和引用传递比较
Java的按值传递和按引用传递分析 Java的按值传递和按引用传递分析.pdf
java中的值传递和引用传递[汇编].pdf
java参数传递时到底是值传递还是引用传递分享.pdf
Java的按值传递和按引用传递分析.rar
java参数传递时到底是值传递还是引用传递[归类].pdf