参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递。

在 Java 应用程序中永远不会传递对象,而只传递对象引用。因此是按引用传递对象。Java 应用程序按引用传递对象这一事实并不意味着 Java 应用程序按引用传递参数。参数可以是对象引用,而 Java 应用程序是按值传递对象引用的。

Java 应用程序中的变量可以为以下两种类型之一:引用类型或基本类型。当作为参数传递给一个方法时,处理这两种类型的方式是相同的。两种类型都是按值传递的;没有一种按引用传递。

按值传递和按引用传递。按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。因此,如果函数修改了该参数,调用代码中的原始值也随之改变。

1、对象是按引用传递的

2、Java 应用程序有且仅有的一种参数传递机制,即按值传递

3、按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本

4、按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本

首先考试大来看看第一点:对象是按引用传递的   

确实,这一点我想大家没有任何疑问,

例如:   

class Test01   {   
public static void main(String[] args){   
StringBuffer s= new StringBuffer("good");   
StringBuffer s2=s;   
s2.append(" afternoon.");   
System.out.println(s);   
}   
}

对象s和s2指向的是内存中的同一个地址因此指向的也是同一个对象。   

如何解释“对象是按引用传递的”的呢?   

这里的意思是进行对象赋值操作是传递的是对象的引用,因此对象是按引用传递的,有问题吗?   

程序运行的输出是:   

  good afternoon.   这说明s2和s是同一个对象。   

这里有一点要澄清的是,这里的传对象其实也是传值,因为对象就是一个指针,这个赋值是指针之间的赋值,因此在java中就将它说成了传引用。(引用是什么?不就是地址吗?地址是什么,不过就是一个整数值)   

再看看下面的例子:   

class Test02 {
  public static void main(String[] args)
  {   
int i=5;
  int i2=i;
   i2=6;
   System.out.println(i);
  }
}   

程序的结果是什么?

  5!!!   

这说明什么,原始数据类型是按值传递的,这个按值传递也是指的是进行赋值时的行为下一个问题:Java 应用程序有且仅有的一种参数传递机制,即按值传递   

class Test03
{
  public static void main(String[] args)
  {
   StringBuffer s= new StringBuffer("good");
   StringBuffer s2=new StringBuffer("bad");
   test(s,s2);
   System.out.println(s);     //9 --> goodhah
   System.out.println(s2);    //10 --> bad
  }
  static void test(StringBuffer s,StringBuffer s2) {
   System.out.println(s);     //1--> good
   System.out.println(s2);    //2--> bad
   s2=s;               //3
   s=new StringBuffer("new");   //4
   System.out.println(s);     //5--> new
   System.out.println(s2);    //6 --> good
   s.append("hah");        //7
   s2.append("hah");       //8
  }
}

为什么输出是这样的?

这里需要强调的是“参数传递机制”,它是与赋值语句时的传递机制的不同。   

我们看到1,2处的输出与我们的预计是完全匹配的

3将s2指向s,

4将s指向一个新的对象

因此5的输出打印的是新创建的对象的内容,而6打印的原来的s的内容

7和8两个地方修改对象内容,但是9和10的输出为什么是那样的呢?

Java 应用程序有且仅有的一种参数传递机制,即按值传递。

至此,我想总结一下我对这个问题的最后的看法和我认为可以帮助大家理解的一种方法:

我们可以将java中的对象理解为c/c++中的指针   

  例如在c/c++中:

  int *p;

  print(p);//打印的结果是什么,一个16进制的地址

  *p=5;

  print(*p);//打印的结果是什么?5,也就是指针指向的内容。   

即使在c/c++中,这个指针其实也是一个32位的整数,我们可以理解我一个long型的值。   

而在java中一个对象s是什么,同样也是一个指针,也是一个int型的整数(对于JVM而言),我们在直接使用(即s2=s这样的情况,但是对于System.out.print(s)这种情况例外,因为它实际上被转换system.out.print(s.toString()))对象时它是一个int的整数,这个可以同时解释赋值的传引用和传参数时的传值(在这两种情况下都是直接使用),而我们在s.XXX这样的情况下时s其实就是c/c++中的*s这样的使用了。这种在不同的使用情况下出现不同的结果是java为我们做的一种简化,但是对于c/c++程序员可能是一种误导。java中有很多种这种根据上下文进行自动识别和处理的情况,下面是一个有点极端的情况:  

class t
{
  public static String t="t";
  public static void main(String[] args)
  {
   t t =new t();
   t.t();
  }
  static void t() {
   System.out.println(t);
  }
}

