作者:林子雲
鏈接:https://www.zhihu.com/question/21468505/answer/18333632
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
首先要明白,java里對象傳遞的時候,傳遞的都是引用(也就是對象的地址),這比傳遞整個對象高效的多。而基礎類型,int,double等傳遞的才是值。
比如,(new ArrayList<String>).add(new String("hello")),jvm只是把new String("hello")的地址存入到了列表list里面。String str = new String("Test"),是開辟內存放入了對象,並把它的引用賦給str。
同理,BookInfo bookinfo=null與BookInfo bookinfo=new BookInfo():前者,是聲明了一個對象(的引用),jvm並沒有開辟內存放入一個對象;而后者,在聲明了一個對象的引用后,又把新開辟的沒有存儲任何有效值的對象的地址賦給了他。bookinfo=test.getinfo(),又把它指向了另一個地址 = = 也就是說原來開辟的內存並沒有用,那就沒有意義。但是java虛擬機自動垃圾回收機制會判斷並回收內存的。。不用想太多。
你完全可以寫成:
ArrayList<BookInfo> InfoList=new ArrayList<BookInfo>();
BookInfo bookinfo=infoList.getInfo()。
綜上:如果你的類在創建后,要自己讀寫數據,那就必須初始化;如果像Bookinfo那樣,完全是為了從其他地方接收引用,也完全可以省了new吧。
如果是在類的成員變量中,BookInfo bookinfo;和BookInfo bookinfo=null;是一樣的效果;因為該類在初始化時成員變量也會做初始化,默認就是null;而方法內的變量則不會初始化;
而如果是在方法的成員變量,則必須初始化,也就是=null或者new,因為為了保證java的安全性;
