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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 袁春龙 黑马帝   /  2011-7-19 20:47  /  2900 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

“public final class String”这是final型的类。
但是我的代码:
  String name = "zxx";
  System.out.println(name);
  name = "lhm";
  System.out.println(name);
这段代码是正确的,也就是说我把String对象的值改变了,怎么就可以呢?

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1 zxx?lhm?

查看全部评分

13 个回复

倒序浏览
黑马网友  发表于 2011-7-19 21:48:17
沙发
当final修饰类的时候, 这个类被称为“最终类”,简单的说,就是这个类不可以再有子类了。
当final修饰变量的时候,才是您说的那种情况。
当final修饰方法的时候,这个方法可以被继承但将不能被重写。

评分

参与人数 1技术分 +1 收起 理由
admin + 1 有道理!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-19 22:00:10
藤椅
final修饰类是不让定义这个类的子类
也就是不能
class SubString extends String
回复 使用道具 举报
呵呵 问题错了就不放在这里了 避免让大家走入误区。不过楼下因为我获得了3分呦!
[ 本帖最后由 李龙 于 2011-07-20  11:30 编辑 ]
回复 使用道具 举报
黑马网友  发表于 2011-7-19 22:19:27
报纸

回复 板凳 的帖子

感觉你说的很有道理    但是我试了  你说的不对
        public class MyTest {
        public static void main(String[] args) {
                        String name = "yuan";
                        System.out.println(name);
                        name = new String("lhm");
                        System.out.println(name);

        }
                  }
两个都可以正确打印。

评分

参与人数 1技术分 +3 收起 理由
admin + 3 收到别人答案,还自己去尝试对与错,加分必

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-19 22:21:33
地板

回复 沙发 的帖子

“字符串是常量;它们的值在创建之后不能更改”这是文档上的,什么意思?
回复 使用道具 举报
黑马网友  发表于 2011-7-19 22:31:06
7#
name="zzz";
name=new String("zzz");
是一样的,都会生成一个新的对象,原先的值就变成垃圾被回收了.
name只是一个引用,理解起来类似与指针,但name本身并没有变
回复 使用道具 举报
黑马网友  发表于 2011-7-19 22:44:29
8#

回复 楼主 的帖子

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"; 这种写法比较标准

评分

参与人数 1技术分 +2 收起 理由
admin + 2 不错的童鞋!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-20 01:26:55
9#
String是不可变类,String name="zzx";
这里的name指向“zzx”对象,即这里的“zzx”是不可变的。
但是name的指向却是可以变的。
name="lhm";这里的name又重新指向了另外一个对象,其内容为“lhm”;
回复 使用道具 举报
黑马网友  发表于 2011-7-20 06:08:55
10#
感觉楼上说的挺有道理的,试了一下也对。
感觉黑马论坛真的帮我巩固了很多基础,多逛逛是有好处的。
回复 使用道具 举报
String name = "zxx"; 与name = "lhm"; 这个两个name实际上是指向了两个不同的匿名对象,也就是说name只是改变了指向的对象而不是改变了对象的值
回复 使用道具 举报
黑马网友  发表于 2011-7-20 12:38:05
12#
final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。内部类要访问局部变量就必须定义成final类型的,楼主的final用于了声明类,但改变类中变量中的属性,当然不会出现问题了。
回复 使用道具 举报
黑马网友  发表于 2011-7-20 13:02:11
13#
String虽然是final型的,但是指的是name所指向的值为final型,而name只是一个值的引用句柄,而name=“lhm”相当于将name指向了新的值,所以不会报错。
回复 使用道具 举报
黑马网友  发表于 2011-7-20 17:00:48
14#
这里的name只是一个String类型的普通变量而非被final修饰,你应该是理解错了final关键字所修饰的不同类型…
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马