C++是编译型语言
首选把源代码编译生成机器语言,然后由机器运行机器码。
优点是执行速度快、效率高;缺点是依赖依赖编译器,跨平台性差。
java是解释型语言
源代码不像c++那样直接翻译成机器语言,它是先翻译成中间代码(.class字节码),再由解释器(jvm)进行解释运行。优点是跨平台性好,缺点是执行速度相对慢、效率低
注意
网上还有java是,半编译、半解释型语言的说法,我对这个说法的理解是:半编译指java编译器(javac)把源代码没有一步到位编译成机器语言,而是编译成中间代码字节码,半解释指Java解释器(jvm)继续把字节码解释成机器语言运行。
java跨平台的原理
为什么同样的Java代码在不同的平台(windows、linux、mac)甚至不需要任何改动就能运行?原因是同样的Java代码编译成的字节码都是一样的,那么你把相同的字节码拿到不同平台,比如windows,那么就由windows版的jvm解释,同理在linux、mac平台,也都有对应平台的jvm来解释运行,也就是说功劳最大的就是jvm,在这里起到一个类似转换器的作用。
java与c++的区别细谈
1.C++是平台相关的,java是平台无关的。原因前面讲解过
2.c++对所有的数字类型有标准范围限制,但是字节长度是跟具体实现相关的,相同类型,在不同操作系统长度可能不一样;java在所有平台上对所有的基本类型都有标准的范围限制和字节长度。
3.c++在大多数情况跟c语言兼容,java没有对任何之前的语言向前兼容。但是语法上受到c++的影响很大(因为Java的设计者Gosling、Joy和Steele曾经在C++项目上工作过,他们受到了C++的一些特性和语法的启发)。
4.c++允许直接调用本地的系统库;Java要通过JNI(JNI是Java提供的一种机制,允许Java代码与本地的C、C++代码进行交互。)或JNA(JNA是另一种Java库,它提供了简化的方式来调用本地系统库,而无需编写繁琐的JNI代码。JNA使用Java的反射机制,允许Java程序直接调用本地库中的函数和数据结构。)调用
5.c++同时允许面向过程、面向对象程序设计;java必须使用面向对象的程序设计方式。
6.c++支持指针(在C++中,指针是一种变量,它存储了一个内存地址。通过指针,我们可以直接访问或修改该地址处的数据。),引用(引用可以看作是指向变量的别名,对引用的操作实际上是对原变量的操作。),传值(传值调用会将实参的值复制一份给形参,函数内部对形参的修改不会影响到原变量)调用;java只有值传递(对于基本类型(如int、float、boolean等)的参数传递,Java会将实参的值复制一份给形参,函数内部对形参的修改不会影响到原变量。这是因为基本类型的值是存储在栈内存中的,每个变量都有自己独立的存储空间;而对于引用类型(如对象、数组等)的参数传递,实际上是将引用的值(即对象的地址)复制一份给形参,形参和实参都指向同一个对象。因此,在函数内部修改形参对象的属性或调用其方法会影响到原对象,因为它们指向同一个内存地址)上图:
7.c++需要显式的的内存管理,但是有第三方框架提供垃圾搜集的支持,支持析构函数(C++中,析构函数是一个特殊的成员函数,它在对象被销毁时自动调用。析构函数的主要作用是在对象销毁之前进行清理工作,比如释放动态分配的内存、关闭文件等。);java是自动垃圾收集的,没有析构函数的概念。
8.c++支持多继承,包括虚拟继承;Java只允许单继承,需要多继承的场景要使用接口。