从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类,需要被作为一个连表的表头,
elelen胶原蛋白口服液但是一个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:提供对网络编程的支持。包括处置socket,URL,Internet寻址等。 java.util:为数据结构提供的通用实用工具集 OVER