程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Java和C++的基本差異

Java和C++的基本差異

編輯:C++入門知識

前言

Java群體每天都在擴大,它既包括一些世界最大的ISV,也包括公司CIO、信息技術人員、系統分析人員、C/S開發人員、編程人員、多媒體設計者、市場行銷人員、教育工作者、經理、影視生產者甚至業余愛好者等廣泛的用戶。從傳統上看,這樣一些人在一起有效地工作是不多見的。當我們談到開放系統時,我們往往是就已發表的API及規格,或者源碼的可得性,或者硬件、聯網及操作系統而言的,沒有一個人是從人的開放意義上來談的。Java完成了開放系統的閉合鏈。它開發了人力資源,而反過來又開辟了共同工作的道路。

一談到Java,人們馬上會想起一種類似於C++的、適用於分布環境的面向對象編程語言,想到這種語言的簡單、穩定、安全、與體系結構無關、可移植、可解釋、高性能、多線程和動態性等特征。這些都是Java作為一種程序設計語言的主要特征。

Java是由Sun公司的一個技術小組研制出來的。在實現Java語言的過程中,Sun小組的技術人員很快就意識到:C++無法成為一種完全面向對象的、網絡化的開發語言。C++是通過給原先的C語言增加面向對象功能而開發出來的,因此,它存在著先天不足。這主要體現在C++種類繁多,功能大量冗余,同時又沒有任何一種C++編譯器能夠支持它的全部功能。鑒於這種情況,Sun公司的技術人員決定不擴充C++,而開發一種全新的計算機語言(Java的前身Oak)。但是,C++已經成了大多數編程人員所熟練掌握的語言,Java的設計顯然不能無視這個現實。如果Java和C++之間的差別過大,那麼程序員們在學會這種語言的過程中無疑要花費大量的時間和精力。因此,Java保留了盡可能多的C++風格。

Java自誕生起,為網絡用戶創造了無數客戶端的小應用程序,由於這類應用程序效果良好、數量巨大,以至於許多用戶想到Java編程語言時,會在腦海中出現一個不完全正確的印象-Java是用來編寫小的客戶端程序的。其實,隨著技術的進步,Java語言正在逐步改變自己執行效率較低、無法擔任企業關鍵計算任務的形象,不斷向計算技術的核心地帶前進。今天的Java技術正沿著網絡滲入各個應用領域。

企業計算:企業計算是Java最重要的技術主題。Sun公司已經公布了企業JavaBean(EJB,Enterprise JavaBean)的規格,隨後眾多公司開始開發企業應用領域的Java技術。IBM公司也已經為Windows NT開發了IBM HPCJ(High Performance Compiler for Java)12.0版,同時研制了IBM JDK(JavaDevelopment Kit)for Windows NT,Novell公司也在宣布了一個新的服務器端的企業Java平台,而Sun公司也在積極地升級自己的JDK系統,這個形勢表明,Java正在穩步走向企業高端計算。對於Java來說,與其它編程語言爭奪企業計算主力編程工具的優勢在於:其一,Java在進行面向對象的編程工作時,比其它的編程語言如C++更加簡單,因此保證了編程的高效率,減少了編程投入;其二,Java虛擬機技術所提供的"一次編程,到處使用"的跨平台能力非常適合網絡環境,這給Java在網絡服務器端的發展提供了便利條件;其三,Java擁有強大的提供商和支持者隊伍,該隊伍包括IBM、Oracle、Novell、Sybase和Netscape等公司。

提速運行:許多企業的應用開發人員非常喜愛Java的語言特性,但是在開發重要系統時,語言特性和執行效率之間的抉擇往往令人傷透腦筋。在關鍵計算中,用戶可能並不在乎數據如何壓縮或者運行的延遲關系如何設置,但是對程序的運行速度卻非常重視,這使廠商將Java的編譯策略開發放在了首位。現在的Java語言,其執行方式已經不僅僅是解釋執行方式了,即時編譯器(JITC、just-in-time compiler)技術和原型編譯技術已經被許多廠家采用,包括Sun、IBM、Oracle以及Netscape等公司在內的技術提供商正在利用這些技術逐步提高Java的執行速度,其中IBM公司早已將Java虛擬機(JVM,JavaVirtual Machine)、操作系統和硬件的特性有機的結合在一起,非常有效地提高了Java的執行效率。

嵌入計算:嵌入式Java是一個潛力巨大的應用技術,該技術充分發揮了Java小巧靈活的特點。以HP公司為例,該公司以自己的方式制造編譯工具和Java虛擬機,其目的是將Java嵌入各種設備,如打印機、醫學監視器和自動提款機等。嵌入設備依靠一個實時操作系統來處理某一個實時生效的事件,Java被嵌入這些設備後,通過實時擴展(real-time extension)開始發揮作用,使設備具備了一定的智能性,增強了嵌入設備的可管理性和可用性,大大提高了設備的工作效率。各廠商對這一潛力巨大的市場都非常重視,目前該市場缺乏的是一個標准,如果存在標准的話,相信很快就會有大量使用嵌入Java技術的設備上市。

