您好,登錄后才能下訂單哦!
本篇內容介紹了“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-else的判斷來達成。
Java一方面移除了Goto的功能, 而另一方面同時擴大了break和continue的功能,可以允許多層循環的break或continue。如此一來不但避免了濫用Goto的可能性,同時也保存下Goto的好處。
6.不再有OperatorOverloading
在C++中,Operator Overloading同樣也是一項值得討論的設計。幾乎在所有C++的書中,都會引用一些例子,告訴你使用OperatorOverloading可以使你的程序看起來更為自然。如下面是一個程序設計師自定義的復數類:
//C++中自定義的復數類及0pemtor Overloading
class Complex{
public:
Complex(double real,double image){
Real_number=real;
Image_number=image;
}
Complex operator+(Complex&rhs){
Return Complex(rhs.real_number+real_number,
rhs.image_number+image_,nulnbef);
}
private:
doublereal_number //實部
doublejmage_nunmber; //虛部
}
在這里,如果你使用+來作為復數的加法符號,大家都不會有疑義,但是如果你使用的是*或》這樣的符號,那么別人看到你的程序之后,難保不會產生認識上的錯誤。這也是Operator Overloading一大問題,當大家都對運算符賦予自己的定義后,整個程序的可讀性就會大受影響。Operator Overloading的存在并不是必要的,我們一樣可以定義類中的方法來達到同樣的目的,至于Java去掉這項功能的利弊,恐怕就要讀者自己去評斷了。
7.取消自動類型轉換
Java是一個嚴格進行類型檢查的程序語言,對于下面這樣的程序,在C++的編譯器上編譯時最多只會出現警告的信息,但是在Java里則不予通過:
Int aInteger; Double aDouble=2.71828; AInteger = aDouble;
雖然這樣的轉型在C++里是合法的,但是也會造成數據精確度的損失。Java為了要確定寫程序的人充分地了解這點,必須要程序設計強制轉型(type casting),Java的編譯器才會接受:
int aInteger;
doublea Double=2.71828;
aInteger=(int)aDouble;
8.不再有指針
取消指針(Pointer)這樣數據類型,可能會讓許多熟悉C++語言的程序設計師大吃一驚。在C++語言里,靈活地運用指針是許多程序設計師的得意之作,但是占整個除錯時間最久的也是指針的問題。配合上C++對內存管理的態度,程序設計師必須要自己去追蹤自己向系統要到的內存,最后確實地交還給系統,并且在使用指針時,要小心翼翼地注意不要跨過合法的記憶空間,造成Segmentation Fault或General Protection Fault之類的問題。
Java去掉了指針類型,并不表示程序設計師在開發高級數據結構,像堆棧(stack)、 隊列(queue)、二元樹(binarytree)時,都必須要像在傳統Basic上,利用大范圍的數組來自行模擬系統內存,自行建構類似指針的表示方式。
相反地,Java提供了和Lisp語言中相似的Reference類型,通過Reference去讀取配置到的內存內容,可以確保不會去讀取到不屬于自己的內存空間,而另一方面,程序的執行系統也可以動態地去做內存垃圾回收的工作,將沒有被reference參考到的內存空間回收給系統使用。
9.和C++連接
不管Java是多么強大,總是有人需要把它和C++連接起來。因為只要有一個新的程序語言或是軟件開發工具一出現,大家就會問:"它是否具有和原有程序庫連接的能力呢?"也因為C++語言在電腦界中占了很重要的地位。大家的問題其實就等于是直接問"它是否可以和C++連接?"。目前在Java中,的確提供了和C++語言連接的方法,它的做法基本上是先將C++語言所寫的程序建構成動態鏈接函數庫(DynamicLinking Library,DLL),再由Java程序去調用DLL里的函數。
這種連接的方式,使得DLL中的函數,從Java的眼光看就是一個"方法"。不過因為這種方法是直接由其他的程序語言所提供,而不是以Java語言所寫的,所以它被稱之為"原生方法"(NativeMethod)。
由于Java Applet一些安全上的限制,所以這種連接外部程序的方法只能用在Java Application內。
“Java和C++的基本差異有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。