一道JAVA面试题的困惑

J2EE 码拜 7年前 (2015-05-10) 629次浏览 0个评论
 

public class Test {
 public static void main(String[] args) {
String a =”A”;
String  b =”B”;
operate(a,b);
System.out.println(a+”,”+b);
}
 static  void  operate(String  x, String y){
 y+=x;
 y=x;
 }
}
结果是啥啊 为啥

结果肯定是:A,B啊
operate(a,b);方法只是调用了,并未给a,b变量赋值方法里面替换的值!所以还是原来的值咯
这个问题的关键是考察 string是不可变的吧
考的字符串的不变性。
传递参数给operate的时候传的是”A”,”B”的引用,此时如果“A”,或者“B”值改变,例如变为了“D”,“F”等,a,b由于指向其应随之改变。
但是字符串比较特殊,其值不会改变,而是重新创建一个值复制给传入的引用。a,b指向的位置的值还是不变的。
引用 3 楼 t_jl1979 的回复:

考的字符串的不变性。
传递参数给operate的时候传的是”A”,”B”的引用,此时如果“A”,或者“B”值改变,例如变为了“D”,“F”等,a,b由于指向其应随之改变。
但是字符串比较特殊,其值不会改变,而是重新创建一个值复制给传入的引用。a,b指向的位置的值还是不变的。

不是这么解释的吧!
原因在于静态方法,operate(a,b);  和static  void  operate(String  x, String y),a和b实参传递到 x,y ,a的值和X的值是一样的,b的值和y的值是一样的,
由于静态方法,系统空间对于相同内容的变量是不会申请内存空间的,而是共用同一个内存空间,所有在x,y改变时a,b也跟着改变

String这个类比较特殊的,它是不变字串,任何试图修改对象的操作都会制作一份本地的副本,然后在副本上修改,返回副本。
在eclipse上运行的结果是A,B,所以直接试才知道结果
引用 4 楼 lkt19911025 的回复:
Quote: 引用 3 楼 t_jl1979 的回复:

考的字符串的不变性。
传递参数给operate的时候传的是”A”,”B”的引用,此时如果“A”,或者“B”值改变,例如变为了“D”,“F”等,a,b由于指向其应随之改变。
但是字符串比较特殊,其值不会改变,而是重新创建一个值复制给传入的引用。a,b指向的位置的值还是不变的。

不是这么解释的吧!
原因在于静态方法,operate(a,b);  和static  void  operate(String  x, String y),a和b实参传递到 x,y ,a的值和X的值是一样的,b的值和y的值是一样的,
由于静态方法,系统空间对于相同内容的变量是不会申请内存空间的,而是共用同一个内存空间,所有在x,y改变时a,b也跟着改变

这个么,你试下改为非静态方法,再执行下,看看结果是否改变,就知道了。

难道不是A,B?
结果是A,B。

此题考查的是JAVA的参数传递和String数据类型。

JAVA中传递给方法的参数,如果是基本类型,那么实际上传递进方法的就是这个参数的“拷贝”,无论你在该方法中对该参数做了怎样的改变,这些改变都不会反馈到传递前的定义;如果是引用类型(对象),则实际上传递到方法中的是是这个对象的引用,在方法体中对这个参数对象中的值做改变的话,是会反馈到方法体外的。

String 比较特殊,他是引用类型但是在作为参数传递的时候表现出来的却是基本类型的特性,即在方法中改变了String类型的变量的值后,不会影响方法外的String变量的值。所以这个地方的结果A,B。

考察的是不同作用域变量有效性 operate方法内局部变量的操作并不影响外部变量。除非你传参是地址,才会影响到
引用 10 楼 abc8617166 的回复:

考察的是不同作用域变量有效性 operate方法内局部变量的操作并不影响外部变量。除非你传参是地址,才会影响到

因此答案是A,B

20分
10楼以上全错!全都打屁屁!

这面试题出的也操蛋!看不出是考察啥的!

首先,java always passes argument to function by value…,java函数参数是传值的!你不用string,随便换个class试试?看你能改变传入参数本身的值吗?

其次,string的常量性也不是这么解释的。。。

java版的人都哪去了,弄的我这个水园的出来科普!

引用 12 楼 micropentium6 的回复:

