關於nul強制轉換的問題

2021-09-05 10:09:07 字數 1188 閱讀 7647

前言:今天在研究shiro的時候發現乙個這麼乙個寫法,如下圖所示:

這是乙個******accountrealm裡面的兩個方法.下面的addaccount過載於上面的addaccount method,

在第乙個addaccount方法中,我第一眼看上去感覺很奇怪.為什麼這個第三個引數要強轉一遍????這樣強轉不會出現nullpointerexception???

介紹一下原始碼版本.shiro-core 1.2.3 ,感興趣的同學可以去看看

1.為什麼不會出錯

先附上一段測試案列:

object a = null;

try catch (nullpointerexception e)

我們來看看上面這段**.首先.我們在棧中新建了乙個區域性變數a,因為a沒有例項化物件.所以這個a的值是沒有資料的.然後再執行下面一行**.我們把a的值拿出來賦值給b.因為a沒有值.所以這個b也是為null.並不會因為丟擲錯誤.

由此延伸出來的問題:

public class ******test 

@test

public void nullconverttest()catch (nullpointerexception e)

((******test)null).now();}}

新建乙個******test類.類裡面有乙個靜態方法now.現在我強制轉換乙個null為******test型別.並呼叫他的靜態方法.會出錯嗎?

結果也是不會的.眾所周知.我們的jvm在記憶體中開闢了乙個方法區.這個方法區專門用來存放class類及靜態方法.

當我們在強轉為******test類時.也就相當於獲得了這個類的引用.靜態方法now歸屬於方法區.和例項無關.所以執行結果是:"當前index為: 1"

2.為什麼這樣寫?

在實際開發中.我見的最多的就是要麼傳個null進去.要麼就直接new個string陣列.不太建議null乙個物件.這樣每次呼叫的時候.都會在使得jvm在堆中初始化乙個物件.如果該方法呼叫頻率非常高.那麼是一件非常大的記憶體消耗.

關於強制轉換

1.a和 a的區別 a是整個陣列的首位址,a是陣列首元素的首位址,其值相同,但是意義不同。eg char a 5 char p1 5 a 沒有問題,char p1 5 是陣列指標,指向陣列a 5 的首位址。char p2 5 a 編譯出錯,提示型別無法從 char 5 轉換為 char 5 需要把a...

關於強制型別轉換

var dump 0 null false var dump 0 0 true var dump 0 false var dump 0 false true var dump 0 null true var dump 0 0 true var dump 0 true var dump 0 false...

關於強制型別轉換

思考 includeint main int ptr1 int a 1 int ptr2 int int a 1 printf x,x n ptr1 1 ptr2 return 0 輸出 4,2000000 我們先看第乙個我們知道ptr1 n ptr1 n 所以ptr1 1 實際上就說ptr所指的前...