Java与C++创建对象方法比较

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中new关键字和c++中的new有什么区别

《Java核心技术 卷1》

《深入理解Java虚拟机:JVM高级特性与最佳实践》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值