黑马程序员技术交流社区
标题:
String的问题
[打印本页]
作者:
liqian
时间:
2012-4-24 20:20
标题:
String的问题
String是一个对象,那String和其它对象有哪些区别?
在String中final只对引用的"值"(即内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误,这是为什么呢?
作者:
真真姐
时间:
2012-4-24 20:36
1、String是引用数据类型
2、String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
官方语法:字符串是常量,它们的值在创建之后不能更改(相对于数字而言);字符串缓冲区支持可变的字符串 。又因为 String 对象是不可变的,所以可以共享。
作者:
龚正军
时间:
2012-4-24 20:46
首先你要知道String类是个什么类,没个类就跟你自己设置类一样都会有自己的需求和设定!!
而String类在设计的时候(你可以查下api文档中的String类看下)就被final已经修饰过了--------------------------------------所以String类所有的对象都是不能被修改的。
--------------------------------------割掉还会来-------------------------------
“在String中final只对引用的"值"(即内存地址)有效,”你这句话的意思我没理解错的话你是说:你在String中定义一个变量赋值给他一个String类的值。
例如:final x="abcdef";
这个时候x变量被final修饰变成一个常量,内存地址被固定了,无法更改,所以:“它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误,”
作者:
魏征
时间:
2012-4-24 20:54
字符串本身就是对象,而在String创建对象:String str=new String("abc");这里面str包含了两个对象,new String()是一个对对象,分配了地址值,“abc”也是一个对象同样分配地址值。“abc”的地址值指向了new String(),new String()再将其地址值指向str变量。
用final修饰的变量是不可改变的,不可以对其变量指向其他值。
作者:
黑马罗坚
时间:
2012-4-24 22:40
首先String类对象一旦创建值不可改变 如String s="123"; s="222";在栈内存中开闭空间存储s的句柄 在方法区的常量池里面寻找是否有"123"对象 如果有把该对象的地址赋值给它 如果没有在常量池里创建个"123 "的对象并赋值给栈里的s 当执行s="222";
s=new String("123"); 在堆内存中开辟空间存放常量池里的"123"对象值赋给s句柄
会在常量池里寻找"222"对象如果找到把对象地址赋值给s没有的话创建对象"222"地址赋值给s 常量池里的"123"对象并不会被删除也不会影响指向"123"对象的String变量 如果过多的建立字符串常量对象 可能会导致内存溢出
由以上特性当String类对象(不管new没new)当做一个实参传递时 在被调用方法里不管怎么修改 调用方法里的该对象的值不变
而其他对象在被调用方法里修改了期值 调用所在方法对象值也会改变有一种情况不会改变如下
class Demo{
void run(StringBuffer s){
StringBuffer s1=new StringBuffer("10");
s=s1; //这里只是改变了栈内存run方法区里的s句柄的值 main方法sb的值并没改变如果是s.append("1");类似方法值就改变了
}
public static void main(String[] args){
StringBuffer sb=new StringBuffer();
System.out.println(new Demo().run(sb));
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2