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,并在堆中申请空间,过后需手动释放内存
}