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中经典同步问题

当多个线程同时操作一个或多个资源时需要进行同步处理。A线程操作资源时,B线程也操作了资源,会造成数据不同步,从而导致错误出现。 加入同步锁可以防止资源以为多个线程同时操作导致的资源不同步问题。 ...
  • weifeib
  • weifeib
  • 2015年09月18日 19:25
  • 807

常见的java基础问题总结

面向对象编程(OOP) Java是一个支持并发、基于类和面向对象的计算机编程语言。下面列出了面向对象软件开发的优点: 代码开发模块化,更易维护和修改。 代码复用。 ...
  • cc171211626
  • cc171211626
  • 2016年04月24日 19:38
  • 1528

Java 多线程同步问题的探究-经典讲解

Java 多线程同步问题的探究(五、你有我有全都有—— ThreadLocal如何解决并发安全性?)【更新重要补疑】Java 多线程同步问题的探究(四、协作,互斥下的协作——Java多线程协作(wa...
  • liuhl0910
  • liuhl0910
  • 2015年05月20日 15:39
  • 994

完全背包问题 ------ java

完全背包问题
  • QwQ________
  • QwQ________
  • 2016年11月08日 00:38
  • 311

约瑟夫问题(Java实现)

一、简介约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。又称“丢手绢问题”.)例子: len个人围成一个圈,玩丢手绢...
  • u013255737
  • u013255737
  • 2016年08月24日 21:32
  • 3206

回溯法最优装载问题(java)

package cn.cb.offer.backtrack; import javax.swing.*; import java.util.Scanner; /** * Created by I...
  • fenglangjuxi
  • fenglangjuxi
  • 2013年10月17日 15:15
  • 736

总结的一些面试问题-java

总结的高级JAVA可能会遇到的一些面试题。。。
  • hll814
  • hll814
  • 2016年04月01日 11:52
  • 1094

Java实现哲学家就餐问题

什么是哲学家就餐问题? 可以参考百度百科 或者维基百科维基百科 我给出一种方法的实现 Chandy/Misra解法 1984年,K. Mani Chandy和J. Misra提出了哲学家...
  • coderbean
  • coderbean
  • 2015年11月19日 21:03
  • 2209

解迷宫问题的Java实现

问题: 有一个m行n列的迷宫,只有一个入口和一个出口,用0表示可以走,用1表示不可以走,现在编写一个程序列出所有可以走的路径。 迷宫示例: -1 0 0 0 0 1 1 0 1 1 0 0 0 0 ...
  • cuiods
  • cuiods
  • 2016年09月01日 23:04
  • 1816

java多线程_并发问题的解析

首先看一下java中的多线程 1.多线程是合理充分利用了CPU,内存资源 。 2.多个线程同步操作一个加锁对象,效率是得不到提升的,记得在一个博客上看的一篇日志,将一个加锁的对象比喻成一个卫生间,同一...
  • liunian02050328
  • liunian02050328
  • 2015年03月23日 17:39
  • 1435
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java参数传递的问题
举报原因:
原因补充:

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