我一直学习C++,是java的初学者,这一周正学习java的对象、引用,转载一些自己觉得很有意义的东东,以及java同C++的区别。

Public class Person{
         Public String name;
         Public int age;
         Public void say(String content){
                   System.out.println(content);
         }
}

这样一行代码:

Person p = new Person();

这行代码创建了一个person实例,这个person实例被赋给p变量。程序中定义的person类型的变量实际上是一个引用,它被存放在栈内存里,它指向实际的person对象,而真正的person对象则存放在堆内存中。

下图显示了将person对象赋给一个引用变量的示意图:




Java智能指针 java实现指针功能_语言


栈内存中的引用变量并未真正存储对象里的属性数据,对象的属性数据实际存放在堆内存里。而引用型变量仅仅只是指向该堆内存里的对象。从这个角度来看,引用型的变量与C语言里的指针很像,他们都是存储一个地址值,通过这个地址来引用到实际对象。实际上,java里的引用就是C里面的指针,只是java语言把这个指针封装起来,避免开发者进行繁琐的指针操作。

当一个对象被创建成功以后,这个对象将保存在对内存中,java程序不允许直接访问堆内存中的额对象,只能通过该对象的引用操作该对象。

Java中的引用于C的引用是有区别的,C语言中的引用是指变量的别名,在程序中不会为它分配任何的内存,而java的引用会在栈内存中分配一定的内存,更类似于c的指针。

C语言中的指针的类型与指针的定义

程序中对变量的操作,实际上是对某个地址的存储单元进行操作。这种直接按变量的地址存取变量值的方式称为“直接存取”方式。
指针变量:用来存放内存地址的变量称为指针变量。
设:指针变量p中存放了变量a的地址。则有如下图所示:


Java智能指针 java实现指针功能_c++_02


指针变量的定义:

形式:     类型名    *指针变量名1,指针变量名2,…;

如: int *pi,*pj;

说明:* 是说明符,用来说明该变量是指针变量;

int 是类型名,用来说明 pi 和 pj 是指向整型变量的指针。

指针的类型:指针所指向的变量的类型。

int 也称为 pi 、pj 的“基类型”

如:

int *p;            /*p中只能存放整型变量的地址*/
     double *pd; /*pd中只能存放double类型变量的地址*/                             
     float *pf;             /*pf中只能存放float 类型变量的地址*/
     char *st;            /*st中只能存放字符类型变量的地址*/


又如:

int *p,i,k;
          i=3;
          p=&i;                  /*将i  的地址赋给指针变量*/
          k=*p;              /*将所指地址中的内容赋给k*/


注:int *P ; 此时*P表示指针类型,* 是指针类型说明符,在非定义中的 *p 为所指变量中存放的内容,在此例中代表存储单元i。