欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
深入Java關(guān)鍵字null
一、null是代表不確定的對象
 
Java中,null是一個(gè)關(guān)鍵字,用來(lái)標識一個(gè)不確定的對象。因此可以將null賦給引用類(lèi)型變量,但不可以將null賦給基本類(lèi)型變量。
 
比如:int a = null;是錯誤的。Ojbect o = null是正確的。
 
Java中,變量的適用都遵循一個(gè)原則,先定義,并且初始化后,才可以使用。我們不能int a后,不給a指定值,就去打印a的值。這條對對于引用類(lèi)型變量也是適用的。
 
有時(shí)候,我們定義一個(gè)引用類(lèi)型變量,在剛開(kāi)始的時(shí)候,無(wú)法給出一個(gè)確定的值,但是不指定值,程序可能會(huì )在try語(yǔ)句塊中初始化值。這時(shí)候,我們下面使用變量的時(shí)候就會(huì )報錯。這時(shí)候,可以先給變量指定一個(gè)null值,問(wèn)題就解決了。例如:
 
        Connection conn = null;
        try {
            conn = DriverManager.getConnection("url", "user", "password");
        } catch (SQLException e) {
            e.printStackTrace();
        }
 
        String catalog = conn.getCatalog();
 
如果剛開(kāi)始的時(shí)候不指定conn = null,則最后一句就會(huì )報錯。
 
二、null本身不是對象,也不是Objcet的實(shí)例
 
null本身雖然能代表一個(gè)不確定的對象,但就null本身來(lái)說(shuō),它不是對象,也不知道什么類(lèi)型,也不是java.lang.Object的實(shí)例。
可以做一個(gè)簡(jiǎn)單的例子:
 
        //null是對象嗎? 屬于Object類(lèi)型嗎?
        if (null instanceof java.lang.Object) {
            System.out.println("null屬于java.lang.Object類(lèi)型");
        } else {
            System.out.println("null不屬于java.lang.Object類(lèi)型");
        }
 
結果會(huì )輸出:null不屬于java.lang.Object類(lèi)型
 
三、Java默認給變量賦值
 
在定義變量的時(shí)候,如果定義后沒(méi)有給變量賦值,則Java在運行時(shí)會(huì )自動(dòng)給變量賦值。賦值原則是整數類(lèi)型int、byte、short、long的自動(dòng)賦值為0,帶小數點(diǎn)的float、double自動(dòng)賦值為0.0,boolean的自動(dòng)賦值為false,其他各供引用類(lèi)型變量自動(dòng)賦值為null。
這個(gè)具體可以通過(guò)調試來(lái)看。
 
四、容器類(lèi)型與null
 
List:允許重復元素,可以加入任意多個(gè)null。
Set:不允許重復元素,最多可以加入一個(gè)null。
Map:Map的key最多可以加入一個(gè)null,value字段沒(méi)有限制。
數組:基本類(lèi)型數組,定義后,如果不給定初始值,則java運行時(shí)會(huì )自動(dòng)給定值。引用類(lèi)型數組,不給定初始值,則所有的元素值為null。
 
五、null的其他作用
 
1、判斷一個(gè)引用類(lèi)型數據是否null。 用==來(lái)判斷。
2、釋放內存,讓一個(gè)非null的引用類(lèi)型變量指向null。這樣這個(gè)對象就不再被任何對象應用了。等待JVM垃圾回收機制去回收。

java語(yǔ)言規范中是這么規定的: 

A literal is the source code representation of a value of a primitive type , the String type , or the null type : 

 Literal:     IntegerLiteral     FloatingPointLiteral     BooleanLiteral     CharacterLiteral     StringLiteral     NullLiteral 

While true and false might appear to be keywords, they are technically Boolean literals (§3.10.3). Similarly, while null might appear to be a keyword, 
it is technically the null literal (§3.10.7). 
The null type has one value, the null reference, represented by the literal null,which is formed from ASCII characters. A null literal is always of the null type. 
 
以下是我的一些想法:
package com.zac.expe1;
public class NullInDepth {
 public static void helloThere(){
  System.out.println("Hello from null?!");
 }
 
