`
saturn
  • 浏览: 61326 次
  • 性别: Icon_minigender_1
  • 来自: 修真界
社区版块
存档分类
最新评论

一道郁闷的面试题

    博客分类:
  • java
阅读更多

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

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

我的答案是:值传递

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

但是我在搜索google看到:

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

对了,忘了,还有一道:

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

分享到:
评论
53 楼 haoyunlyh 2007-08-08  
没什么意思!只要知道传的是什么就行了!传得是这个对象“地址”
地址是用什么来表示呢?是值啊!所以有人说它是传值。可这个对象的"地址"它还有另一个名字叫引用!
   你说它倒底是值,还是引用呢!都对吧!你只要解释说清楚了!就行了!如果直接说是值还是引用,说不清的
52 楼 Jameslyy 2007-08-07  
做个test就是了,看看是值传递还是引用传递,人家应该是想考考你对面向对象概念的理解。
51 楼 ddandyy 2007-08-07  
liquidthinker 写道
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方法,测试结果一目了然.


String的方式不同是因为java里面对string的机制决定的   map的话改里面的值  是直接修改引用指向的地址里面的值的 string不一样  string的引用指向是固定的 比如有一个引用指向 "a" 那么所有 String str = "a" 都会指向这个地址  当在方法内 str = "b" 的时候 是新new一个"b"的地址 然后把引用指过去的  也就是他实际上是换了方法内的引用地址   而方法外还指向原来的  所以外面的string不会变
50 楼 carmansky 2007-08-07  
这是文字游戏,精确的解释应该是这样的:
JAVA中,对象做参数,实际传递的是"这个对象引用的值",其实这个是基本功了.注意绝对不是简单的引用.
看过Think In Java的人都应该能理解到.因为这里的引用其实与C/C++的引用是不太一样的.
49 楼 xiaojunjava 2007-07-27  
我已经好像清晰、貌似明白了!
48 楼 metaphy 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
47 楼 zqrain 2007-07-13  
<br/>
<strong>punkberry 写道:</strong><br/>
<div class='quote_div'><br/>
<strong>saturn 写道:</strong><br/>
<div class='quote_div'>
<p>昨天去一家公司面试,面试了这样一道java题</p>
<p>当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?</p>
<p>我的答案是:值传递</p>
<p>但是,面试官说他是 引用传递</p>
<p>但是我在搜索google看到:</p>
<p><font> <font> <font> <font> <font> 46、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? <br/>
是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。<br/>
</font></font></font></font></font></p>
<p><font><font><font><font><font>对了,忘了,还有一道:</font></font></font></font></font></p>
<p><font><font><font><font><font>能不能有一个char类型的变量来存放一个中文字??</font></font></font></font></font></p>
</div>
<p><br/>
<br/>
<br/>
<br/>
传递的是一个对象的引用的地址的这个值!!</p>
<p>不知道那些认为是引用传递的人能明白不?</p>
<p>说白了!引用就是一个内存地址,引用的地址的是有一个值!</p>
</div>
<br/>
<br/>
<br/>
<br/>
punkberry说的没错,面试官水平有问题,呵呵!<img src='/javascripts/fckeditor/editor/images/smiley/msn/thumbs_down.gif' alt=''/>
46 楼 出门请戴口罩 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


45 楼 punkberry 2007-07-05  
<br/>
<strong>saturn 写道:</strong><br/>
<div class='quote_div'>
<p>昨天去一家公司面试,面试了这样一道java题</p>
<p>当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?</p>
<p>我的答案是:值传递</p>
<p>但是,面试官说他是 引用传递</p>
<p>但是我在搜索google看到:</p>
<p><font> <font> <font> <font> <font> 46、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? <br/>
是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。<br/>
</font></font></font></font></font></p>
<p><font><font><font><font><font>对了,忘了,还有一道:</font></font></font></font></font></p>
<p><font><font><font><font><font>能不能有一个char类型的变量来存放一个中文字??</font></font></font></font></font></p>
</div>
<p><br/>
<br/>
<br/>
<br/>
传递的是一个对象的引用的地址的这个值!!</p>
<p>不知道那些认为是引用传递的人能明白不?</p>
<p>说白了!引用就是一个内存地址,引用的地址的是有一个值!</p>
44 楼 liquidthinker 2007-07-03  
JavaInActoin 写道
关于这个问题,我做过test,得出了这样的结论:
一个对象包含四个方面:reference的内存地址、reference的内存内容、对象值的内存地址、对象值的内存内容。
reference指向对象的含义:reference的内存内容即对象值的内存地址。

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

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




这样解释比较合理
43 楼 liquidthinker 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方法,测试结果一目了然.
42 楼 JavaInActoin 2007-06-24  
关于这个问题,我做过test,得出了这样的结论:
一个对象包含四个方面:reference的内存地址、reference的内存内容、对象值的内存地址、对象值的内存内容。
reference指向对象的含义:reference的内存内容即对象值的内存地址。

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

至于是值传递还是引用传递,就看这两个词怎么定义了。
41 楼 dreamer_0924 2007-06-24  
楼主面试的哪家公司?
40 楼 抛出异常的爱 2007-06-18  
lirong1978sdo 写道
  JAVA最终还是传值的吧.
我想问 一下,计算机除了值以外还能传什么?电子么?
39 楼 lirong1978sdo 2007-06-18  
  JAVA最终还是传值的吧.
38 楼 fkpwolf 2007-06-16  
java都是引用传递。
所谓的Integer, String也是的,只是这些的对象的值不能改而已,没有setValue之类的方法。JVM不可能区别对待的
37 楼 huangtut 2007-06-15  
文字游戏而已,只要记住java传的对象传的都是内存地址就可以了,这样回答我想面试官应该会满意的。
36 楼 likeblood 2007-06-14  
一个叫法而已,别在抠字眼了,我只知道传递的是被复制的,不过是原始类型还是对象的引用,知道这个写程序就不会有误,足够了
35 楼 lszone 2007-06-12  
说传值那是在扣字眼,有意思吗?我不知道引用也是一个值?这个概念产生就是用来区分这两种传递方式,非要较一下劲有意思吗?显得你高深些?
34 楼 lszone 2007-06-12  
你可以理解对象就是一台台电视,而引用就是遥控器,java中是遥控器传来传去,而不是电视机在传来传去,拿到了遥控器就可以操作电视机,一个是放在stack里的,一个是放在heap里的

相关推荐

    一道关于项目整合的面试题

    一道关于项目整合的面试题

    企业公司软件测试面试笔试题集合 软件测试面试题

    企业公司软件测试面试笔试题集合 软件测试面试题 (测试基础).doc 01_企业面试试卷(综合).doc 01_企业面试试卷(综合)_参考答案.doc 04_企业面试试卷(测试基础).doc 04_企业面试试卷(测试基础)_参考答案.doc...

    一道微软数据库面试题

    根据题目提供的信息,这是一道涉及SQL查询技巧的微软数据库面试题。虽然题目中的SQL代码与题目描述不完全对应,但我们可以基于题目描述中的信息来分析这个问题并给出解答。 ### 题目背景 题目描述指出,有一个表,...

    一道腾讯面试题

    这道2011年腾讯校招的面试题虽然没有明确的问题描述,但从标签中我们可以推测,它可能涉及C++、.NET、Java这三种编程语言中的某一方面,或者是关于算法设计与分析。面试题通常旨在考察候选人的思维能力、编程基础...

    一道经典的前台程序员面试题

    这道"经典的前台程序员面试题"显然关注的是前端布局技术,特别是使用DIV和CSS来构建网页结构。这里,我们重点讨论这个话题,并通过提供的压缩包文件名暗示的可能内容进行深入探讨。 首先,让我们理解`DIV`元素。在...

    笔试面试题 一道面试题关于信息系统的问答和注意事项

    笔试面试题 一道面试题关于信息系统的问答和注意事项 【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的...

    一道月工资三万的面试题

    根据给定的信息,我们可以推断出这是一道与算法相关的面试题目。虽然提供的部分内容看起来较为混乱,但结合标题、描述及标签,我们可以尝试解析并构建一个相对完整的算法问题。 ### 题目背景 一家知名公司在招聘...

    一道asp.net c#面试题

    在这个面试题中,我们看到的是一个典型的"观察者模式"(Observer Pattern)的应用。观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知...

    js面试题面试题面试题

    根据给定的文件信息,以下是对每一道JS面试题的知识点进行详细解析: ### 第一题:编写一个方法求一个字符串的字节长度 #### 解析: 在这道题目中,我们需要编写一个函数来计算字符串的字节长度。这里的重点在于...

    一道关于Ajax、Jquery的面试题

    针对这道面试题,可能的问题方向包括: 1. **Ajax的基本工作原理**:解释Ajax是如何通过XMLHttpRequest对象实现异步通信的,涉及的步骤包括创建对象、打开连接、设置请求方法、发送请求、接收响应和处理数据。 2. ...

    【大厂面试题】史上最详细的一线大厂前端面试题详解及其答案

    【大厂面试题】史上最详细的一线大厂前端面试题详解及其答案 目录: 1、如何避免CDN为PC端缓存移动端页面 2、响应式开发剖析 3、页面渲染原理剖析 4、HTTPS工作流程 5、js防抖和节流剖析 6、js解决获取浏览器的唯一...

    整理C#面试题10套

    "C#面试题10套" 本资源摘要信息涵盖了C#面试题10套,涵盖了C#、.NET、面试题等知识点,详细解释了每一个问题和答案。 问题一: 密码问题,涉及到逻辑思维和规则应用。问题中给出了五个字母K、L、M、N、O,要求在...

    算法面试题实用知识库分享

    这个问题是算法面试题中的一道经典题目,开发者需要掌握这个问题的解决方法。 算法笔记_面试题_2.移动零 本篇笔记主要介绍了移动零问题的解决方法,包括问题分析、解决方法等。这个问题是算法面试题中的一道常见...

    一道面试题的思考

    《一道面试题的思考——深入理解memcpy函数的实现》 在C语言中,`memcpy`函数是一个非常重要的内存操作函数,用于将一块内存区域的数据复制到另一块内存区域。在面试中,这个问题常用来测试候选人的基础知识、逻辑...

    qiubaiying#qiubaiying.github.io#2017-12-26-从一道网易面试题浅谈-Tagged-Poi

    前言这篇博客九月就想写了,因为赶项目拖了到现在,抓住17年尾巴写吧~正文上次看了一篇 《从一道网易面试题浅谈OC线程安全》 的博客,主要内容是:作者去网易面试,

    一道企业面试题----兔子问题

    假如你现在有一只小兔子,第四年的时候开始生小兔,以后每年生一只,假设生的都是母兔。请问第N年的时候你有多少兔子

    cocos2d-x 一道简单面试题,触摸事件的重新分发

    本文通过一道面试题来探讨如何有效地管理和控制触摸事件,尤其是在多层界面交互的情况下。题目是:“当弹出一个新窗口时,如何屏蔽掉下面层的触摸事件?”这个问题涉及到对cocos2d-x触摸事件系统的基本理解和应用。 ...

    java截取字符串程序,一道面试题。答案

    java截取字符串,一道面试题。好像没有找到正确答案,今天找时间做了一个,仅供参考。本人运行过了。

    从一道面试题谈linux下fork的运行机制

    从一道面试题深入探讨Linux下fork的运行机制 在Linux操作系统中,`fork()`系统调用是进程管理的核心功能之一,它允许一个已存在的进程创建一个新的进程,即子进程。子进程几乎完全复制父进程的状态,包括内存映像、...

Global site tag (gtag.js) - Google Analytics