欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

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

Java

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

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

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

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

c++

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

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

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

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

  

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

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

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

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

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

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

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

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

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

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

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

總結(jié)

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

相關(guān)文章

  • Java中ThreadPoolExecutor拒絕策略踩坑

    Java中ThreadPoolExecutor拒絕策略踩坑

    本文主要介紹了Java中ThreadPoolExecutor拒絕策略踩坑,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • SpringBoot整合EasyExcel實現(xiàn)復(fù)雜Excel表格的導(dǎo)入導(dǎo)出

    SpringBoot整合EasyExcel實現(xiàn)復(fù)雜Excel表格的導(dǎo)入導(dǎo)出

    這篇文章主要為大家詳細(xì)介紹了SpringBoot如何整合EasyExcel實現(xiàn)復(fù)雜Excel表格的導(dǎo)入導(dǎo)出功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考下
    2023-11-11
  • Java 關(guān)于時間復(fù)雜度和空間復(fù)雜度的深度刨析

    Java 關(guān)于時間復(fù)雜度和空間復(fù)雜度的深度刨析

    算法復(fù)雜度分為時間復(fù)雜度和空間復(fù)雜度。其作用: 時間復(fù)雜度是度量算法執(zhí)行的時間長短;而空間復(fù)雜度是度量算法所需存儲空間的大小
    2021-11-11
  • spring依賴注入知識點分享

    spring依賴注入知識點分享

    在本篇文章里小編給大家整理的是關(guān)于spring依賴注入知識點以及相關(guān)代碼內(nèi)容,需要的朋友們學(xué)習(xí)下。
    2019-11-11
  • 深入解析HashMap的put方法

    深入解析HashMap的put方法

    在Java集合中,HashMap的重要性不言而喻,作為一種存儲鍵值對的數(shù)據(jù)結(jié)構(gòu),它在日常開發(fā)中有著非常多的應(yīng)用場景,也是面試中的高頻考點,本篇文章就來分析一下HashMap集合中的put方法
    2022-01-01
  • IDEA+maven+SpringBoot+JPA+Thymeleaf實現(xiàn)Crud及分頁

    IDEA+maven+SpringBoot+JPA+Thymeleaf實現(xiàn)Crud及分頁

    這篇文章主要介紹了不需要電腦任何操作基于IDEA + maven + SpringBoot + JPA + Thymeleaf實現(xiàn)CRUD及分頁,需要的朋友可以參考下
    2018-03-03
  • Springcloud之Gateway組件詳解

    Springcloud之Gateway組件詳解

    Spring Cloud Gateway是Spring Cloud微服務(wù)生態(tài)下的網(wǎng)關(guān)組件。Spring Cloud Gateway是基于Spring 5和Spring Boot 2搭建的,本質(zhì)上是一個Spring Boot應(yīng)用。本文詳細(xì)介紹了SpringCloud的網(wǎng)關(guān)組件 Gateway,,需要的朋友可以參考下
    2023-05-05
  • 詳解Java多線程編程中互斥鎖ReentrantLock類的用法

    詳解Java多線程編程中互斥鎖ReentrantLock類的用法

    Java多線程并發(fā)的程序中使用互斥鎖有synchronized和ReentrantLock兩種方式,這里我們來詳解Java多線程編程中互斥鎖ReentrantLock類的用法:
    2016-07-07
  • Java數(shù)據(jù)結(jié)構(gòu)篇之實現(xiàn)二叉搜索樹的核心方法

    Java數(shù)據(jù)結(jié)構(gòu)篇之實現(xiàn)二叉搜索樹的核心方法

    二叉搜索樹是一種常用的數(shù)據(jù)結(jié)構(gòu),它是一棵二叉樹,且每個節(jié)點的值都大于其左子樹中任何節(jié)點的值,而小于其右子樹中任何節(jié)點的值,這篇文章主要給大家介紹了關(guān)于Java數(shù)據(jù)結(jié)構(gòu)篇之實現(xiàn)二叉搜索樹的核心方法,需要的朋友可以參考下
    2023-12-12
  • Spring和Mybatis整合的原理詳解

    Spring和Mybatis整合的原理詳解

    這篇文章主要介紹了Spring和Mybatis整合的原理詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07

最新評論