JAVA中对象和引用是有区别的,我们可以把引用看作遥控器,把对象看作电视机,遥控器通过发射红外线来遥控电视机,在JAVA中我们把发射红外线的过程称为传递消息,即引用通过传递消息来对对象进行相应的操作。
我们来看一个简单的例子:

class FightPlane{
	String name;//战斗机的名字
	int missileNum;//导弹数量
}
class Plane{
    public static void main(String[] args){
    new FightPlane();
    FightPlane fp;
    fp=new FightPlane();
    }
}

在FightPlane这个类之中,有两个类域变量name和missileNum(C++中叫做数据成员)。

当执行:new FightPlane;这条代码时,系统会根据类模板产生一个FightPlane类的对象,并在计算机内存(其实就是在堆之中)为这个对象分配一块新的独立空间,这个空间里面存放着name和missileNum。

当执行:FightPlane fp;这条代码时,系统会创建一个名为fp的FightPlane类型的变量,此时并没有产生FightPlane类的对象fp,fp只是一个变量。

当执行:fp=new FightPlane();这句话时,fp变为了FightPlane类型的引用,存放的是FightPlane类的对象的地址,而fp存放的地方是在main()方法栈里,产生的对象存放在堆之中。可以通过fp来操控产生的那个FightPlane类对象,就像使用fp牌的遥控器来遥控“FightPlane类的对象”牌的电视机一样。

那么这里我要问了,Java中JAVA对象的创建相比C++对象的创建有什么区别呢?
首先,当执行FightPlane fp;这句代码的时候,C++会为立即创建一个FightPlane类的对象fp,并存放在栈之中;而java不会产生对象,此时fp存放的地方也是在栈中。

其次,C++创建对象的两种方式之中,使用new的方式产生的对象,存放在堆之中。使用FightPlane s; 这种形式产生的对象存放在栈之中;而Java的对象则是一直存放在堆中,对象的引用存放在栈之中。

如下例:

class FightPlane{
	String name;//战斗机的名字
	int missileNum;//导弹数量
}
int main(){
    FightPlane s; //定义标识符s,并在栈中申请空间
    FightPlane* s = new FightPlane();  //定义s,并在堆中申请空间,过后需手动释放内存
}