欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java值传递和引用传递的理解

程序员文章站 2022-03-20 08:46:42
java的基础数据类型有:(byte、short、int、long、float、double、char、boolean)八种 基础数据都是值传递,其他都是引用传递。但是引用传递要特别注意:String Integer Double等这几个类型,以下以String为例。 举例说明: 打印: str : ......

java的基础数据类型有:(byte、short、int、long、float、double、char、boolean)八种

 

基础数据都是值传递,其他都是引用传递。但是引用传递要特别注意:string integer double等这几个类型,以下以string为例。

 

举例说明:

 

public static void main(string[] args) {        
        string a="zkj";
        system.out.println("str :");
        strtest(a);
        system.out.println("str :");        
}  

  public static void strtest(string b){ //这里b的地址指向main方法中a的地址
        b="hello,"+b;   //这里虽然也是引用传递,但是这里等于是新建了对象,并把地址指向这里的b
        system.out.println(b);
    }

打印:

 str : zkj

 str : zkj

这里string是引用传递,但是调用strtest方法后,执行:

b="hello,"+b;  

看似改变了传入的参数,但是其实是由于新建了一个string对象,所以内存中存在a:zkj,b:hello zkj,两个地址,所以这时候a的值还是 不变的。


其他的情况:
public class main {

    public static void main(string[] args) {

        string a="zkj";
        system.out.println("str :");
        strtest(a);
        system.out.println("str :");

        stringbuffer sb=new stringbuffer("zkj,");
        objtest(sb);
        system.out.println("obj :"+sb.tostring());

         final stringbuffer s=new stringbuffer("aa");
         system.out.println(s);
         s.append("bb");
         system.out.println(s);

    }


    public static void strtest(string b){ //这里b的地址指向main方法中a的地址
        b="hello,"+b;   //这里虽然也是引用传递,但是这里等于是新建了对象,并把地址指向这里的b
        system.out.println(b);
    }

    public  static void objtest(stringbuffer a){
        a.append("hahah");
        system.out.println(a.tostring());
}

}

 这里打印:

   zkj,hahah 

新增了一个stringbuffer对象sb,学习过jvm的就了解,这里会在栈中生成一个sb,堆中生成一个“zkj,”对象,sb引用这个堆中的地址。调用ojbtest方法后,sb新增了字符串hahah,堆中的sb对象增加了这个string.
那什么时候可以像上例中string赋值一样,sb的值保持不变呢?
很简单,类似上例,我们也新建一个对象。 在ojbtest中。
 public  static void objtest(stringbuffer a){
        a=new stringbuffer();
        a.append("hahah");
        system.out.println(a.tostring());
    }

  这样main中就会打印:  zkj,

  解释如同上例。