`
stone_tms
  • 浏览: 16887 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

String 类型的参数,传值还是传引用?

    博客分类:
  • JAVA
阅读更多

 

public static void main(String[] args) throws Exception {  
        String str="aaaaaaaa";  
        change(str);  
        System.out.println(str);  
    }  
  
    public static void change(String str){  
        str="bbbbbbb";  
    }  

 结果是aaaaa,而不是改变过的bbbbb.

 

解释:

对象是传引用(准确说应该是指针,Java 中没有C 意义上的引用),但是如果引用的是个String对象,情况就不同,因为String 一旦创建就不能改变,这才是关键(本质)。

在change 方法中给该方法的局部变量str 重新赋值时,因为str 指向的位置是String 常量池,是不能改变的,所以只能产生一个新的String 对象,change 方法中的str 指向新的对象,而main 方法中的str 变量还是指向之前产生的对象。

 

这跟一般的传引用是不一样的,因为一般的引用可以改变其指向的地址上的对象值,所以传来传去如果大家还是指向同一个地址,一改全部都改变了。

可以用StringBuffer 试试,结果和你预期的就会一致。如下面的代码

 

public static void main(String[] args) throws Exception {  
    StringBuffer str=new StringBuffer("aaaaaaaa");  
    change(str);  
    System.out.println(str);  
}  
  
public static void change(StringBuffer str){  
    str=str.replace(0, str.length(), "bbbbbbbb");  
}  

  也就是说,如果修改了引用指向的地址的内容,所有指向该地址的引用都会受到影响,这才是传引用的根本所在。

使用String s="" 的方式产生的String 对象会被放入String 常量池中,而String 常量池中相同的String 对象只会有一个Copy ,故,public static void main(String[] args) throws Exception {  

    String str1="aaaaaaaa";  
    String str2="aaaaaaaa";  
    System.out.println(str1==str2);  
}  

  将输出true. 而使用new String 产生的对象就跟一般的对象一样,会在普通的Heap 中,此对象会同时被加入String常量池(不是很好验证),

 

public static void main(String[] args) throws Exception {  
    String str1=new String("aaaaaaaa");  
    String str2=new String("aaaaaaaa");  
    System.out.println(str1==str2);  
} 

 将输出false.

 

分享到:
评论

相关推荐

    java的传值与传引用详解

     Java 是传值还是传引用,问题主要出在对象的传递上,因为 Java 中简单类型没有引用。既然争论中提到了引用这个东西,为了搞清楚这个问题,我们必须要知道引用是什么。  简单的说,引用其实就像是一个对象的名字...

    Python引用传值概念与用法实例小结

    Python函数的参数传值使用的是引用传值,也就是说传的是参数的内存地址值,因此在函数中改变参数的值,函数外也会改变。 这里需要注意的是如果传的参数类型是不可改变的,如String类型、元组类型,函数内如需改变...

    Python可变对象与不可变对象原理解析

    1. python不允许程序员选择采用传值还是传引用。Python参数传递采用的肯定是“传对象引用”的方式。实际上,这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象的引用,就能修改对象的原始值——...

    python 实现按对象传值

    通过百度并实际测试,确实发现python没有按值或者按引用来进行区别,对不同的参数对象还是按Python基本类型的处理方式进行处理: 1. 所有传递都是引用传递,形参与实参ID一样 2. 对于string int float bool等不可变...

    javascript的变量、传值、传址、参数之间关系

    5种基本类型包括:undefined,null,string,boolean,number 2.函数的参数的传递的机制是复制变量值。 书上说:”把函数外部的值复制给函数内部的参数,就和把值从一个变量复制给另一个变量一样。基本类型的传递如同...

    c#基础系列之ref和out的深入理解

    C#有两种参数传递方式:传值和引用,传值就是变量的值,而引用则是传递的变量的地址; 本文中说的Ref和Out都是引用传递,Ref的重点是把值传给调用方法,Out则是得到调用方法的值,类似于有返回类型的方法返回的值; ...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

     6.2.2 传引用参数 188  6.2.3 const形参和实参 190  6.2.4 数组形参 193  6.2.5 main:处理命令行选项 196  6.2.6 含有可变形参的函数 197  6.3 返回类型和return语句 199  6.3.1 无返回值函数 200  6.3.2 ...

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

     6.2.2 传引用参数 188  6.2.3 const形参和实参 190  6.2.4 数组形参 193  6.2.5 main:处理命令行选项 196  6.2.6 含有可变形参的函数 197  6.3 返回类型和return语句 199  6.3.1 无返回值函数 200  6.3.2 ...

    js比较两个单独的数组或对象是否相等的实例代码

    所谓js的中的传值,其实也就是说5种基本数据类型(null,undefind,boolean,number,string) 传引用也就是说的那个引用数据类型,(array和object) 基本数据类型的值不可变,而引用数据类型的值是可变的 所以当你比较数组和...

    c/c++ 学习总结 初学者必备

    (C语言里参数传递都是传值,是一个拷贝,修改指针,只是改变了拷贝的指向,原指针指向并没有改变,而修改指针的内容则是可以的。)如果函数的参数是一个指针,不要指望用该指针去申请动态内存。(即上面所说的修改...

    C++指针作为函数的参数进行传递时需要注意的一些问题

    只有在被调函数中,对指针进行引用操作,才可以达到不需要返回值,就对指针指向的变量做出相应的变化。 下面分析这样两个例子; 要求:定义并初始化两个字符串变量,并执行输出操作;然后调用函数使这两个变量的值...

    Absolute C++中文版(原书第2版)-完美的C++教程,文档中还包含英文版

    4.1.1 传值调用参数 92 4.1.2 引用调用参数初步 94 4.1.3 引用调用机制详解 95 4.1.4 常量引用参数 97 4.1.5 混合参数列表 99 4.2 重载与默认实参 104 4.2.1 重载简介 104 4.2.2 分辨重载的准则 107 4.2.3 ...

    C#常用知识点简单回顾(有图有真相)

    1)传值调用与引用调用 代码如下: using System; class MethodCall { public static void Main() { /* * 参数类型分为 in, ref, out 三种,默认为 in。 * in 类型在子方法中修改了对应变量后,主方法中的值不会发生...

    现代C++程序设计

    4.3.6 传值调用 4.3.7 问题分析:未声明的标识符 4.4 重载函数 4.5 具有默认输入参数列表的函数 4.6 局部变量、全局变量和静态变量 4.6.1 局部变量 4.6.2 块范围 4.6.3 全局变量 4.6.4 危险的全局变量 4.6.5 问题...

    C++编程思想习题

    12.2.1仅从堆中创建string类 12.2.2stash指针 12.2.3stack例子 12.3用于数组的new和delete 12.4用完内存 12.5重载new和de1ete 12.5.1重载全局new和delete 12.5.2为一个类重载new和delete 12.5.3为数组重载new和...

    C#难点逐个击破(2):out返回参数

    传值(by value)与传址(by reference)分别为普通传递参数方式与ref声明方式,传址方式在使用前需要ref关键词修饰;out为输出返回传递,与ref相同之处较多,其重要区别是在上一节讲到的ref在被引用方法中必须被...

    【全新正版】现代C++程序设计(原书第2版)

    4.3.6 传值调用 4.3.7 问题分析:未声明的标识符 4.4 重载函数 4.5 具有默认输入参数列表的函数 4.6 局部变量、全局变量和静态变量 4.6.1 局部变量 4.6.2 块范围 4.6.3 全局变量 4.6.4 危险的全局变量 4.6.5 问题...

    新手学习C++入门资料

    在C++中,允许有相同的函数名,不过它们的参数类型不能完全相同,这样这些函数就可以相互区别开来。而这在C语言中是不允许的。 1.参数个数不同 #include iostream.h void a(int,int); void a(int); int main...

    asp.net知识库

    泛型技巧系列:如何提供类型参数之间的转换 C#2.0 - Object Pool 简单实现 Attributes in C# 手痒痒,也来个c# 2.0 object pool 泛型技巧系列:用泛型打造可复用的抽象工厂 体验.net2.0的优雅(四):Provider、策略...

    Java开发技术大全(500个源代码).

    notInPack.java 用前缀引用包中的类 onlyShow.java 一个简单的接口 Outer_1.java 外部类示例1 Outer_2.java 外部类示例2 Outer_3.java 外部类示例3 Outer_4.java 外部类示例4 Outer_5.java 外部类示例5 ...

Global site tag (gtag.js) - Google Analytics