999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Java與Python的面向?qū)ο缶幊痰幕咎卣餮芯?/h1>
2017-09-28 19:16:16韓宏峰馮石羅羿隆
軟件工程 2017年8期

韓宏峰+馮石+羅羿隆

摘 要:Java與Python作為兩種主流的不同類型的面向?qū)ο缶幊陶Z言,有較深的研究價值。本文簡述并比較了面向?qū)ο缶幊陶Z言的繼承與多態(tài),Java因只支持單繼承而與Python等系列語言不同,因此Java通過設(shè)計接口以間接實現(xiàn)多繼承。另一方面,本文闡述了垃圾回收機制的意義、兩種回收方法和主GC的觸發(fā)條件,并與Python進行了對比,最后進行了Java內(nèi)存的概況和結(jié)構(gòu)分析。

關(guān)鍵詞:面向?qū)ο缶幊蹋籎ava與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)

程序設(shè)計的思想通常分為面向過程的編程和面向?qū)ο蟮木幊蘙1]。面向過程的編程以函數(shù)為主,通常以線性步驟為特征,設(shè)計起來較為繁雜,需要具備扎實的基礎(chǔ),以C語言最為流行,是操作系統(tǒng)的設(shè)計語言;而在面向?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ù)類型的實例,只要有g(shù)etName()的方法即可。

class student(object):

def getName(self):

return'I am a student'

2.2 繼承

Java作為一種面向?qū)ο蟮恼Z言,只支持單繼承,即一個子類不能對應(yīng)多個父類。好處在于單繼承能使java的繼承關(guān)系變得簡單,程序變得更易于管理,而對多繼承的需求可以通過接口實現(xiàn)。通過多重繼承,一個子類就可以同時獲得多個父類的所有功能。Python作為一種支持多繼承的語言,子類如果沒有寫自己的初始化方法,會自動繼承第一個父類的方法。為了更好地設(shè)計,通常進行一種稱之為Mixin[6,7]的設(shè)計來減少多層次的復(fù)雜的繼承關(guān)系。

3 Java的接口(Java interface)

3.1 接口的引入與形式

正如2.2節(jié)繼承所述,Java不支持類的多重繼承,這使得程序的結(jié)構(gòu)更加簡潔。但是和支持多重繼承的其他語言相比,單繼承有時并不能很好的表述比較煩瑣的問題。在這種情況下,接口可以用于實現(xiàn)類似于多重繼承的功能。接口是一種抽象的數(shù)據(jù)類型,也就是說它并不能實例化。抽象是接口的一大特點,因此在接口中并沒有方法和變量,只有方法的定義與常量。聲明接口和聲明一個類十分相似。其中接口為一個抽象類,只有虛函數(shù)和靜態(tài)數(shù)據(jù)被聲明,相當(dāng)于定義了一個程序之間的協(xié)議[8,9]。

3.2 接口的實現(xiàn)

接口由于自身只是一種抽象的數(shù)據(jù)類型,能避免多繼承帶來的許多矛盾。一個類可以通過實現(xiàn)多個接口來實現(xiàn)諸如Python的“多繼承”功能。在具體使用中,接口的用法和類很相似,雖然不能直接對接口使用new操作符,但是可以使用接口作為類型名。endprint

3.3 接口的多繼承

如圖1所示,一個接口允許同時繼承(extends)多個接口。多繼承使得多個接口規(guī)范能得到合并。程序的抽象結(jié)構(gòu)層次便能產(chǎn)生于此。而由于接口中的方法只是抽象的原型,所以避免了重定義父類方法和重復(fù)繼承的問題,在結(jié)構(gòu)上相對簡單[10]。

3.4 接口的應(yīng)用

接口在實際應(yīng)用中能夠?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(jié)束后釋放它所占用的資源。垃圾回收機制可以有效地利用空閑的內(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)在應(yīng)用程序沒有運行時,即應(yīng)用線程都處于空閑狀態(tài)時,GC會被調(diào)用。

(2)堆內(nèi)存不足時,JVM會強制調(diào)用主GC來回收內(nèi)存[12]。

4.2 Python垃圾回收機制

簡潔作為Python的最重要特征,程序員同樣無須關(guān)心對象的內(nèi)存分配和釋放等原理,取而代之的由Python解釋器負責(zé),是一種自動回收內(nèi)存資源的技術(shù)。最簡單的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)存分配不均導(dǎo)致的系統(tǒng)崩潰。

5.2 Java內(nèi)存結(jié)構(gòu)

如圖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ù)器分配給每一個獨立的線程,作為當(dāng)前線程所運行的字節(jié)碼的指示器。在線程執(zhí)行方法時,程序計數(shù)器將指向運行代碼的地址。

(4)棧

