作者james732 (好人超)
站内java
标题Re: [问题] C++和Java的差别
时间Wed Jan 19 22:57:48 2011
我认为Java与C++的一个很大的不同点:
Java的物件都是透过reference去存取,而物件本身皆存在heap上面
在C++里面,要产生一个物件,至少有两种方式:
class SomeClass {
public:
int value;
};
int main() {
/* 方法一:把物件产生在 stack 上,做为区域变数 */
SomeClass obj;
obj.value = 10;
/* 方法二:把物件产生在 heap 上 */
SomeClass *obj_ptr = new SomeClass;
obj_ptr->value = 10;
/* 在C++ 里,用到 new 就要自己释放空间,否则会 memory leak */
delete obj_ptr;
}
在Java里则不一样,物件一律都要产生在heap上,透过reference存取
class SomeClass {
public int value;
public static void main(String[] args) {
/* 以下的写法是有问题的,实际上并没有产生一个物件。
即使通过了编译,也会在执行的时候产生了 exception
事实上,像下面这样写,编译应该也不会过... */
SomeClass obj;
obj.value = 10;
/* 在Java里,这麽写才是真的产生了物件。
另一个重大的差别是,Java不需要使用delete自行回收记忆体 */
SomeClass obj_ref = new SomeClass();
obj_ref.value = 10;
}
}
因为上面这个原因,造成Java的
阵列与C++的使用上也很不一样。
从C++转到Java的使用者,或许犯过这样的错误:
在C++里,想要一个阵列,可以这麽写:
int main() {
int array[10];
}
或者这麽写:
int main() {
int *arr_ptr = new int[10];
delete [] ptr;
}
但在Java里,却要这样:
class ArrayTest {
public static void main(String[] args) {
/* int array[10]; ←Java不允许这麽做 */
int array[] = new int[10];
/* 上面这行也可以写成 int[] array = new int[10]; */
/* 当然,Java不需要使用delete [] */
int array[];
/* 只写上面这样,编译会过,但拿来用的话就会出问题了 */
}
}
因为在Java里,阵列也是一种class,使用阵列就要先产生物件
先前提过,产生物件一定要用new,因此才需要写成这样。
虽然这麽说并不精确,但可以粗略的把Java的reference当作成C++的pointer
除此之外,Java与C++的差别当然还有很多很多,任意列举如下:
(1) Java所有的函式与变数都要属於某个class,包括main,没有全域函式、全域变数
(2) Java具有自动的记忆体管理机制(垃圾回收),不需要delete
(3) Java的class可以指定存取权:譬如private class SomeClass {}之类的写法
(4) Java的Inner class跟C++的Nasted class很不一样
(5) Java的Generic与C++的Template很不一样
(6) Java的method预设皆为virtual,不像C++必须要自己写virtual
(7) Java编译後的Byte code与C++编出来的Machine code不一样
(8) Java动态载入class,与C++必须要在编译时搞定符号连结(link)不一样
..........其实还有很多很多,写都写不完
我觉得Java跟C++根本就是「只是刚好长得有点像」的两种截然不同的语言了...XD
想要更了解它们之间的差异,最好的做法就是请学弟找本书看、并动手写写罗
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.117.171.46
※ 编辑: james732 来自: 140.117.171.46 (01/19 23:18)
1F:推 willieliao:本年第一推...写的很详细! 01/19 23:20
2F:推 walm20:好人! 01/19 23:23
※ 编辑: james732 来自: 140.117.171.46 (01/19 23:25)
※ 编辑: james732 来自: 140.117.171.46 (01/19 23:33)
3F:推 pcedison:大师!! 01/20 01:16
4F:推 love606009:太感谢你了 虽然我不用教得这麽深入啦 还是很谢谢!! 01/20 02:02
5F:→ james732:其实我觉得这些东西不算深入耶.......XD 01/20 11:56
6F:推 AI3767:真不错, 可以让人马上抓到要点^^ 我也趁机多学一点 01/20 23:22
7F:推 realkim:|最近看java也发现这些劳 01/22 17:54
8F:推 dddddd67:Good! 01/29 09:09