各位大佬,最近关于string的问题始终没有想明白,希望有大神能够指点。
这里有几个问题:
1、
String a = "a";
a.concat("b");
System.out.println(a); //输出:a
a = "b";
System.out.println(a); //输出:b
a = new String("c");
System.out.println(a); //输出:c
string源码里是final修饰的类,我看到源码中concat方法是返回一个新字符串对象,知道第一个输出是a,但是后面为什么还是可以直接赋值或者new对象?
2、上面那种重新赋值得到的a究竟是引用变了,指向了新的字符串,还是改变了原来的字符串内容?
3、为什么重新用final修饰以后,
final String a = "a";
a = "b"; //编译通过
a = new String("c"); //编译错误
string类的final和这里的fianl究竟是怎么回事呢?
4、为什么源码里final修饰的char[]也可以直接赋值?
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
类的final是不能被继承
属性上的final是引用的对象不能变,但是里面的值可以变
1.concat()是新建了一个String,把两个字符串拼起来,a还是没变,而后面两种都是改变了引用
2.改变了引用,String对象不可变
3.两种赋值都是不允许的,final属性不可以赋值
4.源码的value[]这个变量的引用不可变,但是这个数组里的内容可以变
可以指向另一个对象(改变引用),但是不可以改变其值。
你a = "b"或者a = new string("b")都是指向另一个新的string了
原来的那个"a"如果没有别的对象引用,就被垃圾回收了
没办法把那个a存储的内存换成别的
String这个类是Final修饰的,表示该类不可被继承重写。属性用final修饰表示该属性为常量,不可修改内容
1. final修饰的泪代表不可被继承,跟赋啥值没关系;虽然concat方法返回的是一个新字符串,但你并没有将返回的新字符串赋值给a变量,所以输出依然是a,想要输出ab,你需要写a = a.concat("b");你的变量a只是一个引用,当你写a="b"的时候,给变量a重新赋了值。
2. 这个问题已经在第1点里面说明了。
3. 你得明白final的用途,final可以修饰变量(被final修饰的变量也就成了常量)、对象引用、方法和类,修饰变量的时候,只能被赋值一次,修饰对象引用的时候,当对象实例化后,引用不可变,但对象是可变的,修饰方法的时候方法不能被重写,修饰类的时候,类不能被继承。
4. 在地3点中已经说明。