以下测试主要为了说明:对传递对象或传递引用进行修改,对最终值的影响情况
  1. public class PassTest {
  2.     @Before
  3.     public void setUp() throws Exception {
  4.     }
  5.     /**
  6.      * 测试对象已经指向具体的值
  7.      */
  8.     @Test
  9.     public void testPass1() {
  10.         // 对象的引用已经指向了具体的对象
  11.         Human human = new Someone();
  12.         Map<String, String> map = new HashMap<>();
  13.         getPerson1(human, map);
  14.         System.out.println("human1:" + human + ", map1:" + map.toString());
  15.         assertEquals("fish", map.get("food"));
  16.         assertEquals("大哥", human.getName());
  17.     }
  18.     /**
  19.      * 测试对象的引用尚未指向了具体的对象
  20.      */
  21.     @Test
  22.     public void testPass2() {
  23.         // 对象的引用尚未指向了具体的对象
  24.         Human human = null;
  25.         Map<String, String> map = null;
  26.         getPerson2(human, map);
  27.         System.out.println("human2:" + human + ", map2:" + map);
  28.         assertEquals(null, map);
  29.         assertEquals(null, human);
  30.     }
  31.     /**
  32.      * 测试对象的引用已经指向了具体的对象,在调用方法中重新指向另一个对象
  33.      */
  34.     @Test
  35.     public void testPass3() {
  36.         // 对象的引用已经指向了具体的对象,在调用方法中重新指向另一个对象
  37.         Human human = new Someone();
  38.         Map<String, String> map = new HashMap<>();
  39.         getPerson3(human, map);
  40.         System.out.println("human3:" + human + ", map3:" + map.toString());
  41.         assertEquals(0, map.size());
  42.         assertEquals(null, human.getName());
  43.     }
  44.     /**
  45.      * 测试对象的引用尚未指向了具体的对象,调用方法中创建对象、赋值,并返回对象的情况
  46.      */
  47.     @Test
  48.     public void testPass4() {
  49.         Human human = null;
  50.         human = getPerson4();
  51.         System.out.println("human4:" + human);
  52.         assertEquals("大哥", human.getName());
  53.     }
  54.     interface Human {
  55.         public String getName();
  56.         public void setName(String name);
  57.         public void eat(Map<String, String> map);
  58.     }
  59.     class Someone implements Human {
  60.         public String name;
  61.         public String getName() {
  62.             return name;
  63.         }
  64.         public void setName(String name) {
  65.             this.name = name;
  66.         }
  67.         @Override
  68.         public void eat(Map<String, String> map) {
  69.             map.put("food", "fish");
  70.         }
  71.         @Override
  72.         public String toString() {
  73.             return "Someone [name=" + name + "]";
  74.         }
  75.     }
  76.     public void getPerson1(Human human, Map<String, String> map) {
  77.         human.setName("大哥");
  78.         human.eat(map);
  79.     }
  80.     public void getPerson2(Human human, Map<String, String> map) {
  81.         human = new Someone();
  82.         map = new HashMap<>();
  83.         human.setName("大哥");
  84.         human.eat(map);
  85.     }
  86.     private void getPerson3(Human human3, Map<String, String> map3) {
  87.         Human human = new Someone();
  88.         Map<String, String> map = new HashMap<>();
  89.         human.setName("大哥");
  90.         human.eat(map);
  91.         human3 = human;
  92.         map3 = map;
  93.     }
  94.     private Human getPerson4() {
  95.         Human human = new Someone();
  96.         human.setName("大哥");
  97.         return human;
  98.     }
  99. }
测试结果:
 


