牵扯到面试经常问的问题,String是否能继承?String和StringBuffer的区别?
因为String底层是使用final 关键字字符数组保存字符串, private final char value[] ,所以String 对象不可继承的同时也是不可变的。
StringBuilder 与 StringBuffer 都继承自AbstractStringBuilder 类,在AbstractStringBuilder 中也是使用字符数组保存字符串char[]value 但是没有用final 关键字修饰,所以这两种对象都是可变的。
主要是因为final存在的原因,导致第二次str赋值“text ok”不成功
传参过程中String 类型的参数是值传递,数组类型参数是引用传递,change 函数的参数 str 是一个新的String对象,和函数外部对象没有任何关系,只是他的值等于外部传入的值, 但是数组是引用参数,change 内部和外部变量的引用都指向同一块内存区域,所以change函数内部改变值, 外部也会改变。
字符串不能再赋值
虽然string是个引用类型,但是java总是在各个地方都想人们把它当做基本类型,string的各种处理都是单独一套的
说的简单点就是,你change传入的str对象,在传入方法后,就被重新赋值了,而你这里的本意,是对example的str变量赋值,java是这样判定的,当方法的传入变量和对象本身的变量的取名是同一个,也就是都是str时,不显示使用this.str来指明要赋值的是对象的str变量时,是默认对传入变量重新赋值,所以你这里后面使用对象.str时,才会发现没有重新赋值
而之所以会这样,就涉及值传递和引用传递的知识点,八大基本类型和string都是值传递,其余的是引用传递,引用传递重新赋值时,是赋予给引用地址指向的空间中存储的数据,所以这里的ch的第一个参数被替换掉了,因为ch是引用传递,而str是值传递,你这里虽然传入的是对象的str,但传入到方法后,其实已经是一个新的值了,其中str的引用地址已经跟对象原本的str不是同一个了,当你使用this.str来指明变量时,jvm虚拟机其实是对对象的str变量重新赋予一个值,会直接去更新对象str的引用地址,这时候你再通过对象来调用str时,才会拿到新的值