1.对象就是传引用 2.原始类型就是传值 3.String类型因为没有提供自身修改的函数,每次操作都是新生成一个String对象,所以要特殊对待。可以认为是传值。

java中的参数传递——值传递、引用传递的更多相关文章

  1. Java中到底是值传递还是引用传递?

    Java中到底是值传递还是引用传递? 我们先回顾一下基本概念 实参和形参 参数在编程语言中是执行程序需要的数据,这个数据一般保存在变量中.在Java中定义一个方法时,可以定义一些参数, 举个例子: p ...

  2. 理解--->Java中的值传递&引用传递

    转自:http://url.cn/5tL9F5D 值传递和引用传递 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际 ...

  3. Java中真的只有值传递么?

    Java中真的只有值传递么? (本文非引战或diss,只是说出自己的理解,欢迎摆正心态观看或探讨) 回顾值传递和引用传递 关于Java是值传递还是引用传递,网上有不一样的说法. 1.基本类型或基本类型 ...

  4. 对象引用 方法传参 值传递 引用传递 易错点 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  5. 【转】java方法参数传递方式--按值传递、引用传递

    java的方法参数传递方式有两种,按值传递和引用传递 1.按值传递 参数类型是int,long等基本数据类型(八大基本数据类型),参数传递的过程采用值拷贝的方式 代码片段1: public class ...

  6. C++之值传递&指针传递&引用传递详解

    C++之值传递&指针传递&引用传递详解 目录 C++之值传递&指针传递&引用传递详解 1.函数基础 2.值传递 3.指针传递 4.引用传递 1.函数基础 一个函数由以下 ...

  7. java中的参数传递是按引用传递还是按值传递

    最近去面试,有一个面试官问到java中参数传递的问题,感觉自己对于这一块还是理解的不够深.今天我们就一起来学习一下Java中的接口和抽象类.下面是本文的目录大纲: 一 . 什么是按值传递,什么是按引用 ...

  8. java中强,软,弱,虚引用 以及WeakHahMap

    java中强,软,弱,虚引用  以及WeakHahMap   一:强软引用: 参考:http://zhangjunhd.blog.51cto.com/113473/53092/进行分析   packa ...

  9. java中,null值可以被强制转换为任何类型

    java中,null值可以被强制转换为任何类型

随机推荐

  1. 1.2(Spring学习笔记)Spring中的Bean

    一.<Bean>的属性及子元素 在1.1中我们对<Bean>有了初步的认识,了解了一些基本用法. 现在我们进一步理解<Bean>属性及子元素. 我们先来看下< ...

  2. 显示字符 Exercise06_12

    /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:显示字符 *1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J ...

  3. 【JVM】调优笔记1-----堆栈概念的对碰

    关于JVM的工作原理以及调优是一个向往已久的模块,终于有幸接触到:http://pengjiaheng.iteye.com/blog/518623 那就顺着这个思路,来梳理一下自己看到后的结论和感想. ...

  4. JAVA常见算法题(二十六)

    package com.xiaowu.demo; import java.util.Scanner; /** * Java实现将阿拉伯数字转为汉字 * * @author WQ * */ public ...

  5. git:FETCH_HEAD

    FETCH_HEAD: 是一个版本链接,记录在本地的一个文件中,指向着目前已经从远程仓库取下来的分支的末端版本. 举例说明:将远程origin仓库的xx分支合并到本地的yy分支.git fetch o ...

  6. java 把json对象中转成map键值对

    相关:Json对象与Json字符串的转化.JSON字符串与Java对象的转换 本文的目的是把json串转成map键值对存储,而且只存储叶节点的数据 比如json数据如下: {responseHeade ...

  7. 【前后台分离模式下,使用OAuth Token方式认证】

    AngularJS is an awesome javascript framework. With it’s $resource service it is super fast and easy ...

  8. 用聚合数据API(苏州实时公交API)快速写出小程序

    利用聚合数据API快速写出小程序,过程简单. 1.申请小程序账号 2.进入开发 3.调用API.比如“苏州实时公交”小程序,选择的是苏州实时公交API. 苏州实时公交API文档:https://www ...

  9. activiti designer下载地址

    http://www.activiti.org/designer/update/ http://www.activiti.org/designer/archived/       这个地址貌似不能用了 ...

  10. JsonConvert.SerializeObject() 输出josn格式 也就是序列化。

    JsonConvert.SerializeObject() 输出josn格式  也就是序列化. JSON.parse 反序列化  http://www.cnblogs.com/ahlx/p/52280 ...