 public static void main(String[] args) {
  //((NullInDepth)null).helloThere();
  NullInDepth nullIn = null;
  nullIn.helloThere();
  Object nullStr = null;
  NullInDepth nullOut = (NullInDepth) nullStr;
  System.out.println(nullIn);
 }
 
}
這里Hello from null?!會(huì )被打印出來(lái),而后邊一句會(huì )打印出null,我們知道println一般是調用對象的toString來(lái)進(jìn)行打印,但是null明顯不是對象,作為一個(gè)不確定引用它只是把自己的literal給打印了出來(lái),因此我猜測null是預先存儲在內存中的一個(gè)引用,它是有值的,可能根據不同的jvm有不同的實(shí)現,但是jvm中會(huì )一致地將這個(gè)值打印為null。
 
另外按照我的猜測,null應該是棧里邊的一個(gè)引用,null type是可以轉換為所有其他type的引用,所以我也猜測null type應該是所有其他引用類(lèi)型的子類(lèi)型。
靜態(tài)方法(也許需要是public的)應該是由類(lèi)名來(lái)調用,但是也可以使用 類(lèi)名(null).靜態(tài)方法名 的方式調用,具體細節沒(méi)太弄懂。
 
Since Java and C# run on virtual machines, it does not matter what is used physically to represent null, and it is not necessarily the same across implementations.
What matters is the behaviour of null, as defined in the language specification (see Dan's and MRFerocius' answers for details). Basically, it is a special value that variables of reference type can hold, and which cannot be dereferenced.
BTW, as a reference point, the Java serialization spec use a single byte value 0x70 to represent a null reference.
"null" has the interesting property that "instanceof" used with null always returns false.
When putting a cast before a literal null, remember this is only a syntax to help the compiler choose between overloaded methods. The cast doesn't actually "do anything" to the null reference. Casting doesn't do anything anyway. If it survives in bytecode at all, it only performs a check. Static types only really matter to the compiler (blah blah reflection blah blah bytecode contains some static types blah blah).
 
再引用另外一篇文章,雖然根本上就錯了,但還是有些內容的:
 
作為關(guān)鍵字true,false,null都分別代表不同的含義。
 
"
"位"是內存中作為存儲數據的基本單位,而我們又通常說(shuō),一個(gè)字節是8位,也就是 1byte = 8bit。
 
因為內存中,"位"是使用0和1來(lái)表示的,所以作為關(guān)鍵字,true的值在內存中就表示1,false在內存中就是表示0。
 
但是這里不要和整數(int)中的0和1相比,他們占用的內存空間是不一樣的。一個(gè)int型的變量,占用的內存空間是4個(gè)字節,也就是4 * 8 = 32位,與true和false占用的內存空間是不同的。
 
而作為關(guān)鍵字null,解釋起來(lái)就更是麻煩了。
 
當一個(gè)對象被聲明時(shí)(Object o;),這個(gè)對象會(huì )以一個(gè)整數的字節數,只在內存堆棧(stack)中開(kāi)辟一個(gè)內存指針。例如,我們使用Object o = new Object();實(shí)例化一個(gè)對象,那么在內存中的運行則是:在內存堆棧(stack)中開(kāi)辟一個(gè)4個(gè)字節的指針,然后在內存堆區(heap)開(kāi)辟這個(gè)對象所要存儲的數據并初始化,然后在將之前在stack中的內存指針中賦上在heap中開(kāi)辟的空間的首地址。
 
而如果Object o;沒(méi)有進(jìn)行實(shí)例化,則不可能使用o的引用。這時(shí)為了方便使用,則出現了null關(guān)鍵字。null關(guān)鍵字的意義也就是一個(gè)用來(lái)初始化對象的空引用。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
深入Java對象的比較
Java中的null到底是啥?
Java基本數據類(lèi)型
跟我學(xué)習javascript的undefined與null
[z]為什么在多核多線(xiàn)程程序中要慎用volatile關(guān)鍵字? | 并行實(shí)驗室 | Paralle...
java內存管理
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久