JAVA一个关于传递引用的测试的更多相关文章

  1. java方法强制传递引用参数(做为返回值),改变被传递参数值。

    Java传递参数分为2种: 值类型,Java里面也叫简单类型,这种参数类型的传递的是它的副本拷贝: 引用类型,传递的是对象引用地址,如果在方法内改变该参数对象属性即是对原引用对象的改变:如果不想这样传 ...

  2. java基本数据类型传递与引用传递区别

    文章转载自  zejian的博客http://blog.csdn.net/javazejian/article/details/51192130 java的值传递和引用传递在面试中一般都会都被涉及到, ...

  3. Java是值传递还是引用传递?

    Java的值传递和引用传递在面试中一般都会都被涉及到,今天我们就来聊聊这个问题.这个问题一般是相对函数而言的,也就是Java中所说的方法参数,那么我们先来回顾一下在程序设计语言中有关参数传递给方法的两 ...

  4. java传值与传引用

    一.传值与传引用 1.不管java参数的类型是什么,一律传递参数的副本. 在thinking in java中,明确指出,如果java是传值,那么传递的是值的副本,如果java传递的是引用,那么传递的 ...

  5. Java 为值传递而不是引用传递

    ——reference Java is Pass by Value and Not Pass by Reference 其实这个问题是一个非常初级的问题,相关的概念初学者早已掌握,但是时间长了还是容易 ...

  6. java是值传递还是引用传递

    首先写一个简便的Employee,以便测试使用. class Employee { private String name; public Employee(String name) { this.n ...

  7. 堆栈详解 + 彻底理解Java的值传递和引用传递

    本文旨在用最通俗的语言讲述最枯燥的基本知识 学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨 ...

  8. Java的值传递和引用传递的说法

    学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨论的话题又是充满争议:有的论坛帖子说Java ...

  9. Java中值传递和引用传递的概念

    很多书中都提到了在Java中只存在值传递,但是今天在一个NanoHTTPD的源码中看到这样一段: if (qmi >= 0) { decodeParms(uri.substring(qmi + ...

随机推荐

  1. win8 优化笔记

    win8可以关掉的服务: 以下是小编搜集的可以安全更改为手动启动的服务(按名称排序): Application Experience(启动时为程序处理应用程序兼容性缓存请求) ·Computer Br ...

  2. HTML可编辑下拉框

    <div style="position:relative;">   <select style="width:120px;" onchang ...

  3. Android 使用httpClient POST 模拟发送 multipart表单内容

    使用的环境:apache-mime4j-0.6.jar,httpcore-4.3.2.jar,httpmime-4.3.3.jar try { HttpPost httpPost = new Http ...

  4. lsof命令总结

    1.lsof 简介 lsof 是 linux 下的一个非常实用的系统级的监控.诊断工具.它的意思是 List Open Files,很容易你就记住了它是 “ls + of”的组合~它可以用来列出被各种 ...

  5. php用于URL的base64

    function base64url_encode($plainText) { $base64 = base64_encode($plainText); $base64url = strtr($bas ...

  6. svn的merge使用例子

    先说说什么是branch.按照Subversion的说法,一个branch是某个development line(通常是主线也即trunk)的一个拷贝,见下图: branch存在的意义在于,在不干扰t ...

  7. Linux信号列表

    我们运行如下命令,可看到Linux支持的信号列表: ~$ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL5) SIGTRAP 6) SIGABRT 7) ...

  8. 爬虫实现(hpricot)

    1.基本代码 在gemfile中加入gem "hpricot",bundler install之后,在application.rb中require "hpricot&qu ...

  9. WinCE启动失败的原因与解决办法分析

    本文通过一个真实的嵌入式项目进行说明.文中的嵌入式系统用的是ARM处理器+WinCE平台,项目的目的是要把WinCE平台从旧版本移植到WinCE6.0平台上.但结果是这个WinCE系统在启动的时候经常 ...

  10. 使用SecureCRT上传和下载文件

    SecureCR 下的文件传输协议有ASCII .Xmodem .Ymodem .Zmodem.ASCII:这是最快的传输协议,但只能传送文本文件.Xmodem:这种传输协议速度较慢,但由于使用了CR ...