---
title: '句柄、引用、指针与对象'
pubDate: 2018-09-15
tags:
  - 'programming'
description: '句柄、引用、指针与对象'
---

首先要分清是在什么地方讨论，在以前学C时，是这么区分:

1. 指针是对象在内存中的地址；
2. 引用是对象的别名，其实质就是功能受限但是安全性更高的指针；
3. 句柄是指针的指针，句柄实际上是一个数据，是一个Long (整长型)的数据。句柄是一个标识符，是拿来标识对象或者项目的，它就象我们的姓名一样。

Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下，Windows内存管理器经常在内存中来回移动对象，依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化，我们该到哪里去找该对象呢?为了解决这个问题，Windows操作系统为各应用程序腾出一些内存储地址，用来专门登记各应用对象在内存中的地址变化，而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后，把对象新的地址告知这个句柄地址来保存。

然后我们回到JAVA来解释这个问题：

Java中有3个数据类型：基本数据类型、引用类型和null类型。其中，引用类型包括类类型（含数组）、接口类型。为了区别引用类型的变量标识符和基本数据类型变量标识符，我们特别的（特意的）使用Handle来称呼引用类型的变量标识符。对象的引用是创建对象时的返回值！引用是new表达式的返回值。new A(); 这里真正创建了一个对象，但我们没有用句柄去持有（hold、拿着、保存）该引用。handle是变量，reference是一种变量值。

```
A a = new A() ;
```

1. 句柄a——常见为A a；或A a=new A()；前者没有被初始化，后者被手工初始化。（如果a是一个类的成员变量，会被默认初始化。）句柄不同于基本变量的关键，它是一种间接寻址方式。句柄声明常常称为对象声明（如果你感到可能引起混淆，不理睬对象声明的说法好啦）。
2. 创建对象——new A()；这才是真正的创建对象。对象一般通过new表达式来创建。
3. 计算new表达式的值：计算new表达式的值的整个过程，在微观上完成了对象的创建和这个对象自己的成员变量的初始化，在宏观上得到new表达式的值，这个值称为新对象的引用；
4. 引用：new A()的值。引用可以简单的看作对象占据内存空间的地址；通过对象的引用，就可以方便的与其他对象区别开来，引用就是对象独特的身份标识。
5. 句柄的初始化：句柄 = 引用；即把引用赋值给句柄，如语句a=new A()；完成句柄的初始化后，就可以用句柄遥控对象了。
6. 对于语句A a=new A()；是对象创建及对象初始化与句柄的初始化的合并。
