急? java 基础问题????

Shine_Panda 2008-04-10 07:10:51

class User{
String name ;
int age ;

User(String name,int age){
this.name = name;
this.age = age;
}

public String toString(){
return name+": :"+age;
}
}

public class Test{


public static void main(String[] args){
final User user= new User("caoyinghui",21);

System.out.println ("修改前:"+user);
user.name="tulu";
System.out.println ("修改后:"+user);


// final String str = new String("aaaaa");
// str="bbbbbbbbbbb";



}
}

//为什么这个 User 的 final 属性可以修改 而String 的会报错?????????

...全文
344 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
jxlijieyu 2008-04-12
  • 打赏
  • 举报
回复
同意楼上
lqs0501 2008-04-12
  • 打赏
  • 举报
回复
final成员
你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变。其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中。这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值。

final类
当你将final用于类身上时,你就需要仔细考虑,因为一个final类是无法被任何人继承的,那也就意味着此类在一个继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要进行修改或扩展。对于final类中的成员,你可以定义其为final,也可以不是final。而对于方法,由于所属类为final的关系,自然也就成了final型的。你也可以明确的给final类中的方法加上一个final,但这显然没有意义。

string的属性和基础类型是一样的
而定义的类则属于引用类型。
yeshuangming 2008-04-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zjx2388 的回复:]
引用 8 楼 guoxujie 的回复:
1.
public String toString(){
return name+": :"+age;
}
//name是字符串型,age是int类型,怎么能return name+": :"+age;


2.
String类的变量不能定义为final


对于String 你可以去查下API,String本身就是final定义的,所以没有必要在定义为final类型
[/Quote]

回八楼: return name+": :"+age; 可以的,他会把int自动转成String的啊。

回11楼: String本身是final定义的,那是说明它不想被另外的类继承,它是个终极类(0.0),定义String类型没关系。

定义变量为final,说明我们不想让我们定义的变量的引用再被修改,而修改此引用内部的状态是允许的。

所以可以定义 final String s = "";这也是有意义的。

以上仅供参考。

chunming525 2008-04-12
  • 打赏
  • 举报
回复
在java中,有很多类都定义成final类,以防止非法继承,产生安全隐患.java.lang.String类就是其中的一种.故不能定义成final类.
Shine_Panda 2008-04-12
  • 打赏
  • 举报
回复
谢谢楼上的各位!!!
qinqinhao 2008-04-12
  • 打赏
  • 举报
回复
学习了
wang_p 2008-04-12
  • 打赏
  • 举报
回复

E:\ww>javac Test.java

E:\ww>java Test
修改前:caoyinghui: :21
修改后:tulu: :21

wxg1008 2008-04-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zrzlj 的回复:]
final 修饰变脸的时候,基本类型不能修改;如果是对对象的引用,那么表示这个变量引用的对象不能改变,但是这个对象的属性是可以改变的(当然是可访问或者通过Getter/Setter方法等方法修改的)

所以,final user = new User("xx");
的时候,user.name可以修改,但是不能写成这样:

user = new User("yy");

因为这个意思是user指向另一个对象!final修饰了不准修改!


同样,final String s = "xxx";

s 已…
[/Quote]
hello_zhenyu 2008-04-12
  • 打赏
  • 举报
回复
FINAL是最终类/成员
南南北北 2008-04-12
  • 打赏
  • 举报
回复
这帖咋这火呢...
snakexiay 2008-04-11
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 jon_wd 的回复:]
引用 10 楼 nihuajie05 的回复:
每个不一样的字符串就对应一个不一样的对象
我想问:
String s1 = "A" 和 String s2 = "A",s1和s2是不是指向同一个地址
[/Quote]
是同一个地址,用""生成的字符串在java的一个文字池里生成的
用变量引用字符串常量时,会先到文字池里去找有没有这个字符常量,有的话就把这个字符常量的引用给变量,没有的话就在池里创建此字符常量(和栈中相对应的引用)
den88 2008-04-11
  • 打赏
  • 举报
回复
前面已经说的很清楚了
final 修饰的是对象引用,不是对象内容。
如果你知道c/c++中的指针,就好理解了。

final Object o = new Object(); //java

Object *const po = new Object(); //c++

而想实现
const Object *po = new Object(); //c++
我还不知道java中还没有什么很好的办法。
WXM8511 2008-04-11
  • 打赏
  • 举报
回复
学习了!!回答的都不错!
不懂编程 2008-04-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 nihuajie05 的回复:]
每个不一样的字符串就对应一个不一样的对象
我想问:
String s1 = "A" 和 String s2 = "A",s1和s2是不是指向同一个地址
[/Quote]
haoxiongok 2008-04-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 nihuajie05 的回复:]
首先我们来看user或者你的str
他们是引用(reference),你可以当作是指针(Pointer).如果你学习过C++,你就知道引用和指针的区别是很小的(C++中也有引用,虽然JAVA中没有指针)
我希望你理解的是引用并不代表对象,他只是指向了对象所在的内存区间的首地址,这个事情和C++中的指针和引用干的事情是一样的,甚至和数组的引用也是一样.
理解了上面我们就能解释你的问题了

Java code final User user= new User("caoyinghui",21);

[/Quote]

小陆同学讲的不错嘛
steven_srl 2008-04-11
  • 打赏
  • 举报
回复
mark
fulianglove 2008-04-11
  • 打赏
  • 举报
回复
可以这样理解(个人想法)
user里保存的是两个属性变量的引用,两个变量里是各自具体值得引用
所以第一次你修改user中属性的值时,只是修改了变量对具体值得引用
这时候的final限定了两个属性变量的引用是不可修改的,所以可以编译通过

第二个对String的操作就很容易理解了
duzhonghua 2008-04-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 J_Factory 的回复:]
引用楼主 caoyinghui1986 的帖子:
final User user= new User("caoyinghui",21);

System.out.println ("修改前:"+user);
user.name="tulu";

我认为这样没有对user修改,只是User数据域改变了,要是给user在new个User那要报错了
[/Quote]
说的不错哦

Alex_hello 2008-04-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 phyeas 的回复:]
个人见解:这个涉及修改引用的问题.把String设置为final再修改其字符串本身的话会直接修改其引用.而你修改User.name属性则修改的是name属性的引用.而不是user的引用
[/Quote] learn..
aipb2008 2008-04-11
  • 打赏
  • 举报
回复
前面已经说的很清楚了
final 修饰的是对象引用,不是对象内容。
如果你知道c/c++中的指针,就好理解了。

final Object o = new Object(); //java

Object *const po = new Object(); //c++

而想实现
const Object *po = new Object(); //c++
我还不知道java中还没有什么很好的办法。
加载更多回复(14)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