赞
踩
看下面一个例子仔细思考一下吧
public class CallByValue { private static User user=null; private static User stu=null; /** * 交换两个对象 * @param x * @param y */ public static void swap(User x,User y){ User temp =x; x=y; y=temp; } public static void main(String[] args) { user = new User("user",26); stu = new User("stu",18); System.out.println("调用前user的值:"+user.toString()); System.out.println("调用前stu的值:"+stu.toString()); swap(user,stu); System.out.println("调用后user的值:"+user.toString()); System.out.println("调用后stu的值:"+stu.toString()); }
输出结果:
调用前user的值:User [name=user, age=26]
调用前stu的值:User [name=stu, age=18]
调用后user的值:User [name=user, age=26]
调用后stu的值:User [name=stu, age=18]
总结:
首先需要知道一个对象的结构:
对象头又包括三部分:MarkWord、元数据指针、数组长度。
实例数据就不用说了,
关于对齐填充
Java 中基础数据类型是在栈上分配还是在堆上分配?
我们继续深究一下,基本数据类占用内存大小是固定的,那具体是在哪分配的呢,是在堆还是栈还是方法区?大家不妨想想看! 要解答这个问题,首先要看这个数据类型在哪里定义的,有以下三种情况。
他们的区别就是:
这里借用一张书中的图片:
那么如果实现深拷贝呢?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。