本文目錄一覽:
java引用與C語言指針的區別是什麼?
java引用與C語言指針的區別有以下幾方面:
1、現象
指針在運行時可以改變其所指向的值,而引用一旦和某個對象綁定後就不再改變,總是指向最初的對象。
2、編譯
程序在編譯時分別將指針和引用添加到符號表上,符號表上記錄的是變量名及變量所對應地址。指針變量在符號表上對應的地址值為指針變量的地址值,而引用在符號表上對應的地址值為引用對象的地址值。符號表生成後就不會再改,因此指針可以改變指向的對象(指針變量中的值可以改),而引用對象不能改。
3、類型
引用其值為地址的數據元素,java封裝了的地址,可以轉成字符串查看,長度可以不必關心;C指針是一個裝地址的變量,長度一般是計算機字長,可以認為是個int。
4、內存佔用
所佔內存:引用聲明時沒有實體,不佔空間。C指針如果聲明後會用到才會賦值,如果用不到不會分配內存。
5、內存溢出
JAVA引用的使用權限比較小,不會產生內存溢出。C指針是容易產生內存溢出的,所以程序員要小心使用,及時回收。
6、本質
JAVA中的引用和C中的指針本質上都是想通過一個別名,找到要操作的目標(變量對象等),方便在程序里操作。所不同的是JAVA的辦法更安全,使用更加方便些,但沒有了C的靈活,高效。
java 中的引用是什麼意思?
1。首先,你要明白什麼是變量。變量的實質是一小塊內存單元。這一小塊內存里存儲着變量的值\x0d\x0a\x0d\x0a比如int a = 1;\x0d\x0a\x0d\x0aa就是變量的名名,1就是變量的值。\x0d\x0a\x0d\x0a而當變量指向一個對象時,這個變量就被稱為引用變量\x0d\x0a\x0d\x0a比如A a =new A();\x0d\x0a\x0d\x0aa就是引用變量,它指向了一個A對象,也可以說它引用了一個A對象。我們通過操縱這個a來操作A對象。 此時,變量a的值為它所引用對象的地址
java里的引用是啥意思?
說白了就是內存地址。
在Java中的引用類型,是指除了基本的變量類型之外的所有類型,所有的類型在內存中都會分配一定的存儲空間(形參在使用的時候也會分配存儲空間,方法調用完成之後,這塊存儲空間自動消失), 基本的變量類型只有一塊存儲空間(分配在stack中), 而引用類型有兩塊存儲空間(一塊在stack中,一塊在heap中), 方法形參的值傳遞(引用)是指形參和傳進來的參數指向同一個值的內存(heap)中;
java中的引用數據類型是怎樣的?
java中有兩種數據類型:基本類型和引用類型。\x0d\x0a基本類型有8個:\x0d\x0a 整數類型 byte、short、int、long\x0d\x0a 浮點數類型 float、double\x0d\x0a 字符型 char\x0d\x0a 布爾類型 boolean\x0d\x0a引用類型包括三種:\x0d\x0a 類 Class\x0d\x0a 接口 Interface\x0d\x0a 數組 Array\x0d\x0a基本類型是通過諸如 int a = 5; long b = 6L;的形式來定義的,稱為自動變量,自動變量存放的是字面值,不是類的實例,它存放在內存的堆棧中,數據大小和生存期必須是確定的,存取速度比較快,在堆棧中的字面值可以共享,也就是說我們定義一個int a = 5;然後又定義了一個int b = 5;這時a與b在內存中指向的是同一個字面常量。\x0d\x0a引用類型一般是通過new關鍵字來創建,比如Integer num = new Integer(3);它存放在內存的堆中,可以在運行時動態的分配內存大小,生存期也不必事先告訴編譯器,當引用類型變量不被使用時,Java內部的垃圾回收器GC會自動回收走。引用變量中存放的不是變量的內容,而是存放變量內容的地址。\x0d\x0a在參數傳遞時,基本類型都是傳值,也就是傳遞的都是原變量的值得拷貝,改變這個值不會改變原變量,而引用類型傳遞的是地址,也就是參數與原變量指向的是同一個地址,所以如果改變參數的值,原變量的值也會改變。這點要注意。\x0d\x0a在java中,8種基本類型在java中都有對應的封裝類型,也就是引用類型:\x0d\x0a 整數類型 Byte、Short、Integer、Long\x0d\x0a 浮點數類型 Float、Double\x0d\x0a 字符型 Character\x0d\x0a 布爾類型 Boolean\x0d\x0a有時候我們會看到這樣的語句 Integer num = 3;Boolean b = true;這樣定義也能行得通,其實這裏面有一個自動裝箱的問題,即java自動把3這個字面常量封裝成了Integer對象,同理也有自動拆箱。\x0d\x0a還有些需要注意的比較特殊的地方:\x0d\x0a1.Integer類型\x0d\x0aInteger i1 = 3;\x0d\x0aInteger i2 = 3;\x0d\x0a此時i1 == i2 返回的是true\x0d\x0aInteger i1 = 128;\x0d\x0aInteger i2 = 128;\x0d\x0a此時i1 == i2返回的是false,\x0d\x0a這時因為Integer的數值在-128~127之間時,即在int的範圍內,默認是按照基本類型int來存放的,仍舊存在堆棧中,如果超出了int的範圍,就按照對象的方式來存放和比較了。\x0d\x0a \x0d\x0a2、String類型\x0d\x0aString類型我們有時候也會直接這樣定義:\x0d\x0aString s = “abc”;\x0d\x0a這裡的”abc”稱為字符串常量,也是存在堆棧中的,s中存放的就是指向這個堆棧地址的引用,如果再定義一個\x0d\x0aString s1 = “abc”;\x0d\x0a這時,s與s1存放的是同一個地址的引用,即s與s1指向的是同一個字符串常量,\x0d\x0as == s1的值是true,\x0d\x0a但是如果有\x0d\x0aString s2 = new String(“abc”);\x0d\x0a這時s == s2則為false,因為使用new之後,每次生成的對象都不是同一個,即使存儲的內容相同。\x0d\x0a上面的s == s1,s == s2其實比較的都是地址,並不是裏面的內容。如果要比較內容,可以使用equals()方法。\x0d\x0a\x0d\x0a其他的就不多說了,打起來太慢了,可以自己去看一下java編程思想。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/156678.html