论坛首页 招聘求职论坛

一道郁闷的面试题

浏览 33059 次
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-06-18  
lirong1978sdo 写道
  JAVA最终还是传值的吧.
我想问 一下,计算机除了值以外还能传什么?电子么?
0 请登录后投票
   发表时间:2007-06-24  
楼主面试的哪家公司?
0 请登录后投票
   发表时间:2007-06-24  
关于这个问题,我做过test,得出了这样的结论:
一个对象包含四个方面:reference的内存地址、reference的内存内容、对象值的内存地址、对象值的内存内容。
reference指向对象的含义:reference的内存内容即对象值的内存地址。

当对象作为参数被传送给方法时,传的不是reference本身,而是reference的内存内容,即对象值的内存地址,方法被调用时,复制一份新的reference,指向传入的对象值。如果在方法内改变了对象值,那么方法外的对象也即改变了;如果在方法内将方法参数的reference指向新的对象,方法外的reference仍是指向原来的对象,并没有指向方法内的那个新对象,这时此方法内外参数已经完全失去联系。

至于是值传递还是引用传递,就看这两个词怎么定义了。
0 请登录后投票
   发表时间: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方法,测试结果一目了然.
0 请登录后投票
   发表时间:2007-07-03  
JavaInActoin 写道
关于这个问题,我做过test,得出了这样的结论:
一个对象包含四个方面:reference的内存地址、reference的内存内容、对象值的内存地址、对象值的内存内容。
reference指向对象的含义:reference的内存内容即对象值的内存地址。

当对象作为参数被传送给方法时,传的不是reference本身,而是reference的内存内容,即对象值的内存地址,方法被调用时,复制一份新的reference,指向传入的对象值。如果在方法内改变了对象值,那么方法外的对象也即改变了;如果在方法内将方法参数的reference指向新的对象,方法外的reference仍是指向原来的对象,并没有指向方法内的那个新对象,这时此方法内外参数已经完全失去联系。

至于是值传递还是引用传递,就看这两个词怎么定义了。




这样解释比较合理
0 请登录后投票
   发表时间:2007-07-05  

saturn 写道:

昨天去一家公司面试,面试了这样一道java题

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

我的答案是:值传递

但是,面试官说他是 引用传递

但是我在搜索google看到:

     46、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。

对了,忘了,还有一道:

能不能有一个char类型的变量来存放一个中文字??





传递的是一个对象的引用的地址的这个值!!

不知道那些认为是引用传递的人能明白不?

说白了!引用就是一个内存地址,引用的地址的是有一个值!

0 请登录后投票
   发表时间: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


0 请登录后投票
   发表时间:2007-07-13  

punkberry 写道:

saturn 写道:

昨天去一家公司面试,面试了这样一道java题

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

我的答案是:值传递

但是,面试官说他是 引用传递

但是我在搜索google看到:

     46、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。

对了,忘了,还有一道:

能不能有一个char类型的变量来存放一个中文字??





传递的是一个对象的引用的地址的这个值!!

不知道那些认为是引用传递的人能明白不?

说白了!引用就是一个内存地址,引用的地址的是有一个值!





punkberry说的没错,面试官水平有问题,呵呵!
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间:2007-07-27  
我已经好像清晰、貌似明白了!
0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics