JAVA编程思想,最近主要学习对象和引用的关系。

在内存中,引用主要存放在堆栈中,而JAVA对象主要存放在堆中。

在堆栈中方便管理储存分配与清理,而在堆中的数据,编译器并不需要知道其存活的周期,有JVM的垃圾回收机制进行统一管理。

基本类型,并不是创建引用,而是直接在堆栈中进行保存,比较高效;但是其封装类必须是会创建引用的。

同时这里又引出了基本类型的自动装箱和自动拆箱的概念,如下:

Integer a = new Integer(8);
Integer b = new Integer(8);
int c = 8;
int d = 8;
System.out.println(a == b);//false;
System.out.println(a == c);//true;
System.out.println(d == c);//true;

那么上面代码的对象a和对象b如何比较呢,应该通过

a.equals(b);//true

来进行比较。

这是因为int的封装类Integer,重写了equals的比较方法。

如果是自定义的类,而且没有重写equals方法的话

public class JDKTest {/*** 功能描述: <br>* 〈功能详细描述〉** @param args* @see [相关类/方法](可选)* @since [产品/模块版本](可选)*/public static void main(String[] args) {Value v1 = new Value();Value v2 = new Value();v1.i = v2.i = 100;System.out.println(v1.equals(v2));//false;}}class Value{int i;
}

重写equals方法后

public class JDKTest {/*** 功能描述: <br>* 〈功能详细描述〉** @param args* @see [相关类/方法](可选)* @since [产品/模块版本](可选)*/public static void main(String[] args) {Value v1 = new Value();Value v2 = new Value();v1.i = v2.i = 100;System.out.println(v1.equals(v2));//true;}}class Value{int i;@Overridepublic boolean equals(Object arg0) {if(this == arg0){return true;}if(! (arg0 instanceof Value) ){return false;}else if(this.i == ((Value)arg0).i){return true;}else {return false;}}
}

同时参数的传递,如果不是基本类型,传递的也是引用

public class JDKTest {static void f(Letter y){y.c = 'Z';}/*** 功能描述: <br>* 〈功能详细描述〉** @param args* @see [相关类/方法](可选)* @since [产品/模块版本](可选)*/public static void main(String[] args) {Letter x = new Letter();x.c = 'a';System.out.println(x.c);f(x);System.out.println(x.c);}}class Letter{char c;
}

输出的结果:

a
Z

都是引用,更新的都是堆中对象的值,同时所有对这个对象的引用的值都会改变(因为只是“引用而已”)。

如果需要传递对象而不是传递对象的引用的话,就需要重新new一个新的对象,并把原对象中的值赋给新的对象。

Letter x = new Letter();
x.c = 'a';
Letter y = new Letter();
y.c = x.c;//通过这种方式传递值

补充:

找了下,发现已经有工具类可以实现这个功能(需要jar包commons-beanutils-1.8.3.jar)

org.apache.commons.beanutils.BeanUtils.copyProperty(Object bean, String name, Object value)
        throws IllegalAccessException, InvocationTargetException;

T t;try {t = clazz.newInstance();for (Field field : fields) {List<String> fieldValues = map.get(field.getName());if (fieldValues != null && fieldValues.size() > 0) {if(field.getType().getName().equals("java.math.BigDecimal")){if(!"".equals(fieldValues.get(0))){BeanUtils.copyProperty(t, field.getName(), fieldValues.get(0));}}else {BeanUtils.copyProperty(t, field.getName(), fieldValues.get(0));}}}} catch (Exception e) {return null;}return t;

以下内容转自他人博客:apache.commons.beanutils.BeanUtils的使用

该class提供了一系列的静态方法操作业已存在的符合JavaBean规范定义的Java Class.这里强调的JavaBean规范,简单来说就是一个Java Class通过一系列getter和setter的方法向外界展示其内在的成员变量(属性).通过BeanUtils的静态方法,我们可以:

  • 复制一个JavaBean的实例--BeanUtils.cloneBean();
  • 在一个JavaBean的两个实例之间复制属性--BeanUtils.copyProperties(),BeanUtils.copyProperty();
  • 为一个JavaBean的实例设置成员变量(属性)值--BeanUtils.populate(),BeanUtils.setProperty();
  • 从 一个一个JavaBean的实例中读取成员变量(属性)的值 --BeanUtils.getArrayProperty(),BeanUtils.getIndexedProperty(),BeanUtils.getMappedProperty(),BeanUtils.getNestedProperty(),BeanUtils.getSimpleProperty(),BeanUtils.getProperty(),BeanUtils.describe();

总的来看BeanUtils类提供了两大类的功能:读,写成员变量.

JAVA对象的值与引用相关推荐

