`

JAVA 参数传递机制 值传递 or 引用传递

阅读更多

    Java的参数传递机制是在Java中一个比较烦的问题,一般人都不太会注意,但要详细的解释一下其机制的话还是有很多人说不上来。其实我也是,所以就查了点相关资料并且记录下来,好好理解Java的参数传递。

        对于参数传递主要可分为几类:1、Java的基本类型作为参数传递时,主要是传递值的拷贝。所以不能改变原值。2、Java的对象作为参数传递时,是引用传递,把对象在内存中的地址拷贝传递给参数。

        下面举个例子来简单说明(例子是网上找的,呵呵!)

public class PersonT {
	
	public void change(Person p) {   
         p.name = "mary";   
         p.age = 20;   
     }

     public void changeInt(int i) {   
         i = 8;   
     }
     
     public void change1(Person p){   
        p = new Person("tom",22);   
     }
     
     public static void main(String[] args) {
    	 
         PersonT t = new PersonT();
         Person p = new Person("john", 18);
         
         Person p1 = p;
         System.out.println(p);
         
         t.change(p1);   
         System.out.println(p1);   
         System.out.println("传回来的值指向是否一致:" + p.equals(p1));
         
         int i = 10;   
         System.out.println("i值为:" + i);
         t.changeInt(i);
         System.out.println("i值为:" + i);
         t.change1(p);
         System.out.println(p);
         
     }
     
 }   

 输出结果为:

姓名:john 年龄:18
姓名:mary 年龄:20
传回来的值指向是否一致:true
i值为:10
i值为:10
姓名:mary 年龄:20

 

    由上面的例子可知:对于Java来说值传递所传递的是原值的备份,所以对其修改以后原值还是没有变化,而引用传递,则是传递对象的地址,所以即使是对象内容改变其值也不会变化,因为引用地址没变化。

总结:

1. 值传递 所传递的是原值的拷贝,即使拷贝在传递后发生了变化,原值也不会改变。

2. 引用传递 所传递的是引用对象的地址,所以在传递后对于对象内容的改变并不能使得传递参数发生变化,只有在指向不同对象是才会发生变化。

 

分享到:
评论

相关推荐

    Java高性能线程库(java.util.concurrent包的补充)

    一个高性能的Java线程库,该库是 JDK 1.5 中的 java.util.concurrent 包的补充,可用于基于并发消息机制的应用。该类库不提供远程的消息功能,其设计的宗旨是实现一个内存中的消息传递机制. 主要特点有: * All ...

    java五种jsp页面跳转方法详解

    java五种jsp页面跳转方法详解 2009-08-21 09:06 1. RequestDispatcher.forward()  是在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servlet or JSP到 另外一个Servlet,JSP 或普通HTML...

    python最大值最小值maxinteger-(Python基础教程之十)Pythonma .pdf

    如果字符串作为参数传递,则在字典上的最⼤值。 1.1. Find largest integer in array >>> nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2] >>> max( nums ) 42#Max value in array 1.2. Find largest string in ...

    springboot mybatis 动态调用oracle存储过程,通过存储过程名称,就能动态调用存储过程、java动态调用or

    能不能写个动态的业务,只输入存储过程名称,自动获取存储过程参数,并且参数的数据从前台传递过来,这个就通用了。只写一个通用方法,就可以调用所有的存储过程。只根据输入不同的存储过程名称、参数内容,自动调用...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    (5) implements 子句用于说明类中将实现哪些接口,接口是 Java 的一种引用类 型。 (6) 类体包含了变量和方法。在类体中定义的数据、变量和方法称为类的成员, 或称为实例变量和实例方法。 (7) 例如: 下例定义...

    离散数学二元关系类(Java实现)

    OR//关系的并运算 NOT//关系的非运算 XOR//关系的异或运算 SUB//关系的减运算 简单测试如下: 请输入关系矩阵的阶数 3 请输入第一个关系矩阵的各个元素值 1 0 1 1 1 1 1 0 1 请输入第二个关系矩阵的各个元素值 0 0 ...

    java面试题

    引用传递和值传递? 答:引用传递:形参改变影响实参 值传递:形参改变不影响实参 当一个线程进入一个对象的synchronized方法后,其他线程是否可进入此对象的其他方法? 答:其他方法前是否加了synchronized关键字...

    Java面试宝典2020修订版V1.0.1.doc

    17、java中实现多态的机制是什么? 17 19、String和StringBuffer的区别?StringBuffer和StringBuilder区别? 17 21、数组中有没有length()方法,String中有没有length()方法? 18 23、final, finally, finalize的...

    corejava的学习笔记

    or java [-options] -jar jarfile [args...] (to execute a jar file) where options include: -d32 use a 32-bit data model if available -d64 use a 64-bit data model if available -client to select the...

    zendesk-java-client:用于与Zendesk交互的Java客户端库

    Zendesk Java客户端这是使用AsyncHttpClient和Jackson用Java编写的客户端实现。使用API首先创建一个Zendesk实例Zendesk zd = new Zendesk.Builder("https://{{your domain}}.zendesk.com") .setUsername("...") ....

    matlab代码转java-Tiny-Things-Archive:零碎文件的存档

    函数作为参数传递, Check out 2-Closure.py 3. 寄存器bit域赋值宏 其实主要就是左移右移之类的,看代码就好。突然觉得应该做一个嵌入式的归档。期末之后再说吧。在此提醒一下自己。 4. Message Digest, format to ...

    JAVA 多线程

    程序 Java源程序和字节码文件被称为“程序” (Program),是一个静态的概念。... 由于线程间的通信是在同一地址空间上进行的,所以不需要额外的通信机制,这就使得通信更简便而且信息传递的速度也更快。

    android-java-chat-app:适用于Java的开源语音和视频通话和文本聊天应用程序(Android)

    Android Java聊天应用 CometChat厨房接收器示例应用程序(使用CometChat UIKit构建)是功能齐全的消息传递应用程序,能够一对一(私人)和组消息传递以及呼叫。 该示例应用程序使用户能够发送文本和彩信,例如图像,...

    java笔试题从一个圈内-web-api-commander:使用和测试RESOWebAPI的客户端工具。默认分支已重命名为main。请参阅:

    java笔试题从一个圈内RESO Web API 指挥官 RESO Web API Commander 是一个 OData 客户端库和命令行客户端,以及一个自动化的 ...假设此时,可以通过传递--help或不传递参数从命令行获得帮助,如下所示: $ jav

    在一小时内学会 C#(txt版本)

    函数参数 ? 数组 ? 索引器 ? 装箱与拆箱 ? 委托 ? 继承与多态 以下主题不会进行讨论: ? C++ 与 C# 的共同点 ? 诸如垃圾回收、线程、文件处理等概念 ? 数据类型转换 ? 异常处理 ? .NET 库 编程结构 和 C++ ...

    Java中的functor实现

    比如在利用SDK 进行Windows编程的时候,我们需要注册一个WNDCLASS类,这个类中有这样一个参数 lpfnWndProc, 要进行消息处理,我们就要用处理消息的函数的指针给它赋值。消息处理函数什么时候被调用的?我们没有显式地在...

    EL表达式 (详解)

    ${param}表示返回请求参数中单个字符串的值. ${paramValues}表示返回请求参数的一组 值.pageScope表示页面范围的变量.requestScope表示请求对象的变量. sessionScope表示会话 范围内的变量.applicationScope...

    Java对象排序、中文排序、SortedSet排序使用和源码讲解

    在C、C++中有很多排序算法,但是通常排序算法不得不让程序员在写代码的过程中陷入对底层很多指针和位置的理解,java不希望这样,所以排序大多可以由java帮你做掉...  而排序必然存在对比大小,那么传递的信息,java是

    基于JavaScript的数据可视化实验室后台管理系统源码+项目说明(期末大作业).zip

    最后在spring-mvc配置文件中配置参数解析器,直接在controller类中需要用这个注解的方法or参数上添加注解就可以自动验证token。 1.2 分页功能 * 后端按照前端的需求将分页所需数据查询出来。后端只需要提供总页数...

Global site tag (gtag.js) - Google Analytics