正如问题所说,C ++程序员在切换到Java时会遇到哪些常见/主要问题?我正在寻找一些广泛的主题名称或示例以及工程师必须进行的日常调整。然后我可以去深入阅读。
我特别感兴趣的是那些已经使用C ++多年并且不得不使用Java的工程师的意见,但是他们的任何指针甚至是书籍建议都非常受欢迎。
答案 0 :(得分:15)
而是使用这种模式:
OutputStream os;
try {
os = ...
// do stuff
} finally {
try { os.close(); } catch (Exception e) { }
}
你最终会做很多这样的事情。
答案 1 :(得分:7)
我从C ++到Java的最大障碍是放弃了程序代码。我非常习惯在程序中将所有物体绑在一起。没有java中的过程代码,我到处都做了循环引用。我必须学习如何从对象中调用对象,而不是彼此依赖。这是最大的障碍,但最容易克服。
2号个人问题是文档。 JavaDoc非常有用,但是对于许多Java项目来说,误解的是所有需要的东西都是JavaDoc。我在C ++项目中看到了更好的文档。这可能仅仅是对代码之外的文档的个人偏好。
Number 3.在java中实际上有指针,只是没有指针算术。在java中,它们被称为引用。不要以为你可以忽略事物指向的地方,它会带回来。
==和.equals不相等。
==将查看指针(引用),而.equals将查看引用指向的值。
答案 2 :(得分:5)
Generics(而不是模板),特别是使用type erasure实现它们的方式。
答案 3 :(得分:5)
既然您提到了图书建议,请务必阅读Effective Java, 2nd ed. - 它解决了我在答案中列出的大部分陷阱。
答案 4 :(得分:5)
在考虑复制构造函数时意外创建引用:
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?!?!? */
答案 5 :(得分:4)
答案 6 :(得分:3)
习惯拥有垃圾收集器。无法依赖析构函数来清理GC无法处理的资源。
所有内容都是按值传递的,因为传递了引用而不是对象。
没有复制构造函数,除非您需要克隆。没有赋值运算符。
默认情况下,所有方法都是虚拟的,这与C ++相反。
接口的显式语言支持 - C ++中的纯虚拟类。
答案 7 :(得分:2)
这是我所有的一点点语法差异。缺乏析构函数。
另一方面,能够为每个班级编写一个主要版本(非常方便或测试)是非常好的;在你习惯它之后,jar文件可用的结构和技巧真的很棒;语义完全定义的事实(例如,int在各处都是相同的)是非常好的。
答案 8 :(得分:2)
我最糟糕的问题是始终牢记记忆的所有权。在C ++中,这是必须要做的事情,它在开发人员的脑海中创造了一些难以克服的模式。在Java中,我可以忘记它(在很大程度上,无论如何),这使得一些算法和方法在C ++中会非常尴尬。
答案 9 :(得分:2)
Java中没有对象,只有对象的引用。例如:
MyClass myClass; // no object is created unlike C++.
但是:
MyClass myClass = new MyClass(); // Now it is a valid java object reference.
答案 10 :(得分:1)
我读过的最好的Java“gotchas”是Java Puzzlers: Traps, Pitfalls, and Corner Cases。它是不专门针对C ++开发人员,但它充满了你想要注意的事项的例子。
答案 11 :(得分:0)
所有方法都是虚拟的。
参数化类型(泛型)实际上并不创建特定于代码参数的代码(即,List<String>
使用与List<Object>;
相同的字节码。如果您尝试放置编译器,则编译器是唯一抱怨的东西前者Integer
。
Varargs很容易。
答案 12 :(得分:0)
将方法参数指定为final并不意味着您最初认为它意味着什么
private void doSomething(final MyObject myObj){
...
myObj.setSomething("this will change the obj in the calling method too");
...
}
因为java是按值传递的,所以它正在执行您所要求的操作,除非您了解java如何传递引用的值而不是对象,否则不会立即显而易见。
答案 13 :(得分:0)
另一个值得注意的关键字是关键字final
和const
。 Java将const定义为保留关键字,但未指定其大部分用法。还
object1=object2
不会复制更改引用的对象