`
koolC
  • 浏览: 19464 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
最近访客 更多访客>>
社区版块
存档分类
最新评论

按值传递 pk 按址传递(Java)

    博客分类:
  • Java
阅读更多

Java 中,为类的方法传递参数时,本身的传递机制是按址传递,还是按值传递?

//: 按值传递与按址传递测试类 Test1.java

public class Test1 {

    public static void main(String[] args) {

       User t = new User();

       t.setUserId(0);

       t.setUsername( "0" );

       t.setPassword( "0" );

       System. out .println( "User=>Bef    Id:" +t.getUserId()+ "\tname:" +t.getUsername()+ "\tpassword:" +t.getPassword());

       change (t);

       System. out .println( "User=>Aft    Id:" +t.getUserId()+ "\tname:" +t.getUsername()+ "\tpassword:" +t.getPassword());

    }

    public static void change(User t){

       // 在此, t 引用的地址没有改变

       t.setUsername( "00" ); // t 的属性引用的地址改变了

       t.setPassword( "00" );

    }

} /* Output:

User=>Bef   Id:0   name:0 password:0

User=>Aft  Id:0   name:00    password:00

*///:~ 结论:按址传递

//: 按值传递与按址传递测试类 Test2.java

public class Test2 {

    public static void main(String[] args) {

       int t = 0;

       System. out .println( "int=>Bef    t:" +t);

       change (t);

       System. out .println( "int=>Aft    t:" +t);      

    }

    public static void change( int t){

       // 在此, t 引用的地址没有改变

       t = 1; // 在此, t 引用的地址改变了

    }

} /* Output:

int=>Bef    t:0

int=>Aft   t:0

*///:~ 结论:按址传递

//: 按值传递与按址传递测试类 Test3.java

public class Test3 {

    public static void main(String[] args) {

       Integer t = 0;

       System. out .println( "Integer=>Bef   t:" +t);

       change (t);

       System. out .println( "Integer=>Aft   t:" +t);      

    }

    public static void change(Integer t){

       // 在此, t 引用的地址没有改变

       t = 1; // 在此, t 引用的地址改变了

    }

} /* Output:

Integer=>Bef   t:0

integer=>Aft  t:0

*///:~ 结论:按址传递

//: 按值传递与按址传递测试类 Test4.java

public class Test4 {

    public static void main(String[] args) {

       String t = "0" ;

       System. out .println( "String=>Bef t:" +t);

       change (t);

       System. out .println( "String =>Aft   t:" +t);      

    }

    public static void change(String t){

// 在此, t 引用的地址没有改变

       t = "00" ; // 在此, t 引用的地址改变了

    }

} /* Output:

String=>Bef    t:0

String=>Aft   t:0

*///:~ 结论:按址传递

    最终结论: Java 中,为类的方法传递参数时,本身的传递机制是按址传递。那么,为什么打印的结果会不一样呢?主要是由赋值符号“ = ”造成的,众所周知,在 Java 中,一切都是对象,所以即便是个数字、字符,或者字符串,都被称为是对象。在 Java 中,规定的赋值(“ = ”)机制是按址传递,即将对象的地址赋给引用(即把对象的地址赋给“ = ”左侧的变量),所以每出现一次赋值语句,左侧变量的地址都会发生改变。既然这样,那么为什么在 Test2 3 4 中最后打印 t 的值时却没有改变呢?这就是程序本身的迷惑性造成的,其实 change 方法内部的 t 与该方法外的 t 不是一个引用,如果把 change 参数的 t 改为其他名字你就明白了,这就是故意用来迷惑不成熟的程序员的。在传递参数时,首先要新生成参数列表中的虚参变量,然后将传递的实参的对象地址赋给虚参,这样就完成了 Java 中的参数传递。

       因此,当在一个方法内部改变方法外面的某个对象的值时,一定要注意“ = ”的迷惑性( = ”只传址,不传值 )。

       总之一句话, Java 中传的都是地址,不是值

0
0
分享到:
评论

相关推荐

    教你如何在java中用定时计划

    在Java开发中,定时任务是常见的需求,用于执行某些周期性的操作,例如数据同步、日志清理等。Spring框架提供了一种灵活的方式来实现定时计划,通过集成Quartz库可以方便地创建和管理这些任务。下面将详细介绍如何在...

    SpringMVC的ModelAndView传值方法

    在本文中,我们将详细介绍SpringMVC的ModelAndView传值方法,包括将列表、单个值、Map对象和复杂对象传递到视图中。 1. 将列表传递到视图中 在SpringMVC中,可以使用ModelAndView对象将列表传递到视图中。下面是一...

    Java面试宝典+题库

    页面之间的值传递 - **Request参数**: 通过URL传递。 - **Session**: 在整个会话期间保存数据。 - **Application**: 在整个Web应用期间保存数据。 ##### 23. 获取sessionID 使用`()%>`。 ##### 24. 使用Cookie...

    毕业设计&课设_Java 聊天室,支持多人互动交流,具备多种实用功能与良好界面设计.zip

    Java聊天室是一个基于Java编程语言开发的多人在线交流平台,它的设计目标是支持多人互动交流,同时具备多种实用功能,并且拥有良好的界面设计。该平台的实现涉及了网络编程、图形用户界面设计、多线程处理、事件驱动...

    java设计模式之禅

    《java设计模式之禅》是一本深入浅出讲解Java设计模式的书籍,作者希望无论读者的编程能力如何,都能从中有所收获。初级程序员可以学习如何编写优秀代码,高级程序员可以全面理解设计模式及Java的高级技巧,而顶级...

    forward PK sendredirect

    相比之下,`response.sendRedirect("转的页面")`是Java Servlet API中的一个方法,它会告诉浏览器发送一个新的GET请求到指定的URL。这是一个客户端的跳转,服务器返回一个HTTP状态码302(暂时重定向)和Location头,...

    毕业设计&课设_ 健身房管理系统 Java 后端,含多种功能模块,代码完整开源.zip

    毕业设计&课设_ 健身房管理系统 Java 后端,含多种功能模块,代码完整开源 近年来,随着人们健康意识的提升,健身已成为越来越多人日常生活的一部分,健身房成为了热门的公共场所之一。在这样的背景下,对于健身房...

    分布式系统Java编程:环网络领导者选举协议的实现与性能评估

    作业分为三个部分,首先是用Java实现LCR和HS算法,接着对这两个协议进行实验验证其正确性和效率,最后完成详细的报告。文中详细规定了各部分的具体要求以及最终提交的规范,比如所有提交材料压缩成zip格式、截止时间...

    毕业设计&课设_基于 Cesium 时空数据可视化后台(Java SSM 框架相关内容展示) .zip

    4. 表现层展示:通过SpringMVC将处理后的数据传递给前端,前端使用Cesium API将数据在三维地图上进行可视化展示。 5. 系统整合与测试:将数据接入、数据管理、业务逻辑和表现层整合在一起,进行系统级的测试,确保...

    学习JAVA-23种设计模式

    在Java中,23种设计模式被广泛应用于构建可复用、可维护的面向对象软件。这些模式按照其主要目的可以分为三大类:创建型、结构型和行为型。 1. 创建型模式(Creational Patterns): - 工厂方法模式(Factory ...

    基于android的答题app实现代码

    - Intent用于在Activity之间传递数据,例如从登录Activity跳转到答题Activity,Intent可以携带用户信息。 3. **数据管理**: - 题库数据通常存储在本地数据库(如SQLite)或通过网络API获取。SQLite提供了一个轻...

    毕业设计&课设_基于 Java 的云手机项目,含服务端与客户端代码,实现远程控制等多功能应用.zip

    同时,客户端还需要处理好与服务端的数据交互,保证信息传递的准确性和安全性。 该云手机项目实现的多功能应用可能包括但不限于文件管理、应用管理、系统设置等功能。用户可以通过客户端与服务端的配合,进行文件的...

    系统签名 APK

    通过执行特定的命令行指令,你可以将APK、公钥证书和私钥传递给`signapk.jar`,它会生成一个新的已签名APK。 签名后的APK可以通过检查其MD5哈希值来验证。在描述中提到的"签名MD5:8D:DB:34:2F:2D:A5:40:84:02:D7:...

    JSP考核试卷

    以上知识点涵盖了URI概念、HttpServlet的性质、Servlet生命周期方法、Servlet上下文范围、响应重定向、输出响应内容、传递请求参数以及Servlet映射配置等方面,这些都是JSP和Java Web开发的基础内容。理解并掌握这些...

    OA与NC系统集成接口开发方案[借鉴].pdf

    OA系统通过调用这个接口,传递包括代办单据PK、用户PK、单据类型和主题等参数,然后将获取的数据展示在OA界面上。例如,通过Java代码调用NC服务接口: ```java String endpoint = ...

    zip刷机包自动签名工具

    2. `sign.bat`会调用`signapk.jar`,并传递`testkey.x509.pem`和`testkey.pk8`作为证书输入。 3. `signapk.jar`读取ZIP刷机包,使用私钥对其进行签名,并保存已签名的版本。 4. 签名后的刷机包可以安全地安装在...

    SpringBoot实现了随机匹配聊天、离线消息缓存、消息本地化存储、头像上传、小游戏推荐、世界聊天以及好友关系

    SpringBoot是一款基于Java的轻量级框架,它简化了创建独立的、生产级别的基于Spring的应用程序的过程。在这个项目中,SpringBoot被用来构建一个聊天应用,提供了随机匹配用户进行聊天的功能。这涉及到以下几个关键...

    Android4.4 系统签名

    在这个上下文中,它可能是用来调用Java可执行文件(JAR)和传递必要的参数来签署APK的脚本。运行这个脚本将会执行签名过程。 2. **signapk.jar**:这是Android签名工具,它包含用于签署APK的Java代码。开发者或打包...

    安卓程序修改为系统程序所需文件

    通常,你需要将APK文件、`platform.x509.pem`和`platform.pk8`作为输入传递给SignApk工具,然后它会生成一个新的已签名的APK。 将安卓应用修改为系统程序的过程如下: 1. **获取系统签名文件**:首先,你需要获取...

    Spring Boot与RabbitMQ集成指南,含构建、配置及消息收发示例.zip

    Spring Boot是一种流行的Java Web开发框架,它极大地简化了基于Spring的应用开发过程,特别是对于那些使用Spring技术栈的微服务架构。RabbitMQ是一个消息代理,它实现了高级消息队列协议(AMQP),用于在不同的应用...

Global site tag (gtag.js) - Google Analytics