您的位置:首页 > 编程语言 > Java开发

java中只有值传递,没有址传递

2017-06-29 20:07 281 查看

java中只有值传递,没有址传递

package com.zp.demo;
/**
* java中只有值传递,没有址传递
*
* @author zp
*
*/
public class Demo1 {

public static void main(String[] args) {
// TODO Auto-generated method stub

StringBuffer str1=new StringBuffer("abc");
TestStrBuff(str1);
System.out.println(str1);//结果:abcghh   解析:传的是一个对象,即引用,直接操作该引用对应的数据

String str2=new String("abc");
TestStr2(str2);
System.out.println(str2);//结果:abc   解析:String类的底层是final的,所以String对象是不可变的,即不可修改。

String str="abc";
TestStr(str);
System.out.println(str);//结果:abc   解析:String类的底层是final的,所以String对象是不可变的,即不可修改。故当执行方法时,
里面又创建了一个字符串为"aaa"的对象,二者操作的不是一个对象,所以不会影响到原来的字符串的值

int num=1;
TestNum(num);
System.out.println(num);//结果:1      解析:传的是一个具体的值

Integer num1=1;
TestNum1(num1);
System.out.println(num1);//结果:1      解析:Integer类的底层是final的.传的是一个具体的值,执行方法时会创建一个新的Integer对象。
操作的不是一个对象,所以不会对外面的打印造成影响

User user=new User("zs","123");
TestUser(user);
System.out.println(user.getName());//结果:lisi  解析:传的是一个对象,即引用,直接操作该引用对应的数据
}

private static void TestStr2(String str2) {
str2="aaa";
}

public static void TestStr(String str){
str="def";
}

public static void TestStrBuff(StringBuffer str1){
str1.append("ghh");
}

public static void TestNum(int num){
num=2;
}

public static void TestUser(User user){
user.setName("lisi");
}

public static void TestNum1(Integer num1){
num1=2;
}

}

总结:

        在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。在Java中,当基本类型作为参数传入方法时,无论该参数在方法内怎样被改变,外部的变量原型总是不变的。这就叫做“值传递”,即方法操作的是参数变量(也就是原型变量的一个值的拷贝)改变的也只是原型变量的一个拷贝而已,而非变量本身。所以变量原型并不会随之改变。但当方法传入的参数为非基本类型时(也就是说是一个对象类型的变量),
方法改变参数变量的同时变量原型也会随之改变。这种特性就叫做“引用传递”,也叫做传址,即方法操作参数变量时是拷贝了变量的引用,而后通过引用找到变量(在这里是对象)的真正地址,并对其进行操作。当该方法结束后,方法内部的那个参数变量随之消失。但是要知道这个变量只是对象的一个引用而已,它只是指向了对象所在的真实地址,而非对象本身,所以它的消失并不会带来什么负面影响。回头来看原型变量,原型变量本质上也是那个对象的一个引用(和参数变量是一样一样的),当初对参数变量所指对象的改变就根本就是对原型变量所指对象的改变。所以原型变量所代表的对象就这样被改变了,而且这种改变被保存了下来。


      

      

         String的存储实际上通过char[]来实现的。Java API中定义的那些基本类型的包装类。比如Integer是int包装类、Float是float的包装类等等。对这些包装类的值操作实际上都是通过对其对应的基本类型操作而实现的。String就相当于是char[]的包装类。包装类的特质之一就是在对其值进行操作时会体现出其对应的基本类型的性质。在参数传递时,包装类就是如此体现的。所以,对于String在这种情况下的展现结果的解释就自然而然得出了。同样的,Integer、Float等这些包装类和String在这种情况下的表现是相同的。所以基本数据类型和其包装类在作为参数传递时都不会引起外部变量的值的变化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: