锁定老帖子 主题:一道郁闷的面试题
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-06-18
lirong1978sdo 写道 JAVA最终还是传值的吧. 我想问 一下,计算机除了值以外还能传什么?电子么?
|
|
返回顶楼 | |
发表时间:2007-06-24
楼主面试的哪家公司?
|
|
返回顶楼 | |
发表时间:2007-06-24
关于这个问题,我做过test,得出了这样的结论:
一个对象包含四个方面:reference的内存地址、reference的内存内容、对象值的内存地址、对象值的内存内容。 reference指向对象的含义:reference的内存内容即对象值的内存地址。 当对象作为参数被传送给方法时,传的不是reference本身,而是reference的内存内容,即对象值的内存地址,方法被调用时,复制一份新的reference,指向传入的对象值。如果在方法内改变了对象值,那么方法外的对象也即改变了;如果在方法内将方法参数的reference指向新的对象,方法外的reference仍是指向原来的对象,并没有指向方法内的那个新对象,这时此方法内外参数已经完全失去联系。 至于是值传递还是引用传递,就看这两个词怎么定义了。 |
|
返回顶楼 | |
发表时间:2007-07-03
ddandyy 写道 很简单 你做一个test好了
不要让他把值return回来 做一个void方法 把map给他 然后在方法里改变 你在外面会看到map的值有变化 这就是因为给他的只是这个map的引用 如果是值传 外面的map应该不变吧 另外说明 基本类型是值传 你传一个String过去 如果不return的话 外面的String是不会变的 赞同对象是引用传递,基本类型是值传递 String也是对象,不是基本类型,是引用传递的,所以上面String的例子解释是错误的,虽然效果的确是那样. 上面引用的String的例子,为什么外面的String不会改变?按道理说String作为对象是引用传递的.这里面有一条规则,我想在javaeye上很多人包括一些比较牛的达人也未必很清楚: 对象传递到方法中时,实际上是传递的这个对象的引用,在方法内可以改变这个引用所指向的那个对象的属性,无论这些属性是基本类型还是对象,但是不能改变引用本身,不能使该引用指向一个新的对象. 因此,在方法内改变String,无外乎两种方式,用等号直接赋值,或者用new String方法 String s1="XXX"; String s2=new String("YYY"); 这两种方法都会使之前的引用指向另一个对象,不符合前面的规则,因此在方法外面看到String不会改变.(关于这两种方法有很多探讨,这里不多说) 改用StringBuffer,方法内操作append方法,测试结果一目了然. |
|
返回顶楼 | |
发表时间:2007-07-03
JavaInActoin 写道 关于这个问题,我做过test,得出了这样的结论:
一个对象包含四个方面:reference的内存地址、reference的内存内容、对象值的内存地址、对象值的内存内容。 reference指向对象的含义:reference的内存内容即对象值的内存地址。 当对象作为参数被传送给方法时,传的不是reference本身,而是reference的内存内容,即对象值的内存地址,方法被调用时,复制一份新的reference,指向传入的对象值。如果在方法内改变了对象值,那么方法外的对象也即改变了;如果在方法内将方法参数的reference指向新的对象,方法外的reference仍是指向原来的对象,并没有指向方法内的那个新对象,这时此方法内外参数已经完全失去联系。 至于是值传递还是引用传递,就看这两个词怎么定义了。 这样解释比较合理 |
|
返回顶楼 | |
发表时间:2007-07-05
saturn 写道: 昨天去一家公司面试,面试了这样一道java题 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 我的答案是:值传递 但是,面试官说他是 引用传递 但是我在搜索google看到: 46、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 对了,忘了,还有一道: 能不能有一个char类型的变量来存放一个中文字??
不知道那些认为是引用传递的人能明白不? 说白了!引用就是一个内存地址,引用的地址的是有一个值! |
|
返回顶楼 | |
发表时间:2007-07-11
曾经面试的时候也遇到过被问过,大致上好像是这样问的,java中对象在参数传递按什么传递的?
我的回答是,传递句柄 面试官追问,那么是按值传递还是引用传递? 我知道他想要的答案是值传递,既然都说了传递句柄,我坚持说按引用传递,我也知道,说出来以后,他认为我的答案不对,而且露出一丝轻蔑 这个问题,确实很绕口。引用,句柄,都是地址吧,是不是按引用传递?我也以这个意思简单解释了几句。 做个简单的实验 public class Test1 { private int value = 0; public int getValue() { return value; } public void setValue(int value) { this.value = value; } public static void invokeMethod(Test1 t) { t.setValue(2); System.out.print(t.getValue() + " "); System.out.println(t); } /** * @param args */ public static void main(String[] args) { Test1 t = new Test1(); t.setValue(1); System.out.print(t.getValue() + " "); System.out.println(t); invokeMethod(t); System.out.print(t.getValue() + " "); System.out.println(t); } } ---------------- 1 Test1@de6ced 2 Test1@de6ced 2 Test1@de6ced 指向地址同一个. 值传递,借用下面这段例子应该有助于理解 public class Test3 { private static void invokeMethod(StringBuffer s1,StringBuffer s2) { System.out.println("1: "+s1); System.out.println("2: "+s2); s2=s1; s1=new StringBuffer("s1new"); System.out.println("3: "+s1); System.out.println("4: "+s2); s1.append("s1append"); s2.append("s2append"); } /** * @param args */ public static void main(String[] args) { StringBuffer s1= new StringBuffer("s1"); StringBuffer s2=new StringBuffer("s2"); invokeMethod(s1,s2); System.out.println("5: "+s1); System.out.println("6: "+s2); } } ----------------------------- 1: s1 2: s2 3: s1new 4: s1 5: s1s2append 6: s2 |
|
返回顶楼 | |
发表时间:2007-07-13
punkberry 写道: saturn 写道: 昨天去一家公司面试,面试了这样一道java题 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 我的答案是:值传递 但是,面试官说他是 引用传递 但是我在搜索google看到: 46、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 对了,忘了,还有一道: 能不能有一个char类型的变量来存放一个中文字??
不知道那些认为是引用传递的人能明白不? 说白了!引用就是一个内存地址,引用的地址的是有一个值! punkberry说的没错,面试官水平有问题,呵呵! |
|
返回顶楼 | |
发表时间:2007-07-16
受不了了。越看越糊涂。怪不得说与臭棋篓子下棋越下越臭。
传值与传引用就是指是否产生参数附本。传值是传递一个完全一样的副本,不会改变原来的内容,传引用是指传递参数的地址。基本类型(byte,boolean,char,short,int,long,float,double)传值,对象类型(相对于基本类型)传引用。 liquidthinker说的对,虽然传递的是参数地址,但无法改变该地址,这很区别于C的pointer,所以Java里面就叫传引用而不是传地址(引用可以看作对象地址的一个副本)。这解释了Integer或String这种类型无法改变自身的值的原因。 测试一下。 package example; public class TestRef { static Abc anotherAbc = new Abc("this is another object of Abc") ; public static void change(Abc abc) { abc.setStr("be changed") ; } public static void change (Abc abc, int foo){ abc = anotherAbc ; } public static void change(String s) { s = "string has been changed" ; } /** * @param args */ public static void main(String[] args) { Abc abc = new Abc("foo1") ; //the property of abc can be changed change(abc) ; System.out.println (abc.getStr()) ; //result: "be changed" Abc abc2 = new Abc("foo2"); //the address of abc2 can't be changed change(abc2, 0) ; System.out.println (abc2.getStr()) ; //result: "foo2" String s = "foo3" ; //the value of s can't be changed change (s) ; System.out.println (s ) ; //result: "foo3" } } class Abc { private String str ; public Abc (String s){ this.str = s; } public String getStr() { return str; } public void setStr(String str) { this.str = str; } } //Console: be changed foo2 foo3 |
|
返回顶楼 | |
发表时间:2007-07-27
我已经好像清晰、貌似明白了!
|
|
返回顶楼 | |