`
llfzy
  • 浏览: 15969 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
文章分类
社区版块
存档分类
最新评论

从C++转到Java需注意的地方

阅读更多

1.Java在虚拟机上运行


Java源代码并不是被编译成为普通的机器代码。而是被翻译成为虚拟机可以执行的代码。一个Java解释器最终执行这些代码。这其中没有连接的过程;解释在需要的时候动态的加载一些类;


2.Java是完全面向对象的


Java是一种完全面向对象的语言。这意味着你对任何一个Java对象所做的动作都是通过一个方法实现的。第一点就是,再也没有没有主函数这样的 孤立的东西了。取而代之的是,你必须开始用一个对象的看法看待一个程序,一个类的对象。但是这个对象又什么对象呢?大多数Java程序只是简单的通过继承 Java基础类Object来实现所需要的东西,但是你可以通过创建程序基础类用于多个特性相似的应用程序来节省时间。


严格的面向对象的规定意味着理用原有的C/C++代码不可以直接不加改动的使用;系统调用也是这样的。C++中,你可以通过在C++正常的命名空间外声明extern"C"来使用原有的C的过程调用,包括系统调用。


在Java中,只有一个类似的安全回溯的方法,但是并不是十分简单的方法。你必须定义一个本地方法,其目的是为C语言提供接口,然后提供连接的介 质。Java环境提供了完成这种任务的工具,但是整个过程和C++中提供的extern比微不足道,完成使用C++类的过程则更加复杂,因为这样会引入对 C的借口和C函数和C++成员函数的问题。


幸运的是,许多常用的系统实用工具函数已经在系统类中的方法中提供出来,但是这些明显没有包含经过许多年来你所创建的那些类和过程。所以,在你需要的时候你应该去钻研一下。


3.Java中没有独立的头文件


在Java中,关于类的一切东西都被放到一个单独的文件中。方法的位置只可能在一个地方出现,一个方法的实现必须在它的定义过程中同时进行。这样 做得优点是在实现程序的时候不容易因为文件的非同步错误而失败,或者获取到一个没有实现的声明。类的声明可以被Java解释器利用甚至是从一个编译过的单 元中获取,所以不再需要有头文件,只要有编译过的文件。


这样做的缺点与我们编程的过程有关。许多C++程序员喜欢用头文件来代替文档。要看一个成员函数的接口参数,只需要看头文件中的声明即可。你可以 经常的看头文件即可了解怎样去使用这个类。在Java中,没有这样的总结。因为实现类方法的代码必须在方法定义的时候出现,而且,对于一个单独的函数的代 码来说就经常占据了一整页乃至更多。这样,很难通过看Java的代码就初步了解类是怎样使用的。你必须为你需要的类准备足够多的文档。不言而喻,再处理非 商业类库的时候文档是极度缺乏的。


在当先的Java环境中提供了两个工具来补偿这些,javap来打印类标识,javadoc为嵌入式程序提供HTML文档。


4.用Package来分解Java命名空间


在大的C++工程中经常遇到的一个问题是命名空间--怎样保证工程的一些程序员不会创建和另一些程序员一样名字的类?更糟糕的是,供应商可能会提 供一个包含和你的类一样名字的类的库。有许多方法可以解决这一问题,但是很可能在问题发现之前工程已经启动,改正错误是需要付出许多痛苦的。


Java通过"Package"这个概念解决了这个问题,Package有效地通过通过集合类划分了命名空间。在不同包内的两个同名的类仍然是不同的。关键问题就变成了类是否放置到相应的包中。


记住,Java并没有解决命名冲突的问题。扩展一个基类而引起了派生类的冲突。比如说,如果你最喜欢的供应商提供了一些类,然后你把它们用做基类 并且派生有一个foo方法的类,当供应商提供一个新版本的类的时候就可能出现,如果供应商业也在新类中提供了一个foo的方法。


5.异常是Java的重要特性


在C++中,异常和异常处理是十分深奥的事情;许多C++程序员从没有处理过它们甚至不知道它们是何物。异常是在正常的过程中出现的未预料的错 误,因此,它们不会从方法中返回,或者作为参数传入;但是,它们不能被忽略!这里的一个例子是计算一个书的方根的方法。正常的接口形式是将一个正数作为参 数传入方法,然后方法会返回一个正实数作为结果,方法可以检验这些并且在异常产生的时候抛出异常。在大多数系统中,程序员并不是必须这样做,这样,一个没 有考虑到的异常可以使程序不正常的退出。


在Java中,异常已经成为语言中非常成熟的部分。方法的说明中就包含了异常的信息,程序处理器也强制检验如果你使用了一个能够产生异常的方法, 你就必须检查异常是否发生。几乎所有的Java程序员都会遇到异常的情况,因为许多非常有用的库中的类都会抛出异常。处理异常并不难,但是在一些时候是需 要注意的。一个方法的文档会指明方法抛出的异常的类型。如果你忘了,不要紧,编译器会提醒你的。


6.字符串不再是字符数组


Java中包括了一个字符串的对象,并且是个常量。字符串不像字符数组一样,虽然可以简单的从一个字符数组构造一个字符串。你应该尽可能的用字符串代替字符数组,因为他们不会因为误操作而被覆盖。


7.Java限制了常量对象和方法


在C++中,你可以正式的声明一个函数参数或者函数返回值为const类型,这样可以有效的防止对参数或者返回值的不正当修改。另外,你可以声明一个成员函数为const,表明它不可以修改任何他操作的对象。


Java支持常量操作符,只读变量,这些通过final关键字实现。但是Java没有支持强制的使一个可写变量在函数传递、返回的过程中变为只读。或者定义一个不操作修改对象的常量方法。


在Java中,这个省略带来的影响和在C++中相比就非常小了,这很大程度上因为字符串变量和字符数组的不同,但是这也带来一个引起错误的隐患。特别地,没有办法检验一个方法是否可以改动对象。


8.Java没有指针


理解指针的概念是一个C或C++程序员最难应付的问题。指针也是错误产生的一大根源。Java中没有指针,对象的句柄直接作为参数传递,而不是传 递指针。另外,你必须通过索引使用数组。这些都不是什么大问题。然而,没有指针是在写含有函数指针或者成员函数指针的系统的时候引起很大麻烦。这个问题在 处理回调函数的时候更加显著。


9.Java没有参数化类型


参数化类型提供了用一段程序处理许多相似程序的方法。一个例子就是开平方根的方法,它可以对int或者float操作。在C++中,这一特性是由模板提供的。


Java中不包含C++中的模板的等价物。如果你经常使用模板来简化程序,比如说构造许多使用相似参数类型的函数,这简直就是灾难。这意味着更多使用复制、粘贴的过程来手动的完成。然而,如果你使用模板来生成类的话,没有简单的方法。


10.Java使用垃圾回收


在垃圾回收的语言中,运行时环境一直监测哪些内存不被使用。当一块内存不用的时候,系统自动的回收内存。比如说,一个对象在一个方法中生成,但是 没有被调用着返回或者没有储存为全局变量,不能在方法外部使用。系统自己会知道哪些变量是你用不到的,哪些是可以用到的。因此,你不必再为破坏对象回收内 存而担心。在C++中,很多的调试时间都被使用到检查内存漏洞中。Java的这种方法很大程度上降低了这种错误的可能。但是他依然不能处理逻辑混乱的程 序,他们不能够被回收。许多C++的类中的析构函数是用来释放对象引用的内存的。Java使垃圾回收的事实说明在Java中不是必需写析构函数了。但是并 不意味着你可以忘记为你的类写析构函数。比如,一个对象打开了网络连接就必须被恰当的清理来关闭这个连接。在Java中,析构函数被称 作"finalization"方法。


11.Java不支持多重继承


在任何一个复杂的面向对象的系统中,实现一个有更多方法的新类是十分经常遇到的事情。比如说,一个Manager类,需要被作为一个连表的表头, 但是一个Manager又必须是一个Employee。有许多方法来处理这样的问题。一个方法是允许从多个类继承。在这个例子中,Manager需要从 Linked List和Employee继承。


Java没有多重继承。但是你可以声明接口--来描述实现一些功能的编程接口。一个类可以由多个接口实现,包括他唯一的功能。不同的类可以由同样的接口实现。方法的参数既可以声明为类,也可以声明为接口。如果是接口的话,实现接口的类就可以作为参数传入方法。


接口的概念要比多继承容易理解一些,但是他有一定的局限性。特别地,你必须在类中实现接口的时候编码去重新实现类的功能。


12.Java支持多线程


多线程可以使你写出在同一时刻完成多种任务的程序。比如说,你可以在完成读取一个大文件之间允许用户对已经读取的部分进行编辑。你需要把程序分为多线程来执行。为安全起见。你的程序要被精心的设计,因为可能不止一个线程需要对数据进行访问、修改。


Java开始就支持多线程。类和接口用来分解一个程序成为不同的线程。语言简单的对重要的数据作同步或者锁定处理。


13.Java以一些预定义的类为基础


默认的Java环境中包括一些从Java基础类实现而来的一些包。这些允许你很快的写出一些有用的程序,这些包如下:


java.awt:当今许多应用程序都非常依赖GUI,java提供了一个Abstract Window Toolkid,这可以让你在不考虑运行平台的前提下处理GUI对象。


java.applet:applet的主要目的是提供浏览有关的内容。它本身是awt组件的字类并且支持其他一些特性,比如声音、渲染等。


java.io:java.io提供了对流、文件、管道的读写操作。


java.lang:提供了java的基础类Objcet,Integar,Float……;


java.net:提供对网络编程的支持。包括处理socket,URL,Internet寻址等。


java.util:为数据结构提供的通用实用工具集

分享到:
评论

相关推荐

    嵌入式系统/ARM技术中的Java基础:从C++转到Java需注意的地方

    嵌入式系统和ARM技术中的Java基础,特别是对于从C++转到Java的开发者来说,有一些重要的差异需要注意。首先,Java程序并不直接编译成针对特定硬件的机器代码,而是被编译成Java字节码,由Java虚拟机(JVM)执行。这...

    C++连接java

    本主题聚焦于"C++连接Java",这通常涉及到JNI(Java Native Interface)技术。JNI是Java平台的一部分,它为Java代码和其他语言编写代码提供了一个标准接口,使得C++能够调用Java的方法,反之亦然。 首先,我们需要...

    jni java类与c++类映射的例子

    当涉及到复杂对象时,Java对象可以被映射为C++中的结构体或类,Java字段可以映射为C++的成员变量,Java方法映射为C++的成员函数。对于数组和集合,JNI提供了专门的API来处理。 8. **内存管理**: 跨语言调用需要...

    Java调用C++类库--JNI

    注意,JNI接口设计复杂,涉及到内存管理、异常处理以及类型转换等问题。此外,为了保证跨平台兼容性,开发过程中可能需要对不同操作系统(如Windows、Linux、Mac OS等)的库文件管理和加载方式有所了解。 在实际...

    jna调用C++dll

    本示例将探讨如何使用JNA调用C++编写的动态链接库(DLL)以及如何实现从DLL到Java的回调功能。 首先,我们需要理解JNA的工作原理。JNA通过映射Java接口到C函数来实现调用。这些接口定义了C++ DLL中的函数签名,使得...

    java使用JNI调用C++ dll库用法概述

    - 使用`javah`工具从Java源码生成JNI头文件,该文件包含了C++代码的接口定义。 4. **编写C++实现**: - 根据生成的头文件编写C++代码实现本地方法。例如,对应上述Java代码,会在C++中实现`callCppFunction`。 -...

    Android 调用C++代码和C++代码调用源码-IT计算机-毕业设计.zip

    2. 内存管理:C++代码中的内存管理与Java不同,需要注意手动释放内存,避免内存泄漏。 3. 并发问题:当C++代码涉及到多线程操作时,需要考虑线程安全,防止数据竞争。 总结,这个项目是关于Android应用如何利用NDK...

    利用C++实现哈夫曼算法

    哈夫曼算法是数据压缩的一种重要算法,它的主要思想是构造一棵哈夫曼树(二叉树),其基本思路是,每次从字符中挑出两个频率最低的,然后构造一个新的结点,使新结点的左右孩子指针分别指向那两个节点。哈夫曼算法的...

    程序设计基础50道题,java编写,vc50道题,Java编写的c++50道题,

    值得注意的是,虽然标题中提到了"C++50道题",但描述中提到的是"Java写的C语言的50道训练题",这可能意味着有一部分是用Java语言实现的C语言风格的题目,这对于理解不同语言间的异同和互操作性有一定的帮助。...

    Android 调用C++/C的实例

    注意,C++/C的内存管理、异常处理以及线程同步等问题需要额外关注,因为它们可能与Java层有所不同。此外,跨语言的类型转换和错误处理也是需要注意的地方。 通过这个实例,我们可以看到Android应用如何借助NDK与C++...

    java C++ 文档

    3. 内存泄漏:未正确释放对象引用,可能导致内存资源浪费,需注意使用`System.gc()`谨慎操作。 4. 并发问题:Java并发编程中,不恰当的锁使用、共享变量同步可能导致线程安全问题。 5. 非私有构造器:类的非私有构造...

    使用C/C++解析excel

    然而,由于Excel文件是Microsoft Office套件的一部分,通常由诸如Python的pandas库或Java的Apache POI等高级语言处理,使用C/C++直接解析Excel文件可能相对复杂一些。下面我们将深入探讨如何在C/C++环境中解析Excel...

    liunx 编译好的 GDAL3.2.0java调用)

    - 将".so"库文件复制到Java可执行文件运行时可以找到的地方,通常是系统的库路径(例如`/usr/lib`或`/usr/local/lib`)或者Java的`java.library.path`设置中指定的路径。 - 确保系统环境中已经正确设置了GDAL的...

    AndroidStudio 编译C/C++文件生成SO文件

    在Android开发中,有时我们需要利用C或C++的性能优势,这时就需要用到Android Studio的NDK(Native Development Kit)来编译C/C++代码,生成SO(Shared Object)动态链接库文件。这篇博客详细介绍了如何在Android ...

    Android源码——调用C++代码和C++代码调用源码.zip

    在Android开发中,有时我们需要利用C++代码来提升性能或者使用特定库,这涉及到Android的NDK(Native Development Kit)编程。本资料包主要讲解了如何在Android项目中调用C++代码,以及C++代码如何反过来调用Android...

    java+OpenCV 图片对比、标记差异部分(可以支持中文路径)

    在Java环境中,我们可以借助Java的JNI接口来调用OpenCV的C++核心库,从而在Java程序中实现OpenCV的功能。 `CompareAndMarkDiff`方法是用于比较两张图片并标记差异的函数。它的两个参数`imagePath1`和`imagePath2`...

    C#使用OpenCV C++接口读取视频

    OpenCV提供了C++, Python, Java等多种编程语言的接口,其中C++接口是最底层也是最全面的,包含了所有功能。为了在C#项目中使用OpenCV,我们需要引入OpenCV的C++动态链接库(DLL)文件,这在提供的"OpenCVDLL"文件中...

Global site tag (gtag.js) - Google Analytics