導航:首頁 > 編程語言 > java引用指針的區別

java引用指針的區別

發布時間:2023-11-29 02:02:46

java的基本數據類型和引用數據類型的區別

一、作用的不同

1、引用類型一般都是通過new關鍵字創建對象,然後把這個對象賦予給相應的變數,最常用的引用類型是String類型,它也比較特殊,可以直接通過關鍵字new來創建對象,也可以通過字元串直接賦值,比如:

Strings=newString("abc");

Strings="abc";

2、基本類型就是直接賦值就可以了,比如:

inta=123;

floatb=123.0;

boolean=true;

二、參數方面傳遞的不同

引用類型是引用傳遞

基本類型是值傳遞

三、比較方面的不同

引用類型比較的是引用地址(沒有重寫equals方法)

基本類型比較的是值

五、類型的不同

1、引用類型分為四種

強引用(StrongReference)

軟引用(SoftRefernce)

弱引用(WeakReference)

虛引用(PhantomReference)

強引用-StrongReference

2、八種基本類型

整型byte8位

整型short16位

整型int32位

整型long64位

浮點型float32位

浮點型double64位

字元型char16位

布爾型boolean位數不確定

❷ java里的指針和c++指針的區別

  1. 類型:引用其值為地址的數據元素,java封裝了的地址,可以轉成字元串查看,長度可以不必關心。C++指針是一個裝地址的變數,長度一般是計算機字長,可以認為是個int。

    2.所佔內存: 引用聲明時沒有實體,不佔空間。C++指針如果聲明後會用到才會賦值,如果用不到不會分配內存。

    3.類型轉換:引用的類型轉換,也可能不成功,拋異,或者IDE就不能通過。C++指針只是個內存地址,指向那裡,對程序來說還都是一個地址,但可能所指的地址不是程序想要的!

    4.初始值:引用初始值為java關鍵字null。C++指針是INT,如不初始化指針,那他的值就不是固定的了。

    5.計算:引用是不可以計算的。C++指針是INT,所以他可以計算,所以經常用指針來代替數組下標。

    6.控制:引用不可以計算,所以他只能在自己程序里,可以被控制。C++指針是內存地址,也可以計算,所以他有可能指向了一個不歸自己程序使用的內存地址,對於其他程序來說是很危險的,對自己程序來說也是不容易被控制的。

    7.內存泄露:JAVA引用不會產生內存泄露。C++指針是容易產生內存泄露的,所以程序員要小心使用,及時回收。

    8.作為參數:JAVA的方法參數只是傳值,引用做為參數使用時候,回給函數內引用的值的COPY,所以在函數內交換兩個引用參數是沒意義的,因為
    函數只交換的參數的COPY值,但在函數內改變一個引用參數的屬性是有意義的,因為引用參數的COPY所引用的對象是和引用參數是同一個對象。
    C++指針做為參數給函數使用,實際上就是他所指的地址在被函數操作,所以函數內用指針參數的操作都將直接作用到指針所指向的地址(變數,對象,函數,等
    等)。

    9.操作符和聲明:java里用"."。C++指針用"->" 用"*"聲明指針。(似乎這條沒什麼用!)

    10.本質:java中的引用和C++中的指針本質上都是想通過一個叫做引用或者指針的東西,找到要操作的目標(變數 對象等),方便在程序里操作。所不同的是JAVA的辦法更安全,方便些,但沒有了C++的靈活,高效。

    java中的引用和C++中的指針,他們最好不要混在一起,也不要認為是一回事,只不過他們的作用有些相似,總叫人不自覺的對比。但在我們寫
    JAVA程序的時候最好忘記C++的指針,寫C++程序的時候,也不要老惦記著JAVA的引用。只要記得
    引用無大小,安全,不可計算,強轉時要小心就好了。

請採納。

❸ java引用與C語言指針的區別是什麼

java引用與C語言指針的區別有以下幾方面:

1、現象

指針在運行時可以改變其所指向的值,而引用一旦和某個對象綁定後就不再改變,總是指向最初的對象。

2、編譯

程序在編譯時分別將指針和引用添加到符號表上,符號表上記錄的是變數名及變數所對應地址。指針變數在符號表上對應的地址值為指針變數的地址值,而引用在符號表上對應的地址值為引用對象的地址值。符號表生成後就不會再改,因此指針可以改變指向的對象(指針變數中的值可以改),而引用對象不能改。

3、類型

引用其值為地址的數據元素,java封裝了的地址,可以轉成字元串查看,長度可以不必關心;C指針是一個裝地址的變數,長度一般是計算機字長,可以認為是個int。

4、內存佔用

