最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java和C++通過new創(chuàng)建的對象有何區(qū)別?

 更新時(shí)間:2017年11月17日 08:41:20   作者:Wray Zheng  
Java和C++都是面向?qū)ο蟮木幊陶Z言,然而Java和C++在創(chuàng)建對象時(shí)卻存在不同的方式,由于方式的不同導(dǎo)致在內(nèi)存中管理的不同。這篇文章主要給大家介紹了關(guān)于Java和C++通過new創(chuàng)建對象區(qū)別的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。

前言

本文我們不去談int、float、char等基本數(shù)據(jù)類型,而是用一般的類來說明。因?yàn)镴ava中可以直接通過 int varName 的方式來定義和使用一個(gè)基本類型的變量,但對于其它一般類型的對象,必須使用 new 來創(chuàng)建。

因此,為了更一般性地分析,體現(xiàn)兩種語言創(chuàng)建對象的差異,我們用自定義的類 Student 進(jìn)行說明,以下內(nèi)容均針對一般的類而言。

Java

在 Java 中,我們可以通過如下方式定義變量:

Student s; //定義標(biāo)識符s,沒有實(shí)際空間
Student s = new Student(); //定義s,并綁定到新創(chuàng)建的對象

JVM在進(jìn)行內(nèi)存管理時(shí),首先會(huì)在棧中給dog分配一個(gè)空間,當(dāng)new Dog();后會(huì)在堆中開辟對象的實(shí)際空間,然后將dog指向堆中的空間,這樣我們就可以方法對象的成員變量了。

圖3 Java創(chuàng)建對象方式的內(nèi)存分配

c++

在C++中,變量也可以同上來定義,但含義不同:

Student s; //定義標(biāo)識符s,并在棧中申請空間
Student* s = new Student(); //定義s,并在堆中申請空間,過后需手動(dòng)釋放內(nèi)存

這兩種方式在C++中都能完成對象的創(chuàng)建,但是在內(nèi)存中的處理卻完全不同。

對于第一種方式而言,dog是被存儲在棧中的,占用的大小是Dog類中成員變量占用內(nèi)存的和,此處不包括成員方法,因?yàn)槌蓡T方法是存放在公共存儲區(qū)以便所有該類的對象都可以訪問的。

  

圖1 C++創(chuàng)建對象方式1的內(nèi)存分配

對于第二種方式則不同,該方式使用了指針,在定義*p時(shí)在棧中開辟一個(gè)4字節(jié)的空間,new Dog()時(shí)在堆中開辟一塊空間,然后將該空間的首地址賦值給*p,這樣,通過*p就可以找到對象在堆中的任何成員方法了。

圖2 C++創(chuàng)建對象方式2的內(nèi)存分配

區(qū)別總結(jié)

兩種語言里都含有 new 操作符,但它們的含義大不相同,這與它倆的變量管理方式有關(guān)。

在 Java 中,只有當(dāng)你使用 new 操作符時(shí),才會(huì)真正在內(nèi)存中申請一塊空間,創(chuàng)建一個(gè)新對象,并將該對象綁定到你所定義的變量名上。其它情況下,要么是將已有對象綁定到某個(gè)變量名上,要么就是定義的變量名是個(gè)空引用,沒有綁定任何對象。

也就是說,定義變量名只是創(chuàng)建了一個(gè)新的標(biāo)識符,跟創(chuàng)建對象沒有關(guān)系,創(chuàng)建對象必須通過 new 來完成,只有創(chuàng)建對象時(shí)才會(huì)申請內(nèi)存空間。

但在 C++ 中,當(dāng)你定義了一個(gè)變量 s 時(shí),即使你沒有給它賦值,也意味著你不但創(chuàng)建了一個(gè)新的標(biāo)識符,同時(shí)還在棧中申請了對應(yīng)的內(nèi)存空間。

因此,C++ 中定義的變量名不僅僅是個(gè)標(biāo)識符,還自動(dòng)關(guān)聯(lián)著棧中的一塊內(nèi)存空間。

而 C++ 中的 new 操作符表示的是在堆中申請內(nèi)存,因?yàn)闂V械膬?nèi)存在運(yùn)行時(shí)期大小是固定且有限的,因此需要?jiǎng)討B(tài)內(nèi)存分配的時(shí)候就需要用 new 來實(shí)現(xiàn)。這類似于 C 里面的 malloc 函數(shù),只不過 new 操作符還封裝了其它的操作。