10楼以上全错!全都打屁屁!

这面试题出的也操蛋!看不出是考察啥的!

首先,java always passes argument to function by value…,java函数参数是传值的!你不用string,随便换个class试试?看你能改变传入参数本身的值吗?

其次,string的常量性也不是这么解释的。。。

java版的人都哪去了,弄的我这个水园的出来科普!

好腻害,好崇拜你哦

尼玛,随便暴露一下实力揍被你发现了!

大妹子,最近可好阿?

引用 13 楼 weimochengxi 的回复:
Quote: 引用 12 楼 micropentium6 的回复:

10楼以上全错!全都打屁屁!

这面试题出的也操蛋!看不出是考察啥的!

首先,java always passes argument to function by value…,java函数参数是传值的!你不用string,随便换个class试试?看你能改变传入参数本身的值吗?

其次,string的常量性也不是这么解释的。。。

java版的人都哪去了,弄的我这个水园的出来科普!

好腻害,好崇拜你哦

引用 14 楼 micropentium6 的回复:

尼玛,随便暴露一下实力揍被你发现了!

大妹子,最近可好阿?

Quote: 引用 13 楼 weimochengxi 的回复:
Quote: 引用 12 楼 micropentium6 的回复:

10楼以上全错!全都打屁屁!

这面试题出的也操蛋!看不出是考察啥的!

首先,java always passes argument to function by value…,java函数参数是传值的!你不用string,随便换个class试试?看你能改变传入参数本身的值吗?

其次,string的常量性也不是这么解释的。。。

java版的人都哪去了,弄的我这个水园的出来科普!

好腻害,好崇拜你哦

还好啊,无所事事,世事无常

结果是:A,B
对字符串类型的修改,字符串赋值得到的是新到字符串,所以调用方法并没有改变原字符串的值。
“A,B” java只有值传递,函数里的是拷贝
我真不知道该怎么说啊???怎么我面试的时候总没有这种题啊???
没有我的日子寂寞吧?

我说你新换的这个头像很清纯的样子,不能是本人吧?

引用 15 楼 weimochengxi 的回复:
Quote: 引用 14 楼 micropentium6 的回复:

尼玛,随便暴露一下实力揍被你发现了!

大妹子,最近可好阿?

Quote: 引用 13 楼 weimochengxi 的回复:
Quote: 引用 12 楼 micropentium6 的回复:

10楼以上全错!全都打屁屁!

这面试题出的也操蛋!看不出是考察啥的!

首先,java always passes argument to function by value…,java函数参数是传值的!你不用string,随便换个class试试?看你能改变传入参数本身的值吗?

其次,string的常量性也不是这么解释的。。。

java版的人都哪去了,弄的我这个水园的出来科普!

好腻害,好崇拜你哦

还好啊,无所事事,世事无常

总是看有人说java只有值传递,我不太明白

A a = new A();
A b = a;  //引用传递
A c = new A();
c=a;    //值传递
对不对?

我看了前面几楼也觉得前面几楼说的是错的 不是什么字符串不可变   问题是 跟operate()方法没有关系  只是传值给这个方法  a,b的值没有变啊  除非operate方法 比如return 一个a  然后 主方法里面 a=operate(a,b) 这样 a才会变
就没人先实践一下吗? 我不知道对不对,下面是我的愚见:

	static void operator(String c, String d){
		System.out.println("c的内存地址: "+System.identityHashCode(c)+"  d的内存地址:"+System.identityHashCode(d));
		c += d;
		d = c;
		System.out.println("c的内存地址: "+System.identityHashCode(c)+"  d的内存地址:"+System.identityHashCode(d));
	}

	public static void main(String[] args){
		String a = "A";
		String b = "B";
		//a += b;
		System.out.println("a的内存地址:"+System.identityHashCode(a)+"  b的内存地址:"+System.identityHashCode(b));
		operator(a,b);
		System.out.println("a的内存地址:"+System.identityHashCode(a)+"  b的内存地址:"+System.identityHashCode(b));
	}
	/*
	 * output:
	 * a的内存地址: 689406593   b的内存地址:1182332986
	 * c的内存地址: 689406593   d的内存地址:1182332986
     * c的内存地址: 804310011   d的内存地址:804310011
     * a的内存地址: 689406593   b的内存地址:1182332986
     * 
     * #看上面已经看懂的人,请忽略下面解释#
     * 
	 * 为什么结果是 A B 呢? 这和值传递应该没半毛钱关系吧吧吧!
	 * 首先   String是引用类型,又是不可变类。
	 * 其次   a本质是什么?b本质是什么?是指向对象的变量好吗,又不是对象本身!(理解这个,基本上就知道为什么结果还是A B了)
	 * 所以   通过operator(a,b)操作后,变量c指向了a指向的对象的内存地址,d指向了b指向的对象的内存地址。
	 * 
	 * 再者  不可变类的意思不是说c += d 或者 d = c 这样不行,完全不是这样理解的吧吧吧!
	 * c += d 操作结果是让c指向一个新的对象的内存地址(该对象值是原先c所指向的对象值+d所指向对象值)
	 * d = c 这个就是让d指向c对象的内存地址
	 * 
	 * 
	 * 到这里应该差不多能理解了吧
	 * 
	 * 再不行,上图了:
	 * */

