先問下,問什么不能new自己。
成都創新互聯公司是一家以成都網站建設公司、網頁設計、品牌設計、軟件運維、成都網站推廣、小程序App開發等移動開發為一體互聯網公司。已累計為成都玻璃貼膜等眾行業中小客戶提供優質的互聯網建站和軟件開發服務。
當然,假如按樓主的寫法,當這個A第一次被調用的時候,就出拋異常,超出堆棧、內存溢出之類。
樓主,你需要理解“聲明”和“實例化”的概念。
A a;
即是聲明,創建了一個A類型的變量a
new A();
即是實例化,實實在在地在內存里為A()劃分了一塊內存空間
a=new A();即是使a指向new A()。以后只要你不更改a的引用,對a的任何操作都會影響到你分配出來的這塊內存空間。
理解了這個再回到問題
public class A{}
這個是對類的一個定義,此時,A只是一個“概念”,在電腦里并沒有實體存在,但是java的虛擬機(jvm)已經得知了該類的所有定義,就是說,該類被加載進jvm的類加載器(class loader)了,其他的類有可能訪問到該A類。
此時A本身就是jvm中的一個類,它自己當然是和自己同包,對不對?
所以A必然可以訪問到A
那么public class A{ A a=new A();}
這句話,編譯期是正確的,不存在錯誤,所以可以聲明也(被jvm認為)可以實例化。
但是到了運行期,真正的跑起來的時候,它是錯誤的
因為這是個迭代的死循環。
在new A()的時候,又會執行一遍A a= new A();
然后該new A()又執行一遍A a= new A();
如此往復,直到堆棧溢出。
當然 以下寫法是正確的
public class A{
A a=null;
}
嗯,事實上,有些專門的寫法,如單例,工廠類,就是需要在某個類里面實例化它本身。這個,樓主等你基礎打好了,再研究吧。
第一對花括號是屬于構造方法的,第二對花括號括出了類的動態代碼塊,每次構造對象時都會執行動態代碼塊。
另外動態代碼塊是在構造方法之前執行的。
package?demo;
//使用反射
//Class.forName(className)).newInstance()
class?Reflect?{
static?{
System.out.println("動態創建Reflect類,這是靜態代碼塊");
}
public?void?speak()?{
System.out.println("動態創建Reflect類");
}
}
public?class?ReflectDemo?{
public?static?void?main(String[]?args)?throws?Exception?{
Class??Demo?=?Class.forName("demo.Reflect");
Reflect?test?=?(Reflect)?Demo.newInstance();
test.speak();
}
}
測試結果:
動態創建Reflect類,這是靜態代碼塊
動態創建Reflect類
靜態常量是屬于類的屬性,只有有了類,就有了這兒常量,不能變動的,所以就不能再動態語句里賦值使用了,只能在初始化賦初值,靜態塊中執行,而動態語句基本都是方法,是在堆中的,地址、內容屬于可變化的,兩者屬性不一致
網站題目:動態代碼塊java java 動態模塊
本文來源:http://m.newbst.com/article22/dogodjc.html
成都網站建設公司_創新互聯,為您提供網站排名、虛擬主機、企業建站、靜態網站、網站策劃、外貿建站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