  1. java中是值传递引用传递_Java是按值传递而不是按引用传递

    java中是值传递引用传递 One of the biggest confusion in Java programming language is whether java is Pass by V ...

  2. Java对象的四种引用方式

    本文会按照以下思路进行: (1)Java的四种对象引用的基本概念 (2)四种对象引用的差异对比 (3)对象可及性的判断以及与垃圾回收机制的关系 (4)引用队列ReferenceQueue的介绍 (5) ...

  3. Java对象的四种引用

    前言 在JDK1.2之前,创建的对象只有在处于可触及(reachable)的状态下,才能被程序使用.也就是说,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.垃圾回收器一旦发现这些无用对象, ...

  4. 面试官:说说Java对象的四种引用方式

    我们知道在Java中除了基础的数据类型以外,其它的都为引用类型. 而Java根据其生命周期的长短将引用类型又分为强引用.软引用.弱引用.幻象引用 . 正常情况下我们平时基本上我们只用到强引用类型,而其 ...

  5. java对象默认值_java对象的默认值

    2.4.1 字段和方法 定义一个类时(我们在Java里的全部工作就是定义类.制作那些类的对象以及将消息发给那些对象),可在自己的类里设置两种类型的元素:数据成员(有时也叫"字段") ...

  6. Java对象的打印_java反射原理制作对象打印工具

    主要运用java反射原理,格式化输出java对象属性值,特别是list 和map. MyTestUtil.java package utils; import java.lang.reflect.Fi ...

  7. 一文看懂虚拟机中Java对象的生死判别

    j3_liuliang 通过上面两篇的介绍,相信大家已经知道虚拟机的内存布局和对象创建的过程及在虚拟机中的分布的,那么一个对象创建出来是不可能永生的总会有死亡的时候而虚拟机是如何判定一个对象的生死那就 ...

  8. Java中ListE对象赋值问题(引用传递和值传递)

    Java中List<E>对象赋值操作问题 业务需求是:取2个集合中的交集对象并返回.如下代码,busMap中key值和stocks中Map中的key值相等的对象则返回继续操作,也就是说剔除 ...

  9. Java中方法调用参数传递的方式是传值,尽管传的是引用的值而不是对象的值。(Does Java pass by reference or pass by value?)

    原文地址:http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html 在Java中,所有的对象变量都是引用,Java通 ...

最新文章

  1. 程序员期末试卷_第三部分复习提纲.doc下载
  2. OpenCV图像旋转,指定填充背景颜色边界颜色
  3. MySQL-5.5.33主从复制
  4. 在URL中使用另一个url作为参数时会被``截断的问题
  5. 成立了汽车与智能出行事业部的阿里云,如何建立云上行业生态?
  6. 制造业数据分析存在哪些问题
  7. python 报错 wxPyDeprecationWarning: Using deprecated class PySimpleApp.
  8. 中国税负68%,世界排名12
  9. 可观测性平台下的低代码技术实践
  10. OpenGL超级宝典(第7版)笔记1 清单的初始环境配置part1
  11. 多台电脑同步VSCode的配置和插件
  12. kali安装最新版nessus
  13. RAW图像详解及使用Python读取raw格式图像并显示
  14. Hibernate查询语句拼接乱码问题
  15. SpringBoot配置websocket
  16. 游戏开发论坛_国内游戏开发站点与论坛
  17. 国外7个免费的网络主机服务
  18. ORACLE WITH与性能优化
  19. 飞卡日常进度之山外上位机的二值化模式和灰度模式
  20. css绝对定位之对齐居中版心内容

热门文章

  1. DFS建立准备之基于windows 2008 R2的第二台域控建立
  2. 详解DMZ的部署与配置:ISA2006系列之二十九
  3. RabbitMq(十六)单机多实例集群搭建步骤介绍
  4. 小tip: base64:URL背景图片与web页面性能优化(转载)
  5. foreach之引用的使用
  6. 支付宝的个人捐赠功能
  7. 可重复锁ReentrantLock原理分析
  8. 【MyBatis框架】高级映射-一对一查询
  9. Go Web编程--使用bcrpyt哈希用户密码
  10. kafka可视化客户端工具(Kafka Tool)的使用