Java参数传递的问题

原创 2016年05月31日 20:28:08

有一道题

下列java程序的输出结果为__

public class Example{
    String str=new String("hello");
    char[]ch={'a','b'};
    public static void main(String args[]){
        Example ex=new Example();
        ex.change(ex.str,ex.ch);
        System.out.print(ex.str+" and ");
        System.out.print(ex.ch);
    }
    public void change(String str,char ch[]){
        str="test ok";
        ch[0]='c';
    }
}

A.hello and ab
B.hello and cb
C.hello and a
D.test ok and ab
E.test ok and cb
F.test ok and c

正确答案是B。

JAVA两种数据类型:基本类型和引用类型。 基本类型作为参数传递时是按值传递,方法中使用的是参数的值拷贝,原参数不会得到改变。传递引用类型时的情况颇有争议,目前主要有两种说法:1.Java中只有一种传递的方式即按值传递,引用类型作为参数传递时传递的实际是该对象引用的值。2.Java中原始类型按值传递,对象按引用传递。在我看来,这两种说法意思是一样的,只是不同的人表述习惯不同。事情其实很简单,“Java manipulates objects ‘by reference,’ but it passes object references to methods ‘by value.”

Java按引用传递时,方法会得到原始对象的引用复制即内存地址,通过这个复制得到的引用是可以改变原对象的状态的。如题中的char ch[]就是引用传递,在change方法中对ch[0]赋值,就改变了原ch数组的内容。而String str也是引用传递,原字符串str却没有改变的原因是String类型的特殊性,String类型是不可更改的,任何试图改变String的行为其实都是创建了一个新的String对象,让原来的引用指向这个新的String对象。因此change方法中 str=”test ok”;其实是生成了一个新的String对象”test ok”,并让str指向了它,而str只是一个局部变量,change方法结束后就被自动回收了,与Example类中的全局变量str完全没产生关系,自然也不会将其改变。如果想改变全局变量str,只需要在change方法中指定this.str就可以了。
这里写图片描述

另外还需要注意,如果只是在方法中更改引用指向的对象,而不通过引用对原对象作实质性改变的话,是不会对原对象产生影响的。因为方法传递进来的引用只是原引用的一个拷贝,是局部变量,随着方法结束也就失去作用了,是不会对原对象产生影响的。比如下面:
原对象没有改变
很多认为Java只存在值传递的人都会举类似的例子,但其实我觉得这个只是体现 了局部变量的特点而已。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

参数传递中的编码问题(Java)

做java的web开发有段日子了,有个问题老是困扰着我,就是乱码问题,基本上是网上查找解决方案(网上资料真的很多),都是一大堆的介绍如何解决此类的乱码问题,但是没几个把问题的来龙去脉说清楚的,有时候看...

Java基础-参数传递问题

在上一篇中,简单的介绍了堆和栈,这一篇再接着来巩固下 抛出问题:Java中的到底是值传递还是引用传递?(面试题) 基本数据类型的传递 public class DemoArray { pub...

java参数传递问题

参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递。写它是为了揭穿普遍存在的一种神话,即认为 Java 应用程序按引用传递参数,以避免因依赖“按引用传递”这一行...

Java-String类型的参数传递问题

在Java语言中,以String作为类型的变量在作为方法参数时所表现出的“非对象”的特性。

Java 中参数传递的问题

java初学者经常碰到的一个问题,写一个函数处理传进来的形参,可是完成后再把参数拿出来的时候,变量接收的参数值并没有发生改变,很是疑惑! 例如:class Test1 { static void ch...
  • OpccO
  • OpccO
  • 2017-05-03 21:52
  • 80

Java中的参数传递问题

无论是什么语言,要讨论参数传递方式,就得从内存模型说起,主要是我个人觉得从内存模型来说参数传递更为直观一些。闲言少叙,下面我们就通过内存模型的方式来讨论一下Java中的参数传递。 这里的内存模型涉及...

关于java中的参数传递问题

java中只有参数传递只有值传递。1.关于基本类型的值传递 系统会复制一份实际参数值传入,所以对形参的操作不会影响实际的参数。2.关于引用类型的值传递 系统会复制该引用变量,并通过值传递传入实参中...

java参数传递方式问题

java的参数传递方式究竟是值传递还是引用传递一直是个备受争论的问题,在这里,我给出了自己的一些理解,纯属个人意见,仅供参考。

Java-String类型的参数传递问题

原文:http://freej.blog.51cto.com/235241/168676刚才看见一个兄弟在为Java的String传值/传引用问题困惑,翻箱倒柜找到了这篇我很久以前写的文章,发在这里,...

java参数传递问题

关于Java参数传递的问题,我们在学校学习编程语言的时候会经常听老师说方法的参数传递包括值传递和引用传递,那么什么是值传递和引用传递呢?我的理解是引用传递只是值传递的一种特殊情况,看下面的代码: p...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)