Java对象和引用变量
来源:互联网 发布:ipad读书软件推荐 编辑:程序博客网 时间:2024/06/05 05:04
今天很累不想说太多。原文传送门Java对象和引用变量。
对于引用变量的深层含义,未必在初学的时候就能深刻理解,
所以理解好下面这两句话的真正含义非常重要
Case cc=new Case();Case cc;cc=new Case();
1.先搞清楚什么是堆,什么是栈。
Java开辟了两类存储区域,对比二者的特点
堆栈的存储特点决定了其中存储的数据类型。
注意,栈内存储的除了基本类型的变量(String, int 这种类型的变量)还会存储对象的引用变量。java中,引用变量实际上是一个指针,它指向的是堆内存中对象实例。
引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。
2.给引用变量赋值
回过头再来看代码
实际上里面分解成了四个步骤。
Case cc; '''在栈内存里面开辟了空间给引用变量cc,这时cc=null'''cc=new Case();'''1. new Case()在堆内存里面开辟了空间给Case类的对象,这个对象没有名字2. Case()随即调用了Case类的构造函数3. 把对象的地址在堆内存的地址给引用变量cc'''
这样我们就明确了:
Java中,这里的“=”并不是赋值的意思,而是把对象的地址传递给变量;
对象创建出来,其实连名字都没有,因此必须通过引用变量来对其进行操作。
为了形象地说明对象、引用及它们之间的关系,可以做一个或许不很妥当的比喻。对象好比是一只很大的气球,大到我们抓不住它。引用变量是一根绳, 可以用来系汽球
紧接着就会问,引用变量是怎么传递的呢?
这就涉及到Java唯一的参数传递方式——按值传递
看下面一段代码:
public class ObjectRef { '''基本类型的参数传递''' public static void testBasicType(int m) { System.out.println("m=" + m);//m=50 m = 100; System.out.println("m=" + m);//m=100 } '''参数为对象,不改变引用的值''' '''s即sMain指向的对象执行了append方法,在原来的字符串上加了段“_add”''' public static void add(StringBuffer s) { s.append("_add"); } '''参数为对象,改变引用的值 ''' '''引用变量指向了一个新的对象,已经不是sMain指向的对象了''' public static void changeRef(StringBuffer s) { s = new StringBuffer("Java"); } public static void main(String[] args) { int i = 50; testBasicType(i); System.out.println(i);'''i=50''' StringBuffer sMain = new StringBuffer("init"); System.out.println("sMain=" + sMain.toString());'''sMain=init''' add(sMain); System.out.println("sMain=" + sMain.toString());'''sMain=init_add''' changeRef(sMain); System.out.println("sMain=" + sMain.toString());'''sMain=Java''' }}
看这里,给人的感觉是传递过来的明明是对象的引用,为什么就是值得传递呢?
因为传递之前,被传的就是个引用啊,我们所谓的“传地址”,在传之前,那可是一个实例,传过来的是实例的地址。这里传递的值,从始至终就是个地址,sMain就是个地址,传给s还是个地址。你们感受下:
'''参数为对象,不改变引用的值''' '''s即sMain,指向的对象执行了append方法,在原来的字符串上加了段“_add”''' public static void add(StringBuffer s) { s.append("_add"); }
以上输出的结果会是“init_add”
而这里,s引用了一个新的对象,根本没有进行参数的传递,它和之前的sMain没有关系了。
'''参数为对象,改变引用的值 ''' '''引用变量指向了一个新的对象,已经不是sMain指向的对象了''' public static void changeRef(StringBuffer s) { s = new StringBuffer("Java"); }
以上输出的结果会是“Java”
引用《Java编程思想》中的一段话:
倘若“将一个对象赋值给另一个对象”,实际是将“引用”从一个地方复制到另一个地方:
参考文章:
Java对象及其引用:http://blog.sina.com.cn/s/blog_4cd5d2bb0100ve9r.html
java堆栈详解 :http://blog.csdn.net/bangbt/article/details/6232299
- Java对象和引用变量
- Java对象和引用变量
- JAVA对象、对象引用变量
- java中引用类型的变量和对象的区别
- Java对象及对象引用变量
- Java对象及对象引用变量
- Java对象及对象引用变量?
- Java对象及对象引用变量
- Java对象及对象引用变量
- Java对象及对象引用变量
- Java对象及对象引用变量
- java 对象和引用
- java引用和对象
- 《编程导论(Java)·2.4.2 (引用)变量、引用和对象》
- Java对象和对象引用
- 【Java】-- 对象和对象引用
- java对象和对象引用
- java引用变量和堆栈
- pandas-Series
- c语言字符串常量
- angular学习总结六——管道的用法
- AndroidStudio中Gradle插件版本更新至3.3
- 软件工程之软件过程模型
- Java对象和引用变量
- UltraEdit激活
- 79.查询单词
- Java学习笔记-类与对象(对象内存分析)
- Mybatis使用PageHelper步骤
- 正则表达式笔记
- equals和==在java中的区别
- vue饿了么学习-第二篇(webpack)
- Java Serializable(序列化)