所佔內存:引用聲明時沒有實體,不佔空間。C指針如果聲明後會用到才會賦值,如果用不到不會分配內存。

5、內存溢出

JAVA引用的使用許可權比較小,不會產生內存溢出。C指針是容易產生內存溢出的,所以程序員要小心使用,及時回收。

6、本質

JAVA中的引用和C中的指針本質上都是想通過一個別名,找到要操作的目標(變數對象等),方便在程序里操作。所不同的是JAVA的辦法更安全,使用更加方便些,但沒有了C的靈活,高效。

❹ java中到底有沒有指針

學過c/c++,然後學Java的人往往心中有此糾結,java中到底有沒有指針?
如果一定要在是或否里選擇一個,OK,java中沒有指針。
那麼,java中的引用(reference)和c/c++中的指針(如無特別說明,後文指針均指c/c++中的指針)究竟有著什麼樣糾葛不清的關系呢?

在開始之前先說一下c/c++的引用,它跟java的引用完全不是一個東西,c/c++的引用是同一塊內存的不同名字。而java的引用是指向一個對象,引用本身也佔用了內存。
首先,列舉一下能對指針進行的一些常見操作:
1、指向一個對象,如 Person *p = new Person….;int *iv = new int….
2、對指針所指的對象進行操作:P->getAge(); (*p).getAge();
3、獲取存儲在指針中的地址值。
4、將指針指向另外一個對象:Person *p1 = new Person…; p = p1; 但,不可以*p = p1這樣來賦值。
5、刪除new的空間,delete p1;
6、其它諸多操作
這么多已經足夠了,接下來看看java引用能做什麼操作。
a、指向一個對象,如Person p = new Person…
b、調用對象的方法,p.getAge();
c、指向另外一個對象,Person p1 = new Person…; p = p1;
OK,就這么多了。
對於a和1,他們的功能是類似的,但java引用無法指向一個基本變數。。
對於b,java引用和指針就不同了,在這點上,Java reference更像是解引用(dereference)了的指針;或者說java中的.操作符某種程度上等價於指針的->操作符,如果是這樣種解釋的話,我們無法再對java的reference解引用了。
對c和4,是類同的。
除此,我們無法獲取java引用存的地址,我們不能delete,還有很多……
綜上,竊以為java的引用可以看成是一個功能受限的指針(或者說被閹割的指針)。另一方面,功能如此受限,它還能叫指針嗎?了解了指針和java引用的區別與聯系,還需要糾結「java中有沒有指針」這個問題嗎!

❺ java中指針怎麼理解

實際上,java力圖使程序員忘記指針,這包括2個方面:
第一,java限制指針,去除了指針運算。
第二,java從語法上努力隱藏指針,讓指向某對象的指針看起來更像那個對象本身!

是的,所有的java書籍都讓人忘記了指針這回事,我們彷彿只跟對象打交道。偶爾,會被迫分清引用和
對象的關系。這就是目前的情形。多麼好的想法!對象可比那些個不知所以的指針親和多了!這是一種偉大的抽象!

這里,我們也更願意把引用和對象混淆。是的,為什麼不呢?那樣,整個世界都是對象,太好理解了!

可事實上,為了節省內存,java不能把引用(指針)完全廢除。要知道,復制一個引用(指針)要比
復制整個對象有效得多!所以我們不得不面對引用和對象共存的事實。

下面我就好好分析分析:

指針已經被抽象成了引用,現在指針不能夠隨心所欲的運算,並且看起來就像個對象,完全沒有了指針
的模樣。但它畢竟和對象還是不同的,還要經過一層「轉換」(從指向的那個對象里取數據)。如果我們
在引用滿天飛的時候總想著這樣一層轉換,真的是很不舒服。比如:
String key="name";
String value="hyq";
HashMap map=new HashMap();
map.put(key,value);

你得想著:key只是個引用,value也是個引用,map還是個引用,我們剛剛做的是把key和value
這2個引用放進了map(也是個HashMap對象的引用)中,到時候我就可以通過map這個引用取得
裡面的對應於key引用的value引用!

你不暈我就服了。
一旦你這樣想,你每時每刻都要面對這樣的繞口令。因為我們對對象的操作全部要通過引用!java沒有提供語法讓你直接得到對象!(指的是直接定址)這一點通過比較原始類型很好理解,int i=8,那麼
i就是8,不是什麼指針,要先找到放著8那塊內存的地址再把8拿出來。這樣多直接,多方便啊!

所以,我們對引用最好也這么來理解,就輕松多了。
還是上面的例子,key就是個String,value也是個String,map是個HashMap,我們把key和value
放進map里,將來可以按key取出value。——多簡單!

