黑马程序员技术交流社区

标题: String类的问题 [打印本页]

作者: 袁春龙    时间: 2011-7-19 20:47
标题: String类的问题
“public final class String”这是final型的类。
但是我的代码:
  String name = "zxx";
  System.out.println(name);
  name = "lhm";
  System.out.println(name);
这段代码是正确的,也就是说我把String对象的值改变了,怎么就可以呢?
作者: 匿名    时间: 2011-7-19 21:48
当final修饰类的时候, 这个类被称为“最终类”,简单的说,就是这个类不可以再有子类了。
当final修饰变量的时候,才是您说的那种情况。
当final修饰方法的时候,这个方法可以被继承但将不能被重写。
作者: 匿名    时间: 2011-7-19 22:00
final修饰类是不让定义这个类的子类
也就是不能
class SubString extends String
作者: 李龙    时间: 2011-7-19 22:05
呵呵 问题错了就不放在这里了 避免让大家走入误区。不过楼下因为我获得了3分呦!
[ 本帖最后由 李龙 于 2011-07-20  11:30 编辑 ]
作者: 匿名    时间: 2011-7-19 22:19
标题: 回复 板凳 的帖子
感觉你说的很有道理    但是我试了  你说的不对
        public class MyTest {
        public static void main(String[] args) {
                        String name = "yuan";
                        System.out.println(name);
                        name = new String("lhm");
                        System.out.println(name);

        }
                  }
两个都可以正确打印。
作者: 匿名    时间: 2011-7-19 22:21
标题: 回复 沙发 的帖子
“字符串是常量;它们的值在创建之后不能更改”这是文档上的,什么意思?
作者: 匿名    时间: 2011-7-19 22:31
name="zzz";
name=new String("zzz");
是一样的,都会生成一个新的对象,原先的值就变成垃圾被回收了.
name只是一个引用,理解起来类似与指针,但name本身并没有变
作者: 匿名    时间: 2011-7-19 22:44
标题: 回复 楼主 的帖子
public final class String”这是final型的类。
但是:
你的变量name不是final的啊,也就是说你查String是不是final的,它是不是这里都跟你的name没关系
你要是写final String name = "zxx";
这个时候你的name才是final的,后面就改不了name的值了

这是你的代码
  String name = "zxx";
  System.out.println(name);
  name = "lhm";
  System.out.println(name);

你改成
  final String name = "zxx";
  System.out.println(name);
  name = "lhm";
  System.out.println(name);

你再运行看看就明白了
ps: fina定义的变量即为常量,通用的命名习惯是变量名所有字母大写,虽然不影响编译和运行,但是属于一种规范
final String NAME = "zxx"; 这种写法比较标准
作者: 匿名    时间: 2011-7-20 01:26
String是不可变类,String name="zzx";
这里的name指向“zzx”对象,即这里的“zzx”是不可变的。
但是name的指向却是可以变的。
name="lhm";这里的name又重新指向了另外一个对象,其内容为“lhm”;
作者: 匿名    时间: 2011-7-20 06:08
感觉楼上说的挺有道理的,试了一下也对。
感觉黑马论坛真的帮我巩固了很多基础,多逛逛是有好处的。
作者: 李龙涛    时间: 2011-7-20 08:24
String name = "zxx"; 与name = "lhm"; 这个两个name实际上是指向了两个不同的匿名对象,也就是说name只是改变了指向的对象而不是改变了对象的值
作者: 匿名    时间: 2011-7-20 12:38
final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。内部类要访问局部变量就必须定义成final类型的,楼主的final用于了声明类,但改变类中变量中的属性,当然不会出现问题了。
作者: 匿名    时间: 2011-7-20 13:02
String虽然是final型的,但是指的是name所指向的值为final型,而name只是一个值的引用句柄,而name=“lhm”相当于将name指向了新的值,所以不会报错。
作者: 匿名    时间: 2011-7-20 17:00
这里的name只是一个String类型的普通变量而非被final修饰,你应该是理解错了final关键字所修饰的不同类型…




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2