棧也是分配給每個線程的內(nèi)存空間,它描述的是每個Java方法執(zhí)行時調(diào)用內(nèi)存的過程。棧可能拋出StackOverflowError和OutOfMemoryError兩種異常[14]。

6 結(jié)論(Conclusion)

本文對基于面向?qū)ο缶幊痰腏ava與Python進行了基本特征研究,在介紹OOP的三個基本特征繼承、封裝和多態(tài)時引入了靜態(tài)語言和動態(tài)語言的概念,在討論多繼承時通過接口的引入解決了java單繼承的局限性,實現(xiàn)了類的多繼承。同時對Java的垃圾回收機制進行了詳細解析,并與Python進行了對比。最后介紹了Java的內(nèi)存管理模塊。本文旨在讓讀者了解基本的面向?qū)ο缶幊痰奶卣鳎煜煞N代表性的語言Java和Python,為今后的編程打下良好的基礎(chǔ)。

參考文獻(References)

[1] 張豐,等.面向?qū)ο蟮牡丶畷r空過程表達與數(shù)據(jù)更新模型研究[J].測繪學(xué)報,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].計算機應(yīng)用與軟件,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接口技術(shù)的研究[J].云南大學(xué)學(xué)報(自然科學(xué)版),2008,30(S2):

247-249.

[9] 姜慧霖,喬麗.淺析C++和Java的繼承機制[J].開封大學(xué)學(xué)報,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ù)字技術(shù)與應(yīng)用,2017(02):231.

[12] 池?zé)槼?Java垃圾收集的機制及調(diào)優(yōu)[J].計算機應(yīng)用研究,2004(03):144-148.

[13] 郭芬,劉明.Python垃圾收集器原理研究及應(yīng)用[J].信息技術(shù),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-),男,本科生.研究領(lǐng)域:物聯(lián)網(wǎng)工程,編程語言,人工智能,區(qū)塊鏈.

馮 石(1994-),男,本科生.研究領(lǐng)域:物聯(lián)網(wǎng)工程.

羅羿隆(1996-),男,本科生.研究領(lǐng)域:物聯(lián)網(wǎng)工程.endprint

主站蜘蛛池模板: 狠狠色狠狠综合久久| 不卡国产视频第一页| 亚洲欧美另类久久久精品播放的| 国产精品久久久久久久久久98| 精品国产中文一级毛片在线看| 在线免费观看AV| 欧美成人一级| 老司机精品一区在线视频| 自慰高潮喷白浆在线观看| 亚洲精品成人福利在线电影| 天堂在线www网亚洲| 国产美女无遮挡免费视频| 性做久久久久久久免费看| 久久国产热| 国产丝袜第一页| 一级全免费视频播放| 91久久精品国产| 青草91视频免费观看| a在线亚洲男人的天堂试看| 波多野结衣一区二区三区四区视频| 亚洲欧美日韩成人在线| 国产麻豆91网在线看| 久久鸭综合久久国产| 69av在线| 色婷婷综合在线| 一区二区在线视频免费观看| 午夜无码一区二区三区| 免费午夜无码18禁无码影院| 久久免费精品琪琪| 日韩精品亚洲精品第一页| 亚洲精品制服丝袜二区| 亚洲精品你懂的| 久草视频中文| 欧美中文字幕无线码视频| 久久久久88色偷偷| 欧美综合区自拍亚洲综合天堂| 少妇高潮惨叫久久久久久| 日本手机在线视频| 中文字幕永久视频| 日韩在线播放欧美字幕| 视频国产精品丝袜第一页| h视频在线观看网站| 成人午夜网址| 亚洲一级毛片在线观播放| 中文成人在线视频| 亚洲制服中文字幕一区二区| 国产成人你懂的在线观看| 麻豆国产在线观看一区二区| 日韩天堂视频| 国产精品冒白浆免费视频| 日韩成人午夜| 97在线免费| 亚洲欧美不卡中文字幕| 日韩无码视频播放| 91人人妻人人做人人爽男同| 国产免费黄| 久久99国产乱子伦精品免| 99久久国产综合精品2020| 欧美亚洲激情| 97se综合| 成人永久免费A∨一级在线播放| 九九久久精品国产av片囯产区| 国产乱人伦AV在线A| 亚亚洲乱码一二三四区| 99er精品视频| 人妻精品久久无码区| 久久亚洲精少妇毛片午夜无码| 日韩a级毛片| 久久亚洲精少妇毛片午夜无码 | 99中文字幕亚洲一区二区| 亚洲高清资源| 91丨九色丨首页在线播放| 欧美日韩另类在线| 国内精品小视频在线| 少妇极品熟妇人妻专区视频| а∨天堂一区中文字幕| 少妇高潮惨叫久久久久久| 国产精品亚欧美一区二区| 日本精品视频一区二区| 精品亚洲欧美中文字幕在线看| 欧美性色综合网| 免费jizz在线播放|