其實,這樣的理解是很符合人的思維習慣的,我相信大多數人剛學java時都會自然而然的這么理解,
但是我們一定要注意在什麼時候不能這么理解。只要記住什麼時候不能這么理解,我們就不會因為
這種「近似」的理解方式而犯錯,而同時從這種理解方式里得到了方便和好處。

把引用直接當作對象本身的好處是簡單直接,容易理解,而「誤差」的地方就在於,假設只有這個引用
可以修改此對象。換句話說,當別的引用修改了對象的時候,我們毫不知情並很感費解。比如:

String name=null;
HashMap map=new HashMap();
map.put("name",name);

//do a lot of things
name="hyq";

當我們再從map里取出name的時候,發現它已經被賦值為hyq了!放進去的時候明明是啥都沒有啊!
咋就變了訥?
引用到name那個對象的不只你map一個阿!

在同一個函數里出現這種情況還不是很常見,我們一般也不必這么寫,更多的是出現在函數調用、傳參的時候,這樣更加隱蔽,不易發現,也讓代碼可讀性下降。比如:
String name=null;
HashMap map=new HashMap();
map.put("name",name);

alterName(name);

在alterName函數里我們修改了name對象,這會直接影響到函數外的map。

所以,當我們把引用和對象故意混淆時,一定要記住什麼時候應該分清楚。

對象的使用不外乎以下幾種情況:

1
String name=new String("hyq");
然後使用name,引用生命周期一結束,對象失效(無法被取用)了事。這里只有name一個引用指向此對象,隨便怎麼弄都不會出事。

2
String name=new String("hyq");
String anotherName=name;

這里假設只有name會修改對象,並且在anotherName引用此對象前做完所有修改,anotherName只是取用這個對象調用方法。在這種情況下,也不會出事。這也是我們經常遇到的情況,並且一般都是在函數調用傳參時出現。注意傳參實際上就是String anotherName=name;
這里尤其要注意的是2個引用的生命周期:name修改對象的時候另一個引用還沒出世,而等它出世後
發現它又不會修改對象,怎一個爽字了得!

3
String name=new String("hyq");
String anotherName=name;
代碼和上面一樣,但是這里要麼2個引用都會修改對象,要麼只有一個修改但會影響到另一個。這個時候無論如何你不能再把引用當對象了,你必須分清楚它們。你必須小心仔細,不能有絲毫疏忽。

當然,這種寫法和風格無論如何是不值得提倡的,若非必要(沒辦法)請勿模仿!因為必然有一個引用
在不知情的情況下被人修改了對象,等它用的時候會大吃一驚,而這個對象是在什麼時候被什麼人修改的,極難排查。
(上面例子舉得不好,String類是不變類,汗!)
StringBuffer name=new StringBuffer("hyq");
StringBuffer anotherName=name;
//do a lot of things
anotherName.append("is my gf");

你可能寫得爽,一時痛快就這么寫了,你也知道是什麼人在什麼時候修改了對象,但是別人呢?
要知道,這里可能不是相隔幾行代碼這么簡單,可能是嵌套了好幾層函數調用!你把那個anotherName傳到第5層函數裡面,然後喪心病狂的修改了那個對象,除了天知地知你知,鬼
都看不出來!

❻ Java中this的用法跟C++的this指針一樣嗎

Java的this是改對象的引用,通過「.」號調用對象。C++的this是指向該對象的指針,用「->」調用對象。Java 的this引用和C++this指針雖然在用法上很相似,但是有本質的區別,引用相當於與對象的索引號,它的值對於程序員沒有任何意義,而指針的值是對象的地址對程序員很有用處。

閱讀全文

與java引用指針的區別相關的資料

熱點內容
加密貨幣行業前景如何 瀏覽:570
arm查詢法的局限性和編譯流程 瀏覽:78
醒圖的文件夾叫什麼 瀏覽:998
php程序員北京 瀏覽:175
gcc編譯進程數據 瀏覽:653
手機上的文件夾是怎樣的 瀏覽:166
微雲群共享文件夾改變 瀏覽:534
程序員三年後能做什麼 瀏覽:449
分解運演算法則 瀏覽:876
python腳本執行sudo 瀏覽:721
安徽科海壓縮機 瀏覽:372
怎麼下載app里的講義 瀏覽:158
命令重啟伺服器 瀏覽:210
android電視root許可權獲取 瀏覽:249
解放戰爭pdf王樹增 瀏覽:685
python壓測app介面 瀏覽:953
抖音app怎麼推薦 瀏覽:100
歌庫伺服器能做其他什麼用途 瀏覽:95
安卓44虛擬機怎麼root 瀏覽:38
程序員瘦身c盤空間 瀏覽:243