一道JAVA面试题的困惑

个人愚见,如有不同,那又怎样~~

引用 19 楼 micropentium6 的回复:

没有我的日子寂寞吧?

我说你新换的这个头像很清纯的样子,不能是本人吧?

Quote: 引用 15 楼 weimochengxi 的回复:
Quote: 引用 14 楼 micropentium6 的回复:

尼玛,随便暴露一下实力揍被你发现了!

大妹子,最近可好阿?

Quote: 引用 13 楼 weimochengxi 的回复:
Quote: 引用 12 楼 micropentium6 的回复:

10楼以上全错!全都打屁屁!

这面试题出的也操蛋!看不出是考察啥的!

首先,java always passes argument to function by value…,java函数参数是传值的!你不用string,随便换个class试试?看你能改变传入参数本身的值吗?

其次,string的常量性也不是这么解释的。。。

java版的人都哪去了,弄的我这个水园的出来科普!

好腻害,好崇拜你哦

还好啊,无所事事,世事无常

不是啊,是我女朋友

我擦~,原来你是拉拉!

引用 23 楼 weimochengxi 的回复:
Quote: 引用 19 楼 micropentium6 的回复:

没有我的日子寂寞吧?

我说你新换的这个头像很清纯的样子,不能是本人吧?

Quote: 引用 15 楼 weimochengxi 的回复:
Quote: 引用 14 楼 micropentium6 的回复:

尼玛,随便暴露一下实力揍被你发现了!

大妹子,最近可好阿?

Quote: 引用 13 楼 weimochengxi 的回复:
Quote: 引用 12 楼 micropentium6 的回复:

10楼以上全错!全都打屁屁!

这面试题出的也操蛋!看不出是考察啥的!

首先,java always passes argument to function by value…,java函数参数是传值的!你不用string,随便换个class试试?看你能改变传入参数本身的值吗?

其次,string的常量性也不是这么解释的。。。

java版的人都哪去了,弄的我这个水园的出来科普!

好腻害,好崇拜你哦

还好啊,无所事事,世事无常

不是啊,是我女朋友

引用 24 楼 micropentium6 的回复:

我擦~,原来你是拉拉!

Quote: 引用 23 楼 weimochengxi 的回复:
Quote: 引用 19 楼 micropentium6 的回复:

没有我的日子寂寞吧?

我说你新换的这个头像很清纯的样子,不能是本人吧?

Quote: 引用 15 楼 weimochengxi 的回复:
Quote: 引用 14 楼 micropentium6 的回复:

尼玛,随便暴露一下实力揍被你发现了!

大妹子,最近可好阿?

Quote: 引用 13 楼 weimochengxi 的回复:
Quote: 引用 12 楼 micropentium6 的回复:

10楼以上全错!全都打屁屁!

这面试题出的也操蛋!看不出是考察啥的!

首先,java always passes argument to function by value…,java函数参数是传值的!你不用string,随便换个class试试?看你能改变传入参数本身的值吗?

其次,string的常量性也不是这么解释的。。。

java版的人都哪去了,弄的我这个水园的出来科普!

好腻害,好崇拜你哦

还好啊,无所事事,世事无常

不是啊,是我女朋友