總結(jié)而言,Java 中的變量名僅僅是一個(gè)用于引用內(nèi)存中實(shí)際對象的標(biāo)識符,如果你沒給它關(guān)聯(lián)對象,它就為空引用。而 C++ 中的變量名(非指針類型),雖然也是標(biāo)識符,但卻始終關(guān)聯(lián)著實(shí)際的內(nèi)存空間,當(dāng)我們看到一個(gè)變量(非指針類型)時(shí),就知道它代表著一塊實(shí)際的內(nèi)存空間。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Spring中的FactoryBean與ObjectFactory詳解

    Spring中的FactoryBean與ObjectFactory詳解

    這篇文章主要介紹了Spring中的FactoryBean與ObjectFactory詳解,FactoryBean是一種特殊的bean,本身又是個(gè)工廠,實(shí)現(xiàn)了FactoryBean的bean會(huì)被注冊到容器中,需要的朋友可以參考下
    2023-12-12
  • java list中包含某個(gè)字符串的兩種方法實(shí)現(xiàn)

    java list中包含某個(gè)字符串的兩種方法實(shí)現(xiàn)

    在Java開發(fā)中,經(jīng)常需要判斷一個(gè)List中是否包含特定的字符串,包括使用contains()方法和循環(huán)遍歷判斷,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • JAVA面試題 start()和run()詳解

    JAVA面試題 start()和run()詳解

    這篇文章主要介紹了JAVA面試題 啟動(dòng)線程是start()還是run()?為什么?,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • springboot打成jar后獲取classpath下文件失敗的解決方案

    springboot打成jar后獲取classpath下文件失敗的解決方案

    這篇文章主要介紹了使用springboot打成jar后獲取classpath下文件失敗的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • springboot jpa分庫分表項(xiàng)目實(shí)現(xiàn)過程詳解

    springboot jpa分庫分表項(xiàng)目實(shí)現(xiàn)過程詳解

    這篇文章主要介紹了springboot jpa分庫分表項(xiàng)目實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Java jdk安裝及javac命令無效解決方案

    Java jdk安裝及javac命令無效解決方案

    這篇文章主要介紹了Java jdk安裝及javac命令無效解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Java實(shí)現(xiàn)的剪刀石頭布游戲示例

    Java實(shí)現(xiàn)的剪刀石頭布游戲示例

    這篇文章主要介紹了Java實(shí)現(xiàn)的剪刀石頭布游戲,涉及java隨機(jī)數(shù)生成及邏輯判定等相關(guān)操作技巧,需要的朋友可以參考下
    2017-12-12
  • JavaWeb Spring注解Annotation深入學(xué)習(xí)

    JavaWeb Spring注解Annotation深入學(xué)習(xí)

    這篇文章主要為大家詳細(xì)介紹了JavaWeb Spring注解Annotation,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Spring Boot Thymeleaf實(shí)現(xiàn)國際化的方法詳解

    Spring Boot Thymeleaf實(shí)現(xiàn)國際化的方法詳解

    這篇文章主要給大家介紹了關(guān)于Spring Boot Thymeleaf實(shí)現(xiàn)國際化的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Java this關(guān)鍵字的使用詳解

    Java this關(guān)鍵字的使用詳解

    this 關(guān)鍵字是 Java 常用的關(guān)鍵字,可用于任何實(shí)例方法內(nèi)指向當(dāng)前對象,也可指向?qū)ζ湔{(diào)用當(dāng)前方法的對象,或者在需要當(dāng)前類型對象引用時(shí)使用
    2021-11-11

最新評論

哈尔滨市| 辽中县| 法库县| 绥化市| 连平县| 航空| 安多县| 沙田区| 满城县| 盐源县| 庐江县| 新昌县| 平远县| 临城县| 萍乡市| 嘉义市| 疏勒县| 高密市| 清远市| 林芝县| 琼中| 鹤峰县| 南皮县| 汽车| 天峻县| 曲沃县| 普安县| 浦北县| 廉江市| 大姚县| 日照市| 南安市| 乌兰县| 淮阳县| 湘潭县| 鸡东县| 奇台县| 沁水县| 屏山县| 台东县| 蕲春县|