问题描述
- Java使用的核心类库是JRE,C++没有类似自己的核心类库,这就是Java可移植性的原因么
-
我只接触过java,而且只用过windows。一直都知道java与其他语言区别之一是可移植性,但具体是什么一直说不清楚。
目前在看swing和awt等关于图形的,有说awt是重量级的依赖于操作系统绘图,移植其他平台,画风大变,效果很差;swing是轻量的,不依赖。
是不是awt底层调用了操作系统已有类库,导致移植其他平台效果很差,而swing自己用底层语言一笔一划做出图形,不用操作系统原有库,所以移植效果好。
那么是不是C++没有自己的向swing,awt这样的核心类库,或者很少。大部分使用功能等同于JRE但是是由本操作系统提供的类库,而不同的操作系统提供的类JRE类库又不是太一样,导致不同操作系统调用这些核心类库的代码(基础程序)就要写的不同,就是不可移植性的特点了。
请问是不是这样的呢。
另外就是awt是重量级,swing是轻量级,为什么呢。swing我看了下,swing类基础是JComponent,这个类里的确有一些绘图的成员变量,比如一个ComponentUI接口,ComponentUI里面有预定义paint方法,我猜是编译器的api接口,实现后编译器会自己绘形状。而awt基础类是Component,里面有个peer接口,关于这个peer介绍是“The peer implements the component's behavior”,是不是这个peer存储的信息就是编译器调用操作系统的api接口。不知道以上猜测是否正确。
解决方案
各有各的好处。一个是调用操作系统控件层面的代码。比如告诉操作系统,这里放一个文本框,那里放一个按钮。一个是调用操作系统绘图层面的代码,比如这里画一个方框,那里填充白色。
前者可以保证程序在不同操作系统下拥有最自然的显示效果,后者保证了在不同操作系统下拥有一致的效果(但是那些awt的界面,总觉得怪怪的)。
可移植性分为几个层次,一个是源代码的可移植性。一个是二进制程序的可移植性。一个是操作系统和软件环境的可移植性。一个是性能的可移植性。Java的可移植性主要说的是二进制程序的可移植性,因为Java不产生特定机器代码,所以可以在不同平台运行。
但是C++完全可以做到源代码层面的可移植性。C++没有类似自己的核心类库这个观点也是不对的。实际上,QT这个库本身就是跨平台的,而且可以让你的C++代码移植到不同的操作系统。典型的,Eclipse就是一个C++写的程序(上层是Java),它为什么在Linux和Windows下有一样的界面,就是这个道理。
虽然Java在二进制代码层面有可移植性,但是这也不是万能的。比如说android的应用,严重依赖操作系统和软件环境,你能拿到windows下运行么?
解决方案二:
c++也有stl标准库。最主要还是当初java的类库更丰富,c++早期类库控制比较严格,很多都是自己做轮子,各个企业都有自己的一套。导致cpp发展缓慢。
解决方案三:
Java可移植性并不是因为核心库,关键谁的
在于编译后的文件,JAVA编译后是生成.class的字节码文件的,而java程序行动依托虚拟机,虚拟机再来加载字节码
所以只要将字节码文件拷贝到其实虚拟机就可以让程序运行了。这才是JAVA一次编程,到处运行的真实原因
C++而不是这样的,在windows,它编译后成生的是一此link文件.dll/lib文件,link文件再组装成exe文件 ,然后直接就可以运行了。而linux下C++又和window
不一样了,所以它们无法实现跨平台
解决方案四:
C++依赖操作系统,所以并不是所有系统都可以运行,而Java依赖虚拟机,所以能装上虚拟机的操作系统都可以运行java程序,当然实际中会有一些问题。理想的是Write One,Run Everywhere。而这样的理想靠的就是虚拟机
解决方案五:
Java核心类库之collections
解决方案六:
Java为什么吹他可移植呢??因为使用Java写的代码不是直接编译成机器码,,,而是编译为Java虚拟机能识别的字节码
你只要编译一次,,字节码都是相同的,,然后你要在不同的平台下运行,,只需提供不同平台的Java虚拟机即可,,
解决方案七:
您好,您写的太多,没能全能明白。我讲几点自己的个人认识,关于可移植性,跨平台。虽然和语言相关比如java,java可以跨平台并不在于语言本身,而在于提供的机制,JAVA虚拟机这个东西才是JAVA可以跨平台的关键。C#也是在UNIX-Like环境下跑的,就看你提供了什么平台。我一直觉得,语言本身的区别尽管有,但更多地在于你如何去运用。JAVA可以做的事情,C,C++,C#理论上都是可以去做的。关于类库,不管是JAVA还是C++都有大量丰富的类供使用,图形图像方面,C++有一定的优势,毕竟C++的年纪更大一些,JAVA的身上不可避免地有C++的影子。以上是我的个人观点,不对之处希望不要误导你,仅供参考