不好吗,看你特失望

我无所谓啊,你随意好了!

引用 25 楼 weimochengxi 的回复:
Quote: 引用 24 楼 micropentium6 的回复:

我擦~,原来你是拉拉!

Quote: 引用 23 楼 weimochengxi 的回复:
Quote: 引用 19 楼 micropentium6 的回复:

没有我的日子寂寞吧?

我说你新换的这个头像很清纯的样子,不能是本人吧?

Quote: 引用 15 楼 weimochengxi 的回复:
Quote: 引用 14 楼 micropentium6 的回复:

尼玛,随便暴露一下实力揍被你发现了!

大妹子,最近可好阿?

Quote: 引用 13 楼 weimochengxi 的回复:
Quote: 引用 12 楼 micropentium6 的回复:

10楼以上全错!全都打屁屁!

这面试题出的也操蛋!看不出是考察啥的!

首先,java always passes argument to function by value…,java函数参数是传值的!你不用string,随便换个class试试?看你能改变传入参数本身的值吗?

其次,string的常量性也不是这么解释的。。。

java版的人都哪去了,弄的我这个水园的出来科普!

好腻害,好崇拜你哦

还好啊,无所事事,世事无常

不是啊,是我女朋友

不好吗,看你特失望

引用 26 楼 micropentium6 的回复:

我无所谓啊,你随意好了!

Quote: 引用 25 楼 weimochengxi 的回复:
Quote: 引用 24 楼 micropentium6 的回复:

我擦~,原来你是拉拉!

Quote: 引用 23 楼 weimochengxi 的回复:
Quote: 引用 19 楼 micropentium6 的回复:

没有我的日子寂寞吧?

我说你新换的这个头像很清纯的样子,不能是本人吧?

Quote: 引用 15 楼 weimochengxi 的回复:
Quote: 引用 14 楼 micropentium6 的回复:

尼玛,随便暴露一下实力揍被你发现了!

大妹子,最近可好阿?

Quote: 引用 13 楼 weimochengxi 的回复:
Quote: 引用 12 楼 micropentium6 的回复:

10楼以上全错!全都打屁屁!

这面试题出的也操蛋!看不出是考察啥的!

首先,java always passes argument to function by value…,java函数参数是传值的!你不用string,随便换个class试试?看你能改变传入参数本身的值吗?

其次,string的常量性也不是这么解释的。。。

java版的人都哪去了,弄的我这个水园的出来科普!

好腻害,好崇拜你哦

还好啊,无所事事,世事无常

不是啊,是我女朋友

不好吗,看你特失望

今天迟到,要被扣钱

你们周日也上班?还让不让人好好日了!

引用 27 楼 weimochengxi 的回复:
Quote: 引用 26 楼 micropentium6 的回复:

我无所谓啊,你随意好了!

Quote: 引用 25 楼 weimochengxi 的回复:
Quote: 引用 24 楼 micropentium6 的回复:

我擦~,原来你是拉拉!

Quote: 引用 23 楼 weimochengxi 的回复:
Quote: 引用 19 楼 micropentium6 的回复:

没有我的日子寂寞吧?

我说你新换的这个头像很清纯的样子,不能是本人吧?

Quote: 引用 15 楼 weimochengxi 的回复:
Quote: 引用 14 楼 micropentium6 的回复:

尼玛,随便暴露一下实力揍被你发现了!

大妹子,最近可好阿?

Quote: 引用 13 楼 weimochengxi 的回复:
Quote: 引用 12 楼 micropentium6 的回复:

10楼以上全错!全都打屁屁!

这面试题出的也操蛋!看不出是考察啥的!

首先,java always passes argument to function by value…,java函数参数是传值的!你不用string,随便换个class试试?看你能改变传入参数本身的值吗?

其次,string的常量性也不是这么解释的。。。

java版的人都哪去了,弄的我这个水园的出来科普!

好腻害,好崇拜你哦

还好啊,无所事事,世事无常

不是啊,是我女朋友

不好吗,看你特失望

今天迟到,要被扣钱

引用 28 楼 micropentium6 的回复:

今天迟到,要被扣钱

唉,休得周五和周六,今天值班,要不然广告漫天飞的


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明一道JAVA面试题的困惑
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!