本文主要对比Java与C++在创建对象时的不同,仅代表个人观点,如有不合理之处,望大家批评指正。闲话少说,直奔主题。
Java和C++都是面向对象的编程语言,然而Java和C++在创建对象时却存在不同的方式,由于方式的不同导致在内存中管理的不同。
1、C++创建对象方式
在C++中我们可以采用如下两种方式来创建对象,
1 Dog dog;//Dog为类名
2 Dog *p = new Dog();
这两种方式在C++中都能完成对象的创建,但是在内存中的处理却完全不同。
对于第一种方式而言,dog是被存储在栈中的,占用的大小是Dog类中成员变量占用内存的和,此处不包括成员方法,因为成员方法是存放在公共存储区以便所有该类的对象都可以访问的。
图1 C++创建对象方式1的内存分配
对于第二种方式则不同,该方式使用了指针,在定义*p时在栈中开辟一个4字节的空间,new Dog()时在堆中开辟一块空间,然后将该空间的首地址赋值给*p,这样,通过*p就可以找到对象在堆中的任何成员方法了。
图2 C++创建对象方式2的内存分配
2、Java创建对象方式
在C++中我们有两种创建对象的方式,而在Java中只提供了如下的一种方式,
1 Dog dog = new Dog();
JVM在进行内存管理时,首先会在栈中给dog分配一个空间,当new Dog();后会在堆中开辟对象的实际空间,然后将dog指向堆中的空间,这样我们就可以方法对象的成员变量了。
图3 Java创建对象方式的内存分配
3、总结
通过图2和图3我们会发现Java创建对象的方式和C++创建对象方式的第二种很像,除了我故意写的p和dog还有数字,其他的都是一样的。是这样的,他们的确很像,但是却不完全相同,在C++中p是一个指针,通过指针我们可以访问内存中的任何地址,可以肆意的对内存做处理,然而在Java中dog是一个引用,可以理解成是C++中指针的一个封装,我们不可以想在C++中用指针那样在Java中直接的进行地址++操作,这样一来就保证了内存的安全,这是C++和Java的很大不同。
本人文字功底极弱,若有描述不清或不当之处,望大家指正,感谢各位花费时间阅读完毕。