问题的引入:

  java中只有值传递,没有引用传递,这里有两种情况,一种是传对象,一种是传基础类型,传对象其实是传对象的引用,

  http://guhanjie.iteye.com/blog/1683637这篇文章描述了一些情况:

  基础类型传递的时候,直接把内存里面真正的值传递过去,而在对象传递的时候,是把对象的引用传递过去。

  那么问题来了,为什么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.print(ex.ch);
}

public void change(String str, char ch[]) {
str="test ok";
ch[0] = 'g';
}
}

这里输出:good and gbc

本例中,str和ch作为对象一起传入方法change,也一同改变,ch变化了,str并没有改变。

解释:

1,如果你看到这里了,那么你应该理解了java中总是值传递(传对象的时候,对象的地址就是他的值)。

2,String是不可变的对象,为什么这么说呢,我们看String的源码可以知道:String是final的,String的成员变量也是final的,首先String实例化出来是不可变的(除非反射)。当我们尝试改变他的时候:

str="test ok";

其实是在内存空间再创建一个"test ok"的对象,并把str引用指向这个新创建的对象,原来的ex.str引用依旧指向了之前的"good"对象的地址。

3,我们要区别对待String,想想看,为什么会引入这样的问题,其实是因为String作为对象却可以跟基础类型数据一样使用+,=等操作。这在语言中本身就已经对String做了特殊的处理。

java为String对象重载"+",这里的重载是,一个操作符在应用于特定的类时,被赋予了特殊的意义(用于String的"+"和"+="是Java仅有的两个重载过的操作符,而java并不允许程序员重载任何操作符)

http://blog.csdn.net/clam_clam/article/details/6831345

思考:延续第三点,我们能不能创建一个类似String的对象,即也是final,其成员变量都是final的,然后作为对象传递,在方法体类改变而不影响其原本的值。

转载于:https://www.cnblogs.com/yemanling/p/4556322.html

理解String不可变相关推荐

  1. String可不可变???

    众所周知,String是不可变的. 但是为什么String不可变呢?String不可变是指的什么不可变呢?哪里又可以变呢?接下来我总结一下我学习String的心得(大佬勿喷!) 一些东西从源码的角度进 ...

  2. 按我的理解string似乎不是字面值类型,但为什么《c++ primer》习题7.55答案说Data类是集合类呢?

    按我的理解string似乎不是字面值类型,但为什么<c++ primer>习题7.55答案说Data类是集合类呢?Data类定义如下: struct Data{ int ival; str ...

  3. String内容不能改变的理解 String的值不能修改的理解

    String内容不能改变的理解 String的值不能修改的理解     java中,String类的值声明后是不能修改,有些初学者就难以理解,为什么下面程序明明是修改了String对象的内容,为什么还 ...

  4. java string的作用_浅谈java String不可变的好处

    一.java内部String类的实现: java 8: public final class String implements java.io.Serializable, Comparable, C ...

  5. 深入理解String、StringBuffer和StringBuilder类的区别

    Java提供了String.StringBuffer和StringBuilder类来封装字符串,并提供了一系列操作字符串对象的方法. 它们的相同点是都用来封装字符串:都实现了CharSequence接 ...

  6. 深入理解String、StringBuffer和StringBuilder

    1.String类的特性 public final class Stringimplements java.io.Serializable, Comparable<String>, Cha ...

  7. java object怎么拿字段_「Java面试秘籍」String不可变,如何理解

    Java中最常见的就是String类,那么很多人都说String是不可变类型,那么如何解释下面的代码? public class StringTest { public static void mai ...

  8. 深入理解String.intern

    在 JAVA 语言中有8中基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念.常量池就类似一个JAVA系统级别提供的缓存. 8种基本 ...

  9. 01.几张图轻松理解String.intern()

    当调用 intern() 方法时,编译器会将字符串添加到方法区的运行常量池中(stringTable维护),并返回指向该常量的引用. 在翻<深入理解Java虚拟机>的书时,又看到了2-7的 ...

  10. Java基础提升篇:理解String 及 String.intern() 在实际中的应用

    点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 好好学java java知识分享/学习资源免费分享 关注 精彩内容 你所需要的 ...

最新文章

  1. vant组件搜索并选择_Vue.js自定义弹层组件|vue仿微信/ios弹窗
  2. 【面试招聘】聊聊秋招中的面试技巧
  3. adobe 书签怎么设置_让我们设置一些规则…没有Adobe Analytics处理规则
  4. mysql移动文件后打不开_Windows端MySQL data目录迁移(貌似会启动不了)
  5. C++冒泡排序(正宗版)
  6. C++开源代码覆盖率工具OpenCppCoverage介绍(Windows)
  7. Hadoop源码分析:Hadoop编程思想
  8. 毕设之 yolo5 航空影像飞行器检测
  9. 在线点餐APP开发前景如何?
  10. Android中设置分割线
  11. 最优传输论文(一)Sliced Wasserstein Discrepancy for Unsupervised Domain Adaptation
  12. 为什么需要一部21世纪的全球通史?
  13. Linux 基础上篇
  14. 天九共享:突破“邓巴数字”桎梏 创造资源能力圈
  15. 【Python军火库】pyautogui:成熟的鼠标和键盘自己动起来!
  16. 一文读懂AlphaGo背后的强化学习
  17. word去掉页面横线
  18. 16代表啥_出道12年33岁当选,新晋金鹰女神,宋茜比几位前任女神差了啥
  19. JavaScript翻转数组
  20. 基于jsp的洋酒销售系统

热门文章

  1. 在窗体创建时显示窗体
  2. 算法笔记_138:稳定婚姻问题(Java)
  3. openDrive has Free Direct Linking !
  4. jQuery实现一个简单的选项卡效果
  5. 基于Tight VNC的远程协助功能的实现
  6. win2003实现单用户远程登录
  7. GARFIELD@02-13-2005
  8. 10月| R社区原创作者免费赠书
  9. R语言可视化学习笔记之gganimate包
  10. jquery_file_upload in Rails(ajax实现多张图片上传)