Java内存分配及值、引用的传递
关于堆栈的内容网上已经有很多资料了,这是我找的加上自己理解的一篇说明文:
一、内存区域类型
1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制;
2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(对象可能在常量池里)(字符串常量对象存放在常量池中。);
3. 堆:存放所有new出来的对象;
4. 静态域:存放静态成员(static定义的);
5. 常量池:存放字符串常量和基本类型常量(public static final)。有时,在嵌入式系统中,常量本身会和其他部分分割离开(由于版权等其他原因),所以在这种情况下,可以选择将其放在ROM中 ;
6. 非RAM存储:硬盘等永久存储空间 (摘抄地址:http://blog.csdn.net/clam_clam/article/details/6829960)
二、栈中放的东西,图示:
int i =2;//基本类型变量的数据 String s="abc";//s为引用
String s1=new String("a");//s1也是引用

三、堆存放示意图:

对于String类的对象特别说明一下:
String a="abc";//代码在执行后在常量池中创建了一个值为abc的String对象;
String b="abc";//执行时,因为常量池中存在abc,所以就不再创建新的String对象了
String c=new String("xyz");
String d=new String("xyz");
/**
*class被加载时,"xyz"被作为常量读入,在常量池中创建了一个共享的值
*为"xyz"的String对象;然后调用到new String("xyz")的时候,会在堆里创建这个String("xyz")对象。
*/
String s1=new String("xyz");//创建了两个对象(一个在常量池中,一个在堆中),一个引用(栈中)
String s2=new String("xyz");//创建一个对象(堆中),一个引用(栈中)
String s3="xyz";//创建一个对象放在常量池中,一个引用(栈中)
String s4="xyz";//创建一个引用,指向"xyz"
四、按值传入还是引用传入
理解了堆栈数据存储,再来理解一下值传递和引用传递的概念;
1、基本类型:
public class ChangeGender{
public static void change(String gender) {
gender="女";
System.out.println("手术期间: gender= " + gender);
}
public static void main(String[] args) {
String gender="男";
System.out.println("变性前"+gender);
change(gender);
System.out.println("变性后:"+gender);
}
输出结果:
变性前:男
手术期间:女
变性后:男
经过了痛苦的手术后,发现自己还是个男的,这是为啥?换个写法你就懂了:
public class ChangeGender{
public static void change(String girl) {
girl="女";
System.out.println("手术期间: gender= " + girl);
}
public static void main(String[] args) {
String boy="男";
System.out.println("变性前"+boy);
change(boy);
System.out.println("变性后:"+boy);
}
输出结果:
变性前:男
手术期间:女
变性后:男
懂了吧,传给change()方法的参数值由boy传递,传完就由girl这个变量来处理了,手术期间的那个值是girl这个变量的值,手术前后的那个值是boy的。这个过程可以用一个故事总结一下:一个男人不想做男人了,准备做手术换个性别,于是打电话给快递小哥(变量boy)把他送到医院手术台上,快递小哥见到医生后,把那个男的交给了会变性的医生(方法change()),快递小哥就走了(快递小哥还是快递小哥),医生开始工作,把他的性别变成女的(girl="女"),那个男的确实手术成功了,只是我们打印的变性后的属性是快递小哥的。故事结束,完美!
2、引用传值
引用要这样来理解:它是一根绳子,它系着一个球(对象),但它不是球(对象),我们想找到球(对象),就得先找对应的绳子。

看栗子:
public class User {
private String age;
public void getGirlAge(User user) {
user.setAge("18");
}
// getter、setter方法
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public static void main(String[] args) {
User user = new User();//创建一个新的User对象
user.setAge("20");//设置年龄 ①
user.getGirlAge(user);//调用User的save()方法
System.out.println(user.getAge());//输出年龄 ②
}
}
输出的结果是什么?
18
为啥是这个结果,还是来说个故事,你同学给你介绍对象,说这姑娘白白嫩嫩,漂亮地一塌糊涂,你说好呀好呀,那她多大呀?你同学是马大哈,记不得年龄,就跟你说20岁(user.setAge("20")),然后你说确定吗?我才19岁,年龄大的一概不考虑,于是你同学就去找她的年龄(public void getGirlAge(User user)),得到了年龄并把这个年龄保存在大脑中(user.setAge("18")),然后打电话跟你说的时候,把年龄的信息从大脑里拿出来(user.getAge()),18岁是你可以接受的年龄,于是你们就安排见面了...再一次,完美。
那再加个东西,你们看看:
public class User {
private String age;
public void getGirlAge(User user) {
user=new User();//创建新的user对象
user.setAge("18");
}
// getter、setter方法
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public static void main(String[] args) {
User user = new User();//创建一个新的User对象
user.setAge("20");//设置年龄
user.getGirlAge(user);//调用User的save()方法
System.out.println(user.getAge());//输出年龄
}
}
这里输出的值是20,看来对象是谈不成了,这过程中到底发生了什么呢?原来是你的同学找那个姑娘的年龄的时候,发现那个姑娘把你同学拉黑了,你同学好面子,还是得给你介绍,于是又找了一个新的姑娘(user=new User();),还把年龄设成了18岁,你等啊等,等了半年也没等到,于是你开始着急了,想知道这个姑娘的年龄到底是多少,于是打印输出姑娘年龄,可是这个姑娘还是第一个姑娘(你也根本就不知道还有第二个姑娘),得到的就是20,年龄虽然比你大一点,可是半年时间,你也想清楚了,年龄大一点体贴也挺好。于是。。。好了,依然完美!
就扯这么多,堆栈中放的东西都是固定的,大家记忆一下就好,很简单的。
Java内存分配及值、引用的传递的更多相关文章
- Java当中的内存分配以及值传递问题内存解析
首先必须说明作为Java程序员对于内存只要有大致的了解就可以了,如果你对Java当中的某一个知识点在不需要分析内存分配过程的情况下可以掌握,那就大可不必去研究内存.如果你对知识点已经掌握,那么你应该把 ...
- java内存分配和String类型的深度解析
[尊重原创文章出自:http://my.oschina.net/xiaohui249/blog/170013] 摘要 从整体上介绍java内存的概念.构成以及分配机制,在此基础上深度解析java中的S ...
- Java 内存分配全面浅析
本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个系统的介绍. 进入正题前首先要知道的是Java程 ...
- Java内存分配全面浅析
本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个系统的介绍. 进入正题前首先要知道的是Java程 ...
- Java内存分配全面浅析(转)
原文引自CSDN: 本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个 ...
- 【转载】Java 内存分配全面浅析
本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个系统的介绍. 本文转载自袭烽大神的博客,原文链接 ...
- JAVA基础-栈与堆,static、final修饰符、内部类和Java内存分配
Java栈与堆 堆:顺序随意 栈:后进先出(Last-in/First-Out). Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过new.newarray.anewarray和mu ...
- 【转】java内存分配和String类型的深度解析
一.引题 在java语言的所有数据类型中,String类型是比较特殊的一种类型,同时也是面试的时候经常被问到的一个知识点,本文结合java内存分配深度分析关于String的许多令人迷惑的问题.下面是本 ...
- Java 内存分配全面浅析(转)
本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个系统的介绍. 进入正题前首先要知道的是Java程 ...
随机推荐
- UTF-8里包括GB2312
用最易懂的说法就是UTF-8里包括GB2312.UTF-8是国际通用的标准(包括世界所有的语言),而GB2312(只是简体中文)只适合做中文的网站. 假设你想做个中文网页,但是还可以翻成英文的话,就得 ...
- HTML&CSS 学习网站收藏【转】
转自:http://lab.linxz.de/some_url.html html & CSS http://www.adobe.com/devnet/html5/articles/css3- ...
- java Object对象的clone方法
参考copy链接:http://blog.csdn.net/bigconvience/article/details/25025561 在看原型模式,发现要用到clone这个方法,以前和朋友聊过,没怎 ...
- 201621123005《Java程序设计》第十二次作业
<Java程序设计>第十二次作业 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 面向系统综合设计-图书馆管理系统或购物车 使用流与文件改造 ...
- 在.NET开发中的单元测试工具之——NUnit
NUnit介绍 NUnit是一个专门针对于.NET来写的单元测试框架,它是xUnit体系中的一员,在xUnit体系中还有针对Java的JUnit和针对C++的CPPUnit,在开始的时候NUnit和x ...
- 错误 1 类,结构或接口成员声明中的标记"="无效
using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace Console ...
- protel99 se中出现许多Backup of 文件,修改过保存时,总会出现备份文件,怎么才能取消这一设置?
在file选项左边有个向下的大箭头标示 点开 有个prefereces项 点开之 把create backup项勾掉即可
- SoftMax多分类器原理及代码理解
关于多分类 我们常见的逻辑回归.SVM等常用于解决二分类问题,对于多分类问题,比如识别手写数字,它就需要10个分类,同样也可以用逻辑回归或SVM,只是需要多个二分类来组成多分类,但这里讨论另外一种方式 ...
- ASP.NET CORE网站部署到 windows server 的IIS 上去
章基于我自己经验的一个总结,在windows服务器上部署asp.net core网站.环境是 windows server 2012数据中心版本 第一步先安装 IIS 服务器 接下来就是一路下一步,然 ...
- linux 服务器性能调优总结
1.性能分析的几个方面 https://blog.csdn.net/w174504744/article/details/53894127 2.cpu 性能分析工具 perf https://blog ...