String s = “123” ;
void test () {
s=”456″;
System.out.println(s);
}
public static void main(String[] args) {
new Test8().test();
}
s是String类型的 一开始赋值是”123″
后来本人把它改成了”456″
不是说String 类型的不可以修改的吗
void test () {
s=”456″;
System.out.println(s);
}
public static void main(String[] args) {
new Test8().test();
}
s是String类型的 一开始赋值是”123″
后来本人把它改成了”456″
不是说String 类型的不可以修改的吗
解决方案
10
你要知道String指向的是堆上一块内存地址,那块里面的东西是可以改变的,只是说这个引用指向的地址不能变
同时 String类做过特殊处理 任何试图改变原对象的方法所获得的都是原对象的一个拷贝
同时 String类做过特殊处理 任何试图改变原对象的方法所获得的都是原对象的一个拷贝
10
final 用来修饰类,表示此类不可以被继承,也就是此类没有子类
对于String来说,假如一个变量str的类型是String的,那么str.class==String.class一定是成立的
假如不是final类,如Student继承Person类,那么 Person p=new Student(),那么显然p.class !=Person.class
还有一点,String类的里面的很多属性是final的,也就是说不能通过反射来改变里面字段的值
lz你改变的变量的引用或指针,并不是改变了变量所指向的那个对象的值
当然假如变量用final修饰,那么此变量也不可重新赋值的(指向另外一个对象)
对于String来说,假如一个变量str的类型是String的,那么str.class==String.class一定是成立的
假如不是final类,如Student继承Person类,那么 Person p=new Student(),那么显然p.class !=Person.class
还有一点,String类的里面的很多属性是final的,也就是说不能通过反射来改变里面字段的值
lz你改变的变量的引用或指针,并不是改变了变量所指向的那个对象的值
当然假如变量用final修饰,那么此变量也不可重新赋值的(指向另外一个对象)
10
String不是final的,而是Immutable(不可变类),即属性值不可变,你可以简单理解为一个字符串对象的内容不可变
为什么可以二次赋值?
当你第二次为一个String变量赋值时,实际上是重新创建的一个String对象,将这个新创建的对象引用赋值给之前的String变量,也就是说这个时候产生了两个对象,而不是同一个对象改变了值。
为什么可以二次赋值?
当你第二次为一个String变量赋值时,实际上是重新创建的一个String对象,将这个新创建的对象引用赋值给之前的String变量,也就是说这个时候产生了两个对象,而不是同一个对象改变了值。