Java和c++构造函数的区别是什么?

如果你是一个c++程序员,现在正在学习Java,你会发现这两种流行的面向对象编程语言有很多相似之处。这两种语言都支持抽象、封装、类、对象和其他OOP概念。但是,也有一些细微的差别。Java和c++都有构造函数,它们在Java中的工作方式与在c++中的工作方式相同。但是,他们的名字是不一样的。

例如,在Java中,必须使用new()操作符调用构造函数。在创建对象时没有其他方法显式地调用构造函数,但是在c++中,您可以在不使用新运算符的情况下调用它。对于同时了解Java和c++的程序员来说,这也是一个很好的面试问题。

现在,在c++和Java之间切换上下文并不容易,尤其是在面试过程中,但这也是测试应聘者经验的一个完美方法。一个在Java工作了几年的有经验的c++程序员应该知道他们头脑中的区别。

如果你有c++背景,正在寻找一本学习Java的好书,那么看看Cay S. Horstmann的《Core Java》第一卷。Horstmann在引入Java新概念时将c++引入了一个新的视角。因此,您将发现Java中的泛型与c++中的模板的比较,这有助于快速理解这个概念。

Java和c++构造函数的区别是什么

正如我所说的,c++和Java都支持构造函数,但是调用它们的方式不同。没有new()操作符就不能调用Java构造函数。当您使用new()操作符时,JVM会隐式地调用它们,但是您可以在c++中调用构造函数而不使用新的操作符。

事实上,这是c++程序员在进行Java编程时经常犯的错误之一;下面的代码在c++中可以很好地工作,但是在Java中不行:

Course scala("Scala", 2, 300);

在Java中,它应该看起来像:

Course scala = new Course("Scala", 2, 300);

此外,Java对象总是在堆中构造,即使您在方法或块中创建它。

下面是c++和Java的一些更明显的区别:

  • c++支持指针运算,但Java不支持。
  • c++支持多重继承,但Java不支持。
  • c++没有垃圾收集器,内存管理是开发人员的责任;但是Java有GC。
  • c++不是平台独立的,但是Java是。

C++ vs. Java 构造器

在构造函数方面,c++和Java还有一个更重要的区别。c++有构造函数和析构函数,而Java只有构造函数。

Java中没有析构函数。一旦对象有资格进行垃圾收集,也就是说,一旦它的工作完成,并且没有指向它的活动引用,垃圾收集器就会从对象中回收内存。垃圾收集器是JVM的一部分。

看起来可能有点混乱,Java确实提供了finalize()方法,c++开发人员常常将其误认为析构函数,这是不正确的。finalize()方法不回收内存;当垃圾收集器回收内存时,JVM甚至不能保证调用它。

它的规范说,它可以在对象被垃圾收集之前调用,并给对象最后一次机会来清理它所持有的资源。虽然不建议调用finalize方法或进行一些清理,但这并不能保证。要了解更多信息,请查看Joshua Bloch在他的《高效Java》一书中关于最终敲定的建议。

除了使用finalize之外,谷歌本身还发现了以下信息:

如果您依赖finalize()来释放系统资源,例如数据库连接、文件句柄等,那么您的程序很可能会出现资源泄漏。

这就是c++和Java构造函数的区别。它们的工作方式类似,并且两者都用于创建对象并初始化它们,但细微的区别在于如何调用它们。您可以在c++中调用构造函数,而无需使用new关键字,这在Java中是不可能的。因此,如果您是在c++背景下学习Java的,请确保您总是在Java的构造函数中使用new关键字。

原文发布于微信公众号 - 程序你好(codinghello)

原文发表时间:2018-08-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python小屋

Python正则表达式中的贪心模式和非贪心模式

声明:最近发现有人利用我在百度云盘里免费分享的127课Python视频盈利,并声称获得我的授权。在此,我声明,文末百度云盘里的Python视频是免费的,不会授权...

2837
来自专栏java一日一条

关于 Java 你不知道的十件事

作为Java 控,我们总是对不太可能直接使用,但能使我们更了解 Java 和 Java 虚拟机(Java Virtual Machine,JVM) 的晦涩细节感...

1101
来自专栏web前端教室

js数据结构与算法--散列

不扯淡了,还是来学技术吧。 散列,是一种常用的数据存储技术,优势在于可以快速的插入或取出,使用它的数据结构,叫散列表。 它的优势哈,插入、删除、取用数据都很快,...

21610
来自专栏Java帮帮-微信公众号-技术文章全总结

Java面试系列1

Java面试系列1 1 静态变量和实例变量的区别? 静态变量也称作类变量,由static修饰,如:static int s; s就是静态变量,它只能通过类来访...

2805
来自专栏青玉伏案

设计模式(十):从电影院中认识"迭代器模式"(Iterator Pattern)

上篇博客我们从醋溜土豆丝与清炒苦瓜中认识了“模板方法模式”,那么在今天这篇博客中我们要从电影院中来认识"迭代器模式"(Iterator Pattern)。“迭代...

19810
来自专栏Python入门

Python正则表达式的简单应用和示例演示

今天小编给大家分享的是Python正则表达式的简单应用和示例演示,将前面学习的Python正则表达式做一个概括。

962
来自专栏斑斓

当函数成为一等公民时,设计模式的变化

GOF提出的设计模式,其本质思想是封装变化。故而,创建型模式封装的是对象创建的变化,结构型模式封装的是对象之间的协作与组合结构,行为型模式则封装了对象行为的变化...

3115
来自专栏阿凯的Excel

Python读书笔记23(浅谈为什么要用类)

题外话:好几个朋友和我提出最好能写一个Python入门的合集版,我会尽快将基础知识分享完,然后重新整理一下过去分享的所有材料。 如果只是想学P...

3626
来自专栏Java呓语

工厂方法模式(延迟到子类来选择实现)

1、工厂方法模式理念介绍 2、它与简单方法模式的区别 3、推荐使用工厂方法的场景 4、在Android 源码中的应用

774
来自专栏软件开发 -- 分享 互助 成长

sort+结构体实现二级排序

之前介绍的sort函数由于其效率较高,使用较为简单让我用起来那叫一个爽,今天再写一篇使用sort+结构体实现二级排序的方法。 还是先想个问题吧,比如我想输入5个...

1879

扫码关注云+社区

领取腾讯云代金券