微軟剛剛發行的Windows XP放棄了對Java的支持,但Java能夠獨立運行於很多操作平台上,其中也包括Linux,並且在某些特性上要比在Windows上發揮得更好,我們完全有理由拋棄Windows而選擇使用Linux來做Java開發。現在,你可以左手拿著Linux,右手拿著Java,然後對面帶微笑手裡拿著Windows XP的Bill Gates說:"讓你的XP去見鬼吧!"

對於軟件開發者來講,任何一種編程語言都不可能是完美的。如果希望更好地理解Java語言,最好的方法是把這種語言與其同類型的語言相比較。既然Java類似於C++,把它同C++進行一番比較也是順理成章的事情,哪一個好,哪一個不好,每個開發人員都有各自的看法。我個人認為Java開發要比C++好一些。當然每個人的看法和喜好是不同的。後面的文章將向大家介紹Java和C++的不同和對其的改進。孰強孰弱,大家自然就會明白了。

我們知道,Java一開始采用C++的語法格式,基本上是為了讓程序設計者可以很快地熟悉 Java的語法格式,縮短學習Java的時間,畢竟C和C++仍舊是最多人會的一種程序語言。但是如果我們仔細檢查Java程序語言的許多細節設計,我們可以發現Java去掉了不少C++的特點,並且加入一些新的特性。這些與C++的差異包括:

1.不再有#define、#include等預處理程序(Preprocessor)的功能

C++語言很重要的一個特點就是它的預處理程序。有些其他程序語言雖然也加入了#include的功能,但是還是欠缺處理宏(Macro)的能力。#define的功能在Java中我們可以用定義常數(constant)的方式來取代,而#include在Java中是不需要的,因為在Java中程序在執行時,會把類型數據記錄在對象實體之中,我們不需要靠一些標頭文件(header file)來知道我們使用的對象或數值是屬於什麼數據類型。

如果你使用C++語言時,只使用預處理程序的#include和#define功能的話,那麼你大概不會覺得Java這樣的設計對你產生什麼樣的困擾,但是如果你是使用C++語言預處理程序中宏功能的高手,你可能會覺得很不方便,進而懷疑Java如此設計的意義何在。

使用預處理程序雖然可以很方便地達到許多功能,但是站在軟件工程的角度上看,對整個軟件的維護其實是很不利的。由於C++語言中預處理程序的功能太過強大,厲害的程序設計高手常會自行開發一套只有自己看的懂的宏語言,一旦整個軟件要交給其他人去維護,後繼者很難在短時間內了解前一個人所寫下的宏功能,增加軟件開發時團隊工作及日後維護的困難度。

另外一點則是C++語言的編譯器所看到的程序代碼,其實和程序設計者看到的程序代碼是不同的。程序設計者看到的是尚未經過預處理程序處理過的程序代碼,而編譯器看到的則是預處理程序處理過的程序代碼,一旦交給預處理程序處理的宏內容有誤,編譯器產生的錯誤信息將不會是程序設計師所預料的。而這一點自然也增加了程序在排錯時的困難度。

預處理程序的存在也造成了閱讀程序的不便。如果你想使用別人已經完成的C++語言程序,那麼通常你不但要閱讀他所寫下的文件,還必須一並查閱上文件,才能了解其程序的全貌。如果換成是Java程序,只要查看java的程序文件就夠了。

2.不再有structure、union及typedef

事實上,早在C++中就可以去掉C語言中的structure和union等對復雜數據的自定結構類型,因為類(Class)的定義方式可以完全做到這項功能。而typedef也是不必要的,一切都用類就可以了。雖然C++這樣的設計是為了和C語言兼容,但是使用多余的語言特點不但不必要,而且容易造成對程序認識的混淆。

3.不再有函數

在Java程序語言中,去掉了程序向導語言中最重要的單元--函數(Function)。如果我們以對象向導的觀念來看待函數,就可以了解函數在對象向導的概念中,是不必要的。在對象向導的程序觀念裡,對象的數據才是真正的主體,而處理對象數據的方法則必須依附在對象內才有意義。因此,去掉函數並不表示不再有子程序等模組化程 序的概念,相反地,是利用對象中的方法來取代函數,再一次強化對向導的發展策略。

4.不再有多重繼承(Multiplelnheritance)

在C++中,多重繼承是一項很強的功能,但也是一般人難以掌控的部分。去掉多重繼承雖然降低了Java語言的功能,但是也大幅簡化撰寫程序時的困難度。雖然移除了多重繼承的功能,但是Java提供了interface的方式,可以達到部分多重繼承的功用。所謂的interface基本上定義了一個類的對外溝通的方法原型,以及類內部的常 數,和多重繼承不同之處在於interface並不會定義類方法的內容,以及類中的變量數據。

5.不再有Goto

在程序語言的發展史上,Goto一直是毀譽參半的一項功能。在很多時候使用Goto可以大幅減少不必要的程序代碼,但是也由於Goto可以很自由地改變程序的流程,如果冒然地使用,更可能造成程序結構混亂的情況。一般來說,正確使用Goto的例子多出現在循環內部,想要提早結束某一層循環。在C語言中,我們可以使用break 或contine來改變某一層循環的流程, 但如果想要改變兩層以上的環執行流程,不是使用Goto就是以多余的布爾(boolean)變量,配合上一串if-then

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved