`
koolC
  • 浏览: 19319 次
  • 性别: 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对象将列表传递到视图中。下面是一...

    forward PK sendredirect

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

    学习JAVA-23种设计模式

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

    基于android的答题app实现代码

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

    系统签名 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. 签名后的刷机包可以安全地安装在...

    Android4.4 系统签名

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

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

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

    android 与 js交互

    - 一旦将Java对象暴露给了JavaScript,就可以在网页的JavaScript代码中调用相应的方法,传递参数并接收回调。 ```javascript window.android.doSomethingInAndroid('Hello from JS!'); ``` 4. **Android调用...

    深入浅析mybatis oracle BLOB类型字段保存与读取

    CONSTRAINT PK_BLOB_FIELD PRIMARY KEY (ID) ); ``` 这里有一个CLOB字段`CLOB_COL_VALUE`,但题目主要关注BLOB字段的操作,所以我们假设也有一个对应的BLOB字段。 接着,我们创建一个Java实体类`BlobField`来映射...

    精髓Oralcle讲课笔记

    --字符串比较,实际上比较的是每个字符的AscII值,与在Java中字符串的比较是一样的 14、select ename, sal from emp where sal between 800 and 1500; --(between and过滤,包含800 1500) 15、select ename, ...

Global site tag (gtag.js) - Google Analytics