韓宏峰+馮石+羅羿隆
摘 要:Java與Python作為兩種主流的不同類型的面向?qū)ο缶幊陶Z言,有較深的研究價值。本文簡述并比較了面向?qū)ο缶幊陶Z言的繼承與多態(tài),Java因只支持單繼承而與Python等系列語言不同,因此Java通過設計接口以間接實現(xiàn)多繼承。另一方面,本文闡述了垃圾回收機制的意義、兩種回收方法和主GC的觸發(fā)條件,并與Python進行了對比,最后進行了Java內(nèi)存的概況和結構分析。
關鍵詞:面向?qū)ο缶幊?;Java與Python;繼承與多態(tài);接口;垃圾回收機制
中圖分類號:TP312 文獻標識碼:A
Abstract:Java and Python are two kinds of mainstream object oriented programming languages with comparatively higher research value.This paper sketches and compares the two major features of object oriented programming languages:inheritance and polymorphism.Different from Python and other programming languages,Java only supports single inheritance of classes,so Java indirectly implements multiple inheritance through the design interface.This paper also states the significance of the garbage collection mechanism,two kinds of recovery methods and the trigger condition of the main GC of Java,and then compares with Python.At last,the general situation and structure analysis of Java memory are carried out.
Keywords:object oriented programming;Java and Python;inheritance and polymorphism;interface;garbage collection
mechanism
1 引言(Introduction)
程序設計的思想通常分為面向過程的編程和面向?qū)ο蟮木幊蘙1]。面向過程的編程以函數(shù)為主,通常以線性步驟為特征,設計起來較為繁雜,需要具備扎實的基礎,以C語言最為流行,是操作系統(tǒng)的設計語言;而在面向?qū)ο缶幊讨?,對象指類的實例,通過將對象作為程序的基本單元來提高軟件的靈活性。其中面向?qū)ο蟮娜齻€基本特征是:繼承、封裝和多態(tài)[2]。Java與Python作為兩種主流的不同類型的面向?qū)ο缶幊陶Z言,具有較深的研究價值。本文在論述時引入了靜態(tài)語言和動態(tài)語言的概念來區(qū)分Java與Python的不同特征,在討論多繼承時通過接口的引入解決了Java單繼承的局限性,間接實現(xiàn)了Python的多繼承。另一方面,本文對Java的垃圾回收機制進行了詳細解析并對比了Python。最后介紹了Java的內(nèi)存管理模塊。
2 多態(tài)與繼承(Polymorphism and inheritance)
2.1 多態(tài)
多態(tài)是面向?qū)ο笳Z言里一個常見的概念,指的是同名而內(nèi)容不同的方法同時存在于一個程序中。在Java中,多態(tài)分為動態(tài)和靜態(tài)[3]。動態(tài)指的是在程序運行時才可以通過虛函數(shù)或重寫來動態(tài)地決定指針指向的對象。靜態(tài)指的是在編譯時系統(tǒng)能通過重載決定調(diào)用的函數(shù)名[4]。Java屬于一種要求在編譯時變量的數(shù)據(jù)類型必須確定的語言,即靜態(tài)語言[5]。動態(tài)語言(Python)與靜態(tài)語言(Java)相比,其不必檢查變量的數(shù)據(jù)類型,只要方法存在并且參數(shù)正確便可直接調(diào)用。如下面代碼所示,參數(shù)self可以是任何數(shù)據(jù)類型的實例,只要有getName()的方法即可。
class student(object):
def getName(self):
return'I am a student'
2.2 繼承
Java作為一種面向?qū)ο蟮恼Z言,只支持單繼承,即一個子類不能對應多個父類。好處在于單繼承能使java的繼承關系變得簡單,程序變得更易于管理,而對多繼承的需求可以通過接口實現(xiàn)。通過多重繼承,一個子類就可以同時獲得多個父類的所有功能。Python作為一種支持多繼承的語言,子類如果沒有寫自己的初始化方法,會自動繼承第一個父類的方法。為了更好地設計,通常進行一種稱之為Mixin[6,7]的設計來減少多層次的復雜的繼承關系。
3 Java的接口(Java interface)
3.1 接口的引入與形式
正如2.2節(jié)繼承所述,Java不支持類的多重繼承,這使得程序的結構更加簡潔。但是和支持多重繼承的其他語言相比,單繼承有時并不能很好的表述比較煩瑣的問題。在這種情況下,接口可以用于實現(xiàn)類似于多重繼承的功能。接口是一種抽象的數(shù)據(jù)類型,也就是說它并不能實例化。抽象是接口的一大特點,因此在接口中并沒有方法和變量,只有方法的定義與常量。聲明接口和聲明一個類十分相似。其中接口為一個抽象類,只有虛函數(shù)和靜態(tài)數(shù)據(jù)被聲明,相當于定義了一個程序之間的協(xié)議[8,9]。
3.2 接口的實現(xiàn)
接口由于自身只是一種抽象的數(shù)據(jù)類型,能避免多繼承帶來的許多矛盾。一個類可以通過實現(xiàn)多個接口來實現(xiàn)諸如Python的“多繼承”功能。在具體使用中,接口的用法和類很相似,雖然不能直接對接口使用new操作符,但是可以使用接口作為類型名。endprint
3.3 接口的多繼承
如圖1所示,一個接口允許同時繼承(extends)多個接口。多繼承使得多個接口規(guī)范能得到合并。程序的抽象結構層次便能產(chǎn)生于此。而由于接口中的方法只是抽象的原型,所以避免了重定義父類方法和重復繼承的問題,在結構上相對簡單[10]。
3.4 接口的應用
接口在實際應用中能夠?qū)︻惖奶卣鬟M行一系列的描述。在Java中,接口也可以作為一個類使用,只是不能被new操作符直接聲明。在運行程序時,調(diào)用的方法屬于哪個類是在運行的時候被決定,使方法能被動態(tài)地調(diào)用。
4 垃圾回收機制(Garbage collection mechanism)
4.1 Java垃圾回收機制
4.1.1 垃圾回收的意義
Java的特色之一就是垃圾回收機制,這使得編程時令人頭痛的內(nèi)存管理問題得以解決,使得程序員的編程壓力大大減小[11]。垃圾回收機制在一個變量或?qū)ο蟮纳芷诮Y束后釋放它所占用的資源。垃圾回收機制可以有效地利用空閑的內(nèi)存,從而防止內(nèi)存的浪費。由于現(xiàn)代計算機的性能不斷提高,現(xiàn)在進行垃圾回收所需要的時間非常少,在這種情況下,就可以頻繁的對程序進行垃圾回收。
4.1.2 垃圾回收方法
(1)finalize()方法
Java通過調(diào)用finalize()方法來回收垃圾,例如打開的URL、端口、文件等,但其只能由垃圾收集器被動調(diào)用。
(2)System.gc()方法
如果想要在程序中主動請求垃圾回收可以使用System.gc()方法。具體格式如下:
(3)主GC
之前所說的GC對系統(tǒng)的影響都非常小,但是主GC可以對系統(tǒng)產(chǎn)生較大的影響,所以它只能在特定的情況下才被觸發(fā)。觸發(fā)主GC的條件有兩個:
(1)在應用程序沒有運行時,即應用線程都處于空閑狀態(tài)時,GC會被調(diào)用。
(2)堆內(nèi)存不足時,JVM會強制調(diào)用主GC來回收內(nèi)存[12]。
4.2 Python垃圾回收機制
簡潔作為Python的最重要特征,程序員同樣無須關心對象的內(nèi)存分配和釋放等原理,取而代之的由Python解釋器負責,是一種自動回收內(nèi)存資源的技術。最簡單的GC算法就是引用計數(shù),一種效率不高的實現(xiàn)算法,意味著在每次內(nèi)存對象被引用或引用被銷毀的時候都必須修改引用計數(shù),極大的影響性能。未來的Python解釋器也許會采用更高效的方法來實現(xiàn)垃圾收集[13]。
5 Java內(nèi)存管理(Java memory management)
5.1 Java內(nèi)存概況
在Java中,內(nèi)存是通過new分配給對象。例如:object obj=new object()而且在程序?qū)嶋H運行的過程中,每個對象所擁有的內(nèi)存也是動態(tài)的。上文提到的垃圾處理機制是JAVA的一個顯著的特色機制,它能使系統(tǒng)資源得到充分的利用,同時也防止了由程序員錯誤操作引起的故障。垃圾回收機制有效地防止了內(nèi)存的浪費,大大降低了編程的煩瑣度,避免了內(nèi)存分配不均導致的系統(tǒng)崩潰。
5.2 Java內(nèi)存結構
如圖2所示,Java內(nèi)存主要分為四個部分:堆、棧、方法區(qū)和程序計數(shù)器。其中方法區(qū)和堆是用于給進程分配空間,也是所有線程共享的。而棧和程序計數(shù)器是分配資源給每一個獨立的線程。
(1)方法區(qū)
這是線程共享的區(qū)域,通常來說這個區(qū)域很少出現(xiàn)垃圾收集行為。若出現(xiàn)內(nèi)存已滿不足以進行新的內(nèi)存分配時,程序?qū)伋鯫utOfMemoryError異常。
(2)堆
堆用于給進程分配空間使用,是垃圾回收處理的主要區(qū)域。從內(nèi)存分配上來說,Java堆可以分成多個線程獨有的分配緩沖區(qū),但是這些緩沖區(qū)存放的內(nèi)容都是線程中的對象實例,之所以細分成獨立的區(qū)域是為了更快的分配和回收。如果Java堆不能進行內(nèi)存擴展,將會拋出OutOfMemoryError異常。
(3)程序計數(shù)器
程序計數(shù)器分配給每一個獨立的線程,作為當前線程所運行的字節(jié)碼的指示器。在線程執(zhí)行方法時,程序計數(shù)器將指向運行代碼的地址。
(4)棧
棧也是分配給每個線程的內(nèi)存空間,它描述的是每個Java方法執(zhí)行時調(diào)用內(nèi)存的過程。棧可能拋出StackOverflowError和OutOfMemoryError兩種異常[14]。
6 結論(Conclusion)
本文對基于面向?qū)ο缶幊痰腏ava與Python進行了基本特征研究,在介紹OOP的三個基本特征繼承、封裝和多態(tài)時引入了靜態(tài)語言和動態(tài)語言的概念,在討論多繼承時通過接口的引入解決了java單繼承的局限性,實現(xiàn)了類的多繼承。同時對Java的垃圾回收機制進行了詳細解析,并與Python進行了對比。最后介紹了Java的內(nèi)存管理模塊。本文旨在讓讀者了解基本的面向?qū)ο缶幊痰奶卣?,熟悉兩種代表性的語言Java和Python,為今后的編程打下良好的基礎。
參考文獻(References)
[1] 張豐,等.面向?qū)ο蟮牡丶畷r空過程表達與數(shù)據(jù)更新模型研究[J].測繪學報,2010,39(03):303-309.
[2] Deshpande S.Collaboration of Object Oriented Programming and Software Development[J].International Research Journal of Engineering and Technology(IRJET),2016,03(09):524-527.
[3] 余雙雙,等.基于UML模型的多態(tài)性與Java接口代碼信息一致性檢測的方法[J].計算機應用與軟件,2017,34(02):8-13;47.endprint
[4] 黎海生.Java語言中的繼承與多態(tài)[J].科技廣場,2008(05):231-232.
[5] 錢宇虹.基于Java平臺的多語言混合編程[J].軟件工程師,2014(11):39-41.
[6] Burton E,Sekerinski E.An Object Model for Dynamic Mixins[D].Computer Languages,Systems & Structures,2017.
[7] Burton E,Sekerinski E.An object model for a dynamic mixin based language[C].Proceedings of the 31st Annual ACM Symposium on Applied Computing.ACM,2016:1986-1992.
[8] 楊曉霞,候銳鋒.VisualC#.NET,DELPHI,JAVA與MATLAB接口技術的研究[J].云南大學學報(自然科學版),2008,30(S2):
247-249.
[9] 姜慧霖,喬麗.淺析C++和Java的繼承機制[J].開封大學學報,2005(03):85-87.
[10] Kramer S.A modularity bug in Java 8[J].arXiv preprint arXiv:1701.02189,2017.
[11] 張衛(wèi).綜述java運行中垃圾回收機制[J].數(shù)字技術與應用,2017(02):231.
[12] 池煒成.Java垃圾收集的機制及調(diào)優(yōu)[J].計算機應用研究,2004(03):144-148.
[13] 郭芬,劉明.Python垃圾收集器原理研究及應用[J].信息技術,2009(07):93-97.
[14] Dietrich J,Jezek K,Brada P.What Java developers know about compatibility,and why this matters[J].Empirical Software Engineering,2016,21(3):1371-1396.
作者簡介:
韓宏峰(1996-),男,本科生.研究領域:物聯(lián)網(wǎng)工程,編程語言,人工智能,區(qū)塊鏈.
馮 石(1994-),男,本科生.研究領域:物聯(lián)網(wǎng)工程.
羅羿隆(1996-),男,本科生.研究領域:物聯(lián)網(wǎng)工程.endprint