Java对象和引用变量

原创 2016年08月31日 00:45:30

对于引用变量的深层含义,未必在初学的时候就能深刻理解,
所以理解好下面这两句话的真正含义非常重要

Case cc=new Case();

Case cc;
cc=new Case();

1.先搞清楚什么是堆,什么是栈。
Java开辟了两类存储区域,对比二者的特点

存储区域 存储内容 优点 缺点 回收
基本类型的变量和对象的引用变量 存取速度比堆要快,仅次于寄存器,栈数据可以共享 存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量 当超过变量的作用域后,Java会自动释放掉该变量,内存空间可以立即被另作他用
由new等指令创建的对象和数组 可以动态地分配内存大小,生存期也不必事先告诉编译器 由于要在运行时动态分配内存,存取速度较慢 由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中引用变量

String s = new String("abc");创建了几个String Object? 引用变量与对象的区别; 字符串文字"abc"是一个String对象; 文字池(pool of l...
  • yufaw
  • yufaw
  • 2012年06月21日 14:08
  • 3043

Java中的基本类型和引用类型变量的区别

基本类型:基本类型自然不用说了,它的值就是一个数字,一个字符或一个布尔值。引用类型:是一个对象类型,值是什么呢?它的值是指向内存空间的引用,就是地址,所指向的内存中保存着变量所表示的一个值或一组值。 ...
  • jessieca
  • jessieca
  • 2007年09月26日 15:57
  • 22441

Java基本类型变量与引用类型变量

Java基本类型变量与引用类型变量  (2013-04-08 20:47:54) 转载▼ 标签:  java   设计模式   java设计模式 ...
  • h183288132
  • h183288132
  • 2015年04月22日 17:13
  • 1401

JAVA基础 引用类型变量和基本类型变量

一     基本类型的变量名是变量本身。   包括八种基本数据类型 引用类型变量的名字是复杂数据的存储地点。包括类   数组(字符串)   接口 String s="Hello world!...
  • qq_35809245
  • qq_35809245
  • 2016年08月16日 22:32
  • 1235

Java: 变量的值和引用

广义的说,在 Java 中,凡是可以指向一个对象或包含一个值的标识符,都可以称为变量。变量的内容,有可能是一个值,也有可能是指向一个对象的引用。当变量的类型为基本型别(short, byte, int...
  • YidingHe
  • YidingHe
  • 2009年05月21日 10:31
  • 5376

Java变量之间传值- 值传递还是引用传递的讨论

Java变量之间传值时可分为值传递和引用传递, 那么它们有何区别?   1. 简单类型是按值传递的     Java 方法的参数是简单类型的时候,是按值传递的(pass by val...
  • matricer
  • matricer
  • 2016年09月17日 20:01
  • 1653

Java中对象和引用的理解

偶然想起Java中对象和引用的基本概念,为了加深下对此的理解和认识,特地整理一下相关的知识点,通过具体实例从两者的概念和区别两方面去更形象的认识理解,再去记忆。 一、对象和引用的概念: 在Java中...
  • u011389474
  • u011389474
  • 2017年01月10日 16:14
  • 997

java--对象引用与对象的区别

在java学习中,理解对象以及对象的引用是万里长征的第一步。但是,现在大量的java学习书籍都将对象以及对象的引用混为一谈,然而实际上它们有着本质的区别。为了帮助更多的java学者更好的理解,我将自己...
  • qq_26805137
  • qq_26805137
  • 2016年10月27日 14:50
  • 6668

浅谈一下JAVA对象,对象引用以及对象赋值

浅谈一下JAVA对象,对象引用以及对象赋值          今天有班级同学问起JAVA对象的引用是什么。正好趁着这次机会,自己总结一下JAVA对象,对象引用以及对象赋值。自己总结了所看到的网上相关...
  • z69183787
  • z69183787
  • 2014年03月12日 22:53
  • 5923

Java中同一个类下一个方法怎样访问另一个方法下的变量

Java中同一个类下一个方法怎样访问另一个方法下的变量
  • wangyanming123
  • wangyanming123
  • 2016年03月29日 10:43
  • 3495
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java对象和引用变量
举报原因:
原因补充:

(最多只允许输入30个字)