`

JAVA面试题解惑系列(五)——传了值还是传了引用?

阅读更多
removed.

请到博文下载PDF文件:http://zangweiren.iteye.com/blog/241218
57
13
分享到:
评论
70 楼 朱海宽 2010-10-12  
很想看你的文章,为什么都是removed呢?
在哪里还能看到该文章呢?
69 楼 carfily 2009-06-05  
受益匪浅啊,希望楼主能把解惑系列继续下去
68 楼 flyspider 2009-05-10  
如果真的是传统意义上的引用传递,即ByRef,那么博主给出的例子中引用在方法中被重新赋值的运行结果就不是那样子的了!
JAVA中没有真正的引用传递,传递的全部都是参数的副本(即值),这在很多JAVA大师的著作中均有论述.
67 楼 Ronald9 2008-12-07  
我不知道你们是怎么认为的.

如果你学过C,那么应该是一样的

1.实参总是单向将值传递给形参.

不论是传值也好,传地址也好.只能是单向.只能是实参向形参传.

形参永远,也不可能改变实参的值!

包括你的参数是指针类型


2.既然不能改变实参,但是能改变实参所指向变量的值,即:改变指针变量所指向 的变量的值..

在JAVA实际上就是:  不论你是传基本类型数据还是传引用类型数据.都是单向传递. 你不能改变实参的值,但如果是引用 类型.你可以改变引用变量所指向的对象的值...

这不就完了?
66 楼 luzl 2008-10-21  
 // 为方法参数重新赋值  
    public void change(ParamTest t) {  
        ParamTest tmp = new ParamTest();  
        tmp.num = 9;  
        t = tmp;  
    }  

这段比较难理解,为什么值没有修改呢:
t.change(t);  
System.out.println("运算之后:" + t.num); 

为什么还是零,有朋友告诉我是应为
t.change(t);

时便相当于创建了一个新对象ParamTest t,并且这个对象是指向原来的t,但是当
t = tmp; 
执行时便指向了tmp,相当于这样原来的t还是原来的t,所以还是0,是不是这样呢?
65 楼 iron_wang 2008-10-21  
领教了!谢谢!能加深理解,确实不错!
64 楼 rz_wang 2008-08-11  
不错,加深理解
63 楼 H_eaven 2008-08-05  
传引用还是传值?  Bruce Eckel也认为这个问题没什么意义.
看你的理解了.
我是认为传引用了.
一但进入这个话题,就有一些前提了.
A a = new A();
a       : 是一个引用.
new A() : 是一个值.
引用就相当于C,C++里的指针了,只是它很安全,你可以读它,但不能对它++,--操作.它存在栈里.
new A(),是一个值,一个对象,它存在堆里.
对于我们来说,只能操作像 a 这种栈里的引用,不能操作new A()这种堆里的东西.
所以你认为 a 是一个引用,那就是传引用;
你认为a 是一个值,那就是传值.
也就是你只能传等号前边的,不能传等号后边的.

至于:new A().play(),这种样子..
  这个你只是没有显式给他一个引用,但它仍然有一个匿名引用.

其实我想说一句:传的是栈里的东西.
  也别传值,传引用了.呵呵!
62 楼 狂放不羁 2008-08-03  
无论是传什么,都是传栈上的东西,传基本类型的变量的时候,传的是栈上的值,对于引用类型的变量,传的还是栈上的值,其实都是传值,只所以有传引用和传值之说,是因为有其他语言比如C++等的存在导致,JAVA与C++中的引用是完全不同的概念。
最后一句,JAVA中都是传值的,不要把JAVA中的引用和其他语言的引用混在一起,他们是完全不同的东西。
61 楼 peak 2008-07-28  
用clone的方法就是值传递了
60 楼 臧圩人 2008-07-22  
回复spaceflysky@163.com:
请多多关注,多多支持
59 楼 臧圩人 2008-07-22  
回复rabbitbug:
对,大家对于对象作为参数传递时发生的现象是有共识的,只是在概念上持有不同意见
58 楼 spacefly 2008-07-22  
太感谢您了,我写了1年多java了,现在才搞得这么清楚。。。。
57 楼 abcdos 2008-07-22  
56 楼 rabbitbug 2008-07-22  
吵的这么激烈啊
感觉大家可能只对概念有分歧吧
55 楼 臧圩人 2008-07-17  
回复HenryShanley:

你好,谢谢你的建议!

根据你的建议我已经对文章的结尾做了修改,不过我没有改为JAVA只有值传递的观点。
我在客观地表述了两种观点之后,说出了自己的看法,我希望做到在保持自己立场的同时,不至于误导读者。

PS:我很欣赏你的严谨和负责的态度,呵呵。o(∩_∩)o...
54 楼 臧圩人 2008-07-17  
CJSDN版主HenryShanley写道:
Hi, 臧圩人

Can you take all the comments here in this thread into consideration and modify your existing article if possible? (Because there are quite a lot of misleading and confusing concepts related to pass-by-value and pass-by-reference).

I see your efforts of updating this document, but I am still not happy about the outcome. Nonetheless, those concepts need to be explained in a non-ambiguous way. (some context in the original article is still not intuitive for others). After that, I can give you points according to your update.

Thanks,
Jiafan
53 楼 臧圩人 2008-07-17  
回复dorothyle:

你好。事实上,在引用被作为参数传递给一个方法时,在这个方法体内会发生什么情况,我们是有共识的。唯一的争议只在值传递和引用传递的概念上。

我已经根据CJSDN网友HenryShanley的建议对文章的结尾做了调整,欢迎来我的博客查看最新版本:
http://zangweiren.j a v a e y e.com
52 楼 臧圩人 2008-07-17  
51CTO网友dorothyle写道:

I went to your blog and spent two hours studying your new code and read the passages written by other friends in your blog. And i finally understood what you said, the running result. pass-by-value is the key for java programming. Basic data type's can't be changed inside a method. And reference type's attribute's value can be changed inside a method. But the reference will not be changed forever. Whatever basic data type or reference, only the copy of it to be passed to the method. This is my understand, I am waiting for your instruction.
    For now, i am reading a book written by Y.Daniel Liang, named 'Introduction to Java Programming'. I will continue to try my hard to study. But it is really hard to grasp.
    Thank you again!
51 楼 臧圩人 2008-07-17  
CJSDN版主HenryShanley写道:

臧圩人 写道
回复billgacsli & HenryShanley:

关于值传递和引用传递的问题,我认同Bruce Eckel在《Thinking in Java》第三版中的观点:
In the end, it isn’t that important—what is important is that you understand that passing a reference allows the caller’s object to be changed unexpectedly.



Again, Bruce's sentence is very very misleading. I want to put an end to this topic because it is a trivial issue and it is not that important. (The more critical thing is that you understand it)

The below link shows that Java handles Object by reference but passing them by value.

http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html

相关推荐

    JAVA面试题解惑系列合集

    .22 1.5 JAVA面试题解惑系列(五)——传了值还是传了引用? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .31 1.6 JAVA面试题解惑系列(六)——字符串(String)杂谈 . . . . . . . . . ....

    臧圩人--JAVA面试题解惑系列合集.pdf

    **1.5 JAVA面试题解惑系列(五)——传了值还是传了引用?** - **知识点**:澄清Java中参数传递的机制,即所有参数都是按值传递,但对于对象而言,传递的是指向该对象的引用的值,而非对象本身。 **1.6 JAVA面试题...

    JAVA面试题解惑系列——类的初始化顺序

    总结来说,对于Java面试中常出现的关于类初始化顺序的问题,开发者应当掌握以下几点: 1. 单个类内成员的初始化顺序:静态变量、静态初始化块、变量、初始化块、构造器。 2. 在继承关系中,子类的静态成员会在父类...

    JAVA面试题解惑系列(一)——类的初始化顺序-JAVA程序员JAVA工程师面试必看.pdf,这是一份不错的文件

    JAVA面试题解惑系列(一)——类的初始化顺序 JAVA 是一门面向对象的编程语言,类的初始化顺序是 JAVA 程序员和 JAVA 工程师面试中一个非常重要的知识点。本文将详细讲解类的初始化顺序,并提供了相关的测试代码,...

    JAVA面试题解惑系列(二)——到底创建了几个String对象-JAVA程序员JAVA工程师面试必看.pdf,这是一份不错的文件

    JAVA 面试题解惑系列之 String 对象创建机制 本文将深入探讨 JAVA 中 String 对象的创建机制,解答常见的面试题目,并探索 String 对象池的概念和机制。 一、String 对象的创建方式 在 JAVA 中,String 对象可以...

    JAVA面试题解惑系列.doc

    《JAVA面试题解惑系列——类的初始化顺序》 在Java编程中,理解类的初始化顺序是面试中常见的考察点,因为它直接关系到程序的执行逻辑。本文将深入探讨类的初始化过程,以及在继承场景下如何理解这个过程。 首先,...

    面试题解惑系列(十)——话说多线程

    【标题】:“面试题解惑系列(十)——话说多线程” 【描述】:本篇文章主要探讨的是Java中的多线程概念及其在面试中常见的问题解析。 【标签】:“面试题解惑系列(十)——话说多线程” 【部分内容】:在Java中,多...

    经典JAVA面试题解惑系列合集

    JAVA面试题解惑系列(一)——类的初始化顺序 在Java编程语言中,理解类的初始化顺序是非常重要的,尤其是在涉及继承的情况下。本节将详细介绍类初始化的规则,并通过实例来帮助理解。 ##### 类的初始化顺序规则 ...

    Java面试题详解,和一些基础知识的深入剖析,个人认为非常棒

    “JAVA面试题解惑系列(八)——聊聊基本类型(内置类型)”涵盖了Java的原始数据类型,包括int、char、boolean等,它们与引用类型的不同之处以及它们的默认值和范围。 “JAVA面试题解惑系列(九)——继承、多态、...

    JAVA面试题解惑系列.pdf

    ### Java面试题解惑系列——类的初始化顺序详解 #### 背景介绍 在Java面试过程中,关于类的初始化顺序的问题是常见的考察点之一。此类问题通常涉及到类的加载机制、静态变量与实例变量的区别、初始化块的作用及执行...

    JAVA面试题解惑系列(一)——类的初始化顺序-JAVA程序员JAVA工程师面试必看.pdf

    在面试中,能够清晰地解释这个概念不仅显示了你对Java基础知识的掌握,也体现了你在实际编程中解决问题的能力。所以,对于Java程序员和工程师来说,掌握类的初始化顺序是非常基础且重要的知识点。

    JAVA面试题解惑系列合集.docx

    ### JAVA面试题解惑系列知识点总结 #### 一、类的初始化顺序 **知识点概述:** 在Java中,类的初始化顺序是一个常见的面试问题。它主要涉及到类成员(包括静态和非静态)的加载和初始化过程。理解这些基础知识有助...

    JAVA面试题解惑系列(六)——字符串(String)杂谈[收集].pdf

    Java中的字符串(String)是编程面试中的热门话题,其特性与操作是面试官常常用来考察候选人基础知识的手段。本文将深入探讨String对象的一些关键知识点。 首先,我们要了解`String`类的`length()`方法。这个方法返回...

    ‘’JAVA面试题解惑系列.doc

    《JAVA面试题解惑系列——类的初始化顺序》 在Java面试中,关于类的初始化顺序是一个常见的考点。深入理解这一概念,对于成为一名合格的Java开发者至关重要。在Java中,类的初始化顺序遵循一定的规则,这包括静态...

    JAVA面试题解惑系列by(zangweiren)

    ### JAVA面试题解惑系列——类的初始化顺序 #### 一、基础知识回顾 在Java编程中,类的初始化顺序是一个非常重要的概念,特别是在面试时,它经常被用来考察面试者对于Java类加载机制的理解程度。类的初始化顺序...

    2021最新java面试合集pdf.rar

    JAVA面试题解惑系列.pdf Java面试题(基础).pdf JVM 实用参数系列 - v1.0.pdf JVM与性能优化知识点整理.pdf JVM面试专题.docx JVM面试专题及答案.pdf Linux系统Redis笔记.docx MongoDB学习笔记.docx mybatis原理....

Global site tag (gtag.js) - Google Analytics