偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Java與C++語言在作用域上的差異淺析

開發(fā) 后端
本文介紹Java與C++在變量作用域和對(duì)象作用域方面的不同,以幫助大家進(jìn)一步認(rèn)識(shí)Java語言的優(yōu)勢。

Java與C++的編程思想雖然有一定的共同性,但是在很多方面仍然存在著不同。如兩者在作用域上仍然存在著很大的差異。下面筆者就分析一下這兩門語言在作用域上的差異,這里所提到的作用域包括變量作用域和對(duì)象作用域。

差異一:變量作用域的不同

如下面這段程序代碼是符合C++語言的語法要求的。其可以在C語言下正常運(yùn)行。但是其在Java語言平臺(tái)下編譯的時(shí)候,就會(huì)被告知有錯(cuò)誤。其格式、關(guān)鍵字上面都沒有錯(cuò)誤。那么錯(cuò)誤到底是這么呢?這就關(guān)系到變量的作用域。

{ 
       float y=3.15

       {

        float y=3.15

      }

      }

作用域就決定了其定義的變量名的可見性與生命周期。在C++語言(包括其衍生出來的其他語言)與Java語言中,都是用一定花括號(hào)來代表一個(gè)作用域的。如上面的代碼,就表示有兩個(gè)作用域。外面一對(duì)花括號(hào)代表一級(jí)作用域;里面一對(duì)花括號(hào)代表二級(jí)作用域,依次類推。通常情況下,一級(jí)作用域中定義的變量,對(duì)其下級(jí)作用率都是有效的。也就是說,其下級(jí)作用域可以直接引用上級(jí)作用域中定義的變量。但是在二級(jí)作用域中,可以更改一級(jí)作用率中設(shè)置的變量值,不過這個(gè)更改只在二級(jí)作用域內(nèi)部有效。如上面這個(gè)代碼,在二級(jí)作用域中可以再定義一個(gè)y變量,重新賦值。注意,其實(shí)在二級(jí)作用域中定義的變量與一級(jí)作用域中定義的變量,雖然名字相同,但是他們不是同一個(gè)變量。如果此時(shí)在一級(jí)作用域外,有其他代碼引用這個(gè)y變量的話,則其的值仍然是3.14,而不會(huì)是3.15。也就是說,在二級(jí)作用域中定義的變量,只在其內(nèi)部有效。對(duì)于上級(jí)作用域是沒有絲毫影響的。也就是說,在作用域中定義的變量只在其作用域內(nèi)有效。出了其作用域外,其內(nèi)部設(shè)置的變量就全部無效了。

這個(gè)作用域的設(shè)置其實(shí)Java語言與C++語言是類似的。但是在細(xì)節(jié)上Java語言又多了一條限制。如上表的代碼所示,雖然在上面的代碼中變量y在兩個(gè)不同的作用域中定義,照理來說是兩者是互不干涉,可以共存。但是在Java編譯器中,是不允許有這種情況存在的。把上面這個(gè)代碼在Java編譯器中編譯的話,編譯器會(huì)通知程序開發(fā)人員,說這個(gè)變量y已經(jīng)定義過。然后編譯會(huì)以錯(cuò)誤告終。雖然在C++語言中在不同級(jí)別的作用域中定義名字相同的變量是允許的,而在Java語言中則不行,這并不代表在變量的作用域上有所不同。其實(shí)從本質(zhì)上來說,兩者變量的作用域是相同的。只是對(duì)于Java語言來說,其又多加了一條限制。在Java語言中,即使作用域不同,其定義的變量名字也不能夠相同。這主要是為了提高Java代碼的可讀性,防止混淆才定義了這條規(guī)則。

差異二:對(duì)象作用域的差異

Java語言與C++語言一樣,都是面向?qū)ο蟮恼Z言。不過兩者在實(shí)現(xiàn)機(jī)制上有很大的不同。就拿對(duì)象的作用域來說,就有很大的差異。這也導(dǎo)致了兩個(gè)面向?qū)ο蟮恼Z言在實(shí)現(xiàn)細(xì)節(jié)上的巨大差異。

首先Java程序員需要明白的是,Java對(duì)象作用域與變量的作用域是不同的。如上面的分析,變量的作用域只在作用域內(nèi)部有效。如在二級(jí)作用域內(nèi)定義的變量,超出了二級(jí)作用域,那么就無效了。但是對(duì)象則不同,其可以存在于作用域之外。如現(xiàn)在在某個(gè)作用域內(nèi)定義了一個(gè)name_full對(duì)象。當(dāng)脫離這個(gè)作用域的時(shí)候,這個(gè)對(duì)象的引用是消失了。但是剛才創(chuàng)建的這個(gè)對(duì)象仍然實(shí)實(shí)在在的保存在內(nèi)存中。在Java程序的運(yùn)行過程中,只要通過傳遞或者復(fù)制對(duì)象引用的手段,那么在其他作用域內(nèi)仍然可以訪問這個(gè)對(duì)象。也就是說,只要我們有這個(gè)需要,那么在某個(gè)作用域內(nèi)創(chuàng)建的對(duì)象其會(huì)一直存在并可以在作用域外的其他任何一個(gè)地方進(jìn)行訪問。當(dāng)然前提是要通過復(fù)制或者傳遞等手段把對(duì)象引用傳遞到其他的作用域中。這就是Java對(duì)象與Java變量在作用域上最大的不同。

