正如问题所说,C++程序员在切换到Java时会面临哪些常见/主要问题?我正在寻找一些广泛的主题名称或示例以及工程师必须进行的日常调整.然后我可以去深入阅读.
我特别感兴趣的是那些已经使用C++工作多年并且不得不使用Java的工程师的意见,但是他们的任何指针甚至书籍建议都非常受欢迎.
在C++中,您将使用析构函数来清理文件描述符,数据库连接等.天真的等价物是使用终结者.别.永远.
而是使用这种模式:
OutputStream os; try { os = ... // do stuff } finally { try { os.close(); } catch (Exception e) { } }
你最终会做那样的事情.
如果您没有指定访问修饰符,则在Java中,默认情况下成员是包私有的,这与它们是私有的C++不同.Package-private是一个讨厌的访问级别,这意味着它是私有的,但同一个包中的任何东西都可以访问它(这是一个愚蠢的默认访问级别imho);
没有堆栈/堆分离.一切都是在堆上创建的(嗯,这不是严格的,但我们会假装它);
没有传递参考;
等效于函数指针的是匿名接口.
从C++到Java的最大障碍是放弃了程序代码.我非常习惯在程序中将所有物体绑在一起.没有java中的过程代码,我到处都做了循环引用.我必须学习如何从对象中调用对象,而不是彼此依赖.这是最大的障碍,但最容易克服.
2号个人问题是文档.JavaDoc非常有用,但是对于许多Java项目来说,误解的是所有需要的东西都是JavaDoc.我在C++项目中看到了更好的文档.这可能只是个人偏好代码之外的文档.
数字3.事实上在java中有指针,只是没有指针算术.在java中,它们被称为引用.不要以为你可以忽略事物指向的地方,它会带回来.
==和.equals不相等.
==将查看指针(引用),而.equals将查看引用指向的值.
泛型(而不是模板),特别是使用类型擦除实现它们的方式.
既然你提到了书籍推荐,那么一定要阅读Effective Java,第2版. - 它解决了我在答案中列出的大部分陷阱.
在考虑复制构造函数时偶然创建引用:
myClass me = new myClass(); myClass somebodyElse = me; /* A reference, not a value copied into an independent instance! */ somebodyElse.setPhoneNumber(5551234); /* Hey... how come my phone doesn't work anymore?!?!? */