本帖最后由 黑马伍哲沂 于 2013-5-5 16:43 编辑
四.关于一道面试题的多种说法解析。
有位同学在论坛发这道面试题帖后,看到有很多不同的回答。我都一一思考了下。并查了相关资料。首先,说下比较好的不同理解的回答:- public class Example
- {
- String str = new String("good");
- char[] ch = {'a','b','c'};
- public static void main(String[] args)
- {
- Example ex = new Example();
- ex.change(ex.str, ex.ch);
- System.out.print(ex.str+"......and.....");
- System.out.println(ex.ch);
- }
- public void change(String str,char ch[])
- {
- str = "test ok"; //加this处
- ch[0]='g';
- }
- }
复制代码 1.字符串是不可变的;
2.值传递与引用传递的不同;
3.成员变量与局部变量区别;(这是我的理解和回答)
在我当时看来,觉得这三个理解比较靠谱。并且因为看到和自己不同的回答我怀疑自己理解错了。但经过验证,确实在程序change函数里的str前面加上this。就会出现不一样的结果。经过查阅许多资料后,我的理解是这样的:
1.字符串是不可变的。这话没有错。如第二部分的解说。也许也有些类似以上的题目,被解说为字符串是不可变的。我觉得这种说法,不太合适。这里的字符串不可变体现在,当change函数里str前加上this时,change被调用后,str指向了"test ok",原来的"good"暂时还在,只不过str不再指向它了。这就是说"good"是不可变的。我将程序稍微调整如代码段四。运行结果说明了所有问题。
******代码段四- //相比前面代码增加了成员变量num,以及change函数增加同名形参。
- public class Example
- {
- String str = new String("good");
- char[] ch = {'a','b','c'};
- int num = 9;
- public static void main(String[] args)
- {
- Example ex = new Example();
- ex.change(ex.str, ex.ch,ex.num);
- System.out.print(ex.str+"......and.....");
- System.out.println(ex.ch);
- System.out.println(ex.num);
- }
- public void change(String str,char ch[],int num)
- {
- str = "test ok";
- ch[0]='g';
- num = 11;
- }
- }
复制代码 2.关于值传递和引用传递的说法。查过资料说,String是对象类型,但有值传递的特征。我的理解是,同样如代码段四。这里是不是可以这么理解,具有值传递特征的变量才会出现局部变量和成员变量的问题。
3.如代码段五。这一段不需要任何解释了。结合上面一条说法,大家可以自己思考下。
******代码段五- class Person
- {
- String name;
- int age;
- Person(String name,int age)
- {
- this.name = name;
- this.age = age;
- }
- }
复制代码 最后,我觉得可以这样分析这道面试题(有错之处欢迎跟帖纠正):
因为String类以及Stirng类几乎所有成员变量都被final修饰,所以String是不可变的,因此String虽然是对象,但有值传递的特征。在java中,具有值传递特征的变量,当函数的形参与成员变量同名时,可以使用this来区分。这里change函数里没有添加this,所以结果为good gbc。(回答的是不是有点猛啊
,但我觉得回答的知识面越宽,越是有好处的)关于String的各种变种题目,我觉得只要透彻理解以上几点。什么变种都没关系了。 |