其次,Java對(duì)象與C++語言的作用域有很大的不同。其實(shí)C++語言中的對(duì)象跟變量的作用域到是很類似的。在C++語言中一旦使用完對(duì)象之后,就必須把這個(gè)對(duì)象銷毀掉。說的確切一點(diǎn),就是要在作用域內(nèi)把使用完的對(duì)象所占的內(nèi)存空間釋放掉。否則的話,如果在作用于外部,由于已經(jīng)失去了對(duì)這個(gè)對(duì)象的引用,為此這個(gè)對(duì)象就好像成為了太空中的一個(gè)人,無法再對(duì)其進(jìn)行任何的操作,只要任其自生自滅。為此對(duì)于C++語言來說,程序員很難在脫離作用域外后,確保在需要調(diào)用對(duì)象時(shí),仍然可以訪問這個(gè)對(duì)象。這也正是C++語言開發(fā)過程中最讓人頭疼的問題。因?yàn)樾枰止礓N毀對(duì)象。萬一對(duì)象所占用的內(nèi)存空間沒有別及時(shí)釋放的話,那么對(duì)于應(yīng)用程序的安全與性能都會(huì)產(chǎn)生很大的影響。

在Java程序中,這個(gè)作用域外的對(duì)象最終有兩個(gè)去向。首先,可以通過復(fù)制或者傳遞,在作用域外部仍然可以訪問這個(gè)對(duì)象。其次,就是銷毀對(duì)象。不過我們不用通過代碼來銷毀這個(gè)以前創(chuàng)建的對(duì)象。因?yàn)樵贘ava語言中有一種叫做垃圾回收器的處理機(jī)制,其可以用來動(dòng)態(tài)監(jiān)視New關(guān)鍵字創(chuàng)建的所有對(duì)象,并根據(jù)一定的規(guī)則來判斷哪些對(duì)象不會(huì)再被引用。如果其判斷某個(gè)對(duì)象不再被引用話,則會(huì)自動(dòng)釋放這些對(duì)象所占用的內(nèi)存空間,以供其他新的對(duì)象所使用。我們程序開發(fā)人員只管創(chuàng)建對(duì)象即可,而不用去擔(dān)心什么時(shí)候去銷毀對(duì)象。為此,這就可以消除C++語言面臨的內(nèi)存溢出問題。這個(gè)內(nèi)存溢出問題就是因?yàn)槌绦蜷_發(fā)人員用完對(duì)象后忘記銷毀所造成的。

由于在Java程序開發(fā)中,我們開發(fā)人員不用關(guān)心對(duì)象的銷毀問題,為此可以更多的精力放在代碼的優(yōu)化上。而不像C++語言那樣,要把這個(gè)對(duì)象銷毀問題當(dāng)作頭件大事來對(duì)待。雖然如此,不過Java程序員也不能夠掉以輕心。特別是當(dāng)我們在離開某個(gè)作用域后還需要訪問這個(gè)對(duì)象的時(shí)候,一定要記得通過復(fù)制或者傳遞等手段把對(duì)象引用傳遞給其他作用域。否則的話,即使這個(gè)對(duì)象沒有消亡,還實(shí)際存儲(chǔ)在內(nèi)存中,但是也會(huì)因?yàn)槿鄙倭艘枚鵁o法訪問他們。為此在跨作用域引用對(duì)象的時(shí)候,這個(gè)引用的復(fù)制與傳遞千萬不能夠忘了。

如果不幸忘了的話,那么在作用域外的代碼就無法再訪問這個(gè)對(duì)象。不過這個(gè)對(duì)象在一定時(shí)候會(huì)被垃圾回收器回收了。被釋放了的內(nèi)存空間就可以被重復(fù)使用,從而防止內(nèi)存溢出的問題發(fā)生。

總之,當(dāng)Java程序員在開發(fā)應(yīng)用程序的時(shí)候,這個(gè)Java對(duì)象與Java變量作用域的差異,以及Java對(duì)象與其他語言對(duì)象作用域的差異,一定要了然于胸。這有助于Java程序員能夠更好的利用這個(gè)Java對(duì)象。另外筆者不厭其煩的再強(qiáng)調(diào)一遍,默認(rèn)情況下脫離了某個(gè)作用域之后,對(duì)象就失去了引用無法訪問。如果要在作用域再訪問這個(gè)對(duì)象的時(shí)候,則需要及時(shí)把這個(gè)引用復(fù)制或者傳遞出來。否則的話,作用域外的代碼是無法再操作這個(gè)對(duì)象。

您正在閱讀:Java與C++語言在作用域上的差異淺析
 

【編輯推薦】

  1. 詳解Spring中bean的作用域
  2. Java開發(fā)平臺(tái)中的生命周期管理
  3. Java程序員,你為什么要關(guān)注Scala
責(zé)任編輯:佚名 來源: IT專家網(wǎng)
相關(guān)推薦

2011-12-06 10:48:32

Java

2011-12-06 11:12:59

Java

2009-08-03 16:28:53

Java語言與C#語言

2011-12-06 09:42:51

Java

2024-03-14 11:27:16

C++變量編程

2010-01-21 16:18:06

C++語言

2011-12-06 12:16:58

Java

2010-11-16 08:48:45

SQL ServerOracle

2011-06-11 21:36:44

C#C++

2009-11-17 09:07:55

靜態(tài)構(gòu)造函數(shù)

2011-07-20 16:16:03

CC++

2010-01-21 09:34:57

C++語法

2010-01-27 16:05:06

C++堆棧

2009-08-13 17:30:30

C#構(gòu)造函數(shù)

2010-01-25 09:57:39

C++函數(shù)參數(shù)

2010-01-20 10:19:55

C++數(shù)組

2010-01-27 17:16:52

C++構(gòu)造函數(shù)

2023-09-13 11:51:16

位域C++

2010-02-03 16:42:45

C++變量作用域

2010-01-21 13:48:30

C++基類
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)