1 Java
1.1 语法
创建对象只有一种方式,即使用new操作符,下面的表达式构造了一个新对象
new Date()
如果想要多次使用该对象,就需要定义一个对象变量,该变量可以引用Date类型的对象,但是这个变量并不是一个对象,在初始化之前也并没有引用任何对象,不能将Date方法用于这个变量上。
Date deadline;
必须先对变量deadline进行初始化,有两种方式:
// 1 使用新构造的对象进行初始化
deadline = new Date();
// 2 让该变量引用一个已存在的对象
Date birthday;
birthday = new Date();
deadline = birthday;
第一种初始化方法可以与变量的定义一起,写成下面的形式:
Date deadline = new Date();
看到一个很有意思的比喻,说明对象引用(对象变量)与对象实例的关系。
new运算符,new创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中)。一个对象引用可以指向0个或1个对象(一根绳子可以不系气球,也可以系一个气球);一个对象可以有n个引用指向它(可以用n条绳子系住一个气球)。
来自 https://github.com/Snailclimb/JavaGuide 【Java学习+面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。
1.2 内存分配
‘这张图只能作为示意说明,对象变量在栈中,引用的对象在堆中。
首先,对象变量不能等同与指针,因为在不同的Java虚拟机中有不同的的实现对象访问的方式:1、使用句柄;2、使用直接指针。即使是指针的方式,也和C++有很大不同:对象变量没有解引用操作,而且Java的内存管理由JVM负责,对象可能会被移动,相应的指针也会重新定位。
2 C++
2.1 语法
C++有两种创建对象的方式:
Dog dog;//dog存储在栈内
Dog *p = new Dog();//指针存储在栈内,指向的对象是放在使用new在堆中开辟的一块空间中
第一行的语句就直接完成了初始化,调用了默认构造函数,和Java很不一样,刚开始写Java程序的时候很不适应。
2.2 内存分配
两种方式创建出来的对象分别被放在了栈中和堆中。
3 总结
在csdn上看到的两张图总结得很好。首先是语法方面:
然后是内存分配方面:(a)(b)是C++中的情况,(c)则是Java中的情况。
关于Java对象的内存分配,在《深入理解Java虚拟机:JVM高级特性与最佳实践》中有具体的介绍,应该好好学习一下。
参考
《Java核心技术 卷1》
《深入理解Java虚拟机:JVM高级特性与最佳实践》