A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© liqian 中级黑马   /  2012-4-24 20:20  /  1898 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String是一个对象,那String和其它对象有哪些区别?
在String中final只对引用的"值"(即内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误,这是为什么呢?

4 个回复

倒序浏览
1、String是引用数据类型

2、String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。

官方语法:字符串是常量,它们的值在创建之后不能更改(相对于数字而言);字符串缓冲区支持可变的字符串 。又因为 String 对象是不可变的,所以可以共享。
回复 使用道具 举报
首先你要知道String类是个什么类,没个类就跟你自己设置类一样都会有自己的需求和设定!!
而String类在设计的时候(你可以查下api文档中的String类看下)就被final已经修饰过了--------------------------------------所以String类所有的对象都是不能被修改的。


--------------------------------------割掉还会来-------------------------------

“在String中final只对引用的"值"(即内存地址)有效,”你这句话的意思我没理解错的话你是说:你在String中定义一个变量赋值给他一个String类的值。
例如:final x="abcdef";

这个时候x变量被final修饰变成一个常量,内存地址被固定了,无法更改,所以:“它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误,”
回复 使用道具 举报
字符串本身就是对象,而在String创建对象:String str=new String("abc");这里面str包含了两个对象,new String()是一个对对象,分配了地址值,“abc”也是一个对象同样分配地址值。“abc”的地址值指向了new String(),new String()再将其地址值指向str变量。
用final修饰的变量是不可改变的,不可以对其变量指向其他值。
回复 使用道具 举报
首先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));
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马