首先簡要說明下程序運(yùn)行時(shí),內(nèi)存的結(jié)構(gòu)。堆區(qū)棧區(qū),常量區(qū),靜態(tài)方法區(qū)和非靜態(tài)方法區(qū)。 1.棧:存放基本類型的變量數(shù)據(jù)和對(duì)象的引用(也就是在new對(duì)象時(shí)左邊那一塊),但是對(duì)象本身不放在棧中,而是存在堆(new出來的對(duì)象)。棧中的數(shù)據(jù)大小和生命周期是可以確定的,當(dāng)沒有引用指向數(shù)據(jù)時(shí),這個(gè)數(shù)據(jù)就會(huì)消失。 2.堆:存放new出來的對(duì)象。堆中的對(duì)象由垃圾回收器負(fù)責(zé)回收,因此大小和生命周期不需要確定。 3.常量區(qū):存放字符串常量和基本類型常量。
代碼示例:
class Fu{ void method1() { System.out.內(nèi)存圖簡要示例舉個(gè)例子來說明編譯時(shí)(javac)和運(yùn)行時(shí)(java)的區(qū)別,代碼如下:
class Demo{ private int num; Demo(int num) { this.num=num; } public boolean equals(Object d) { Demo a=(Demo)d; return this.num==a.num; }}class Person{}public class object_equals{ public static void main(String[] args) { Demo a=new Demo(3); Demo b=new Demo(4); Person c=new Person(); System.out.println(a.equals(c)); }}結(jié)果:編譯通過,運(yùn)行掛掉
分析:equals方法是超類Object中的方法,我們把他復(fù)寫,調(diào)用equals時(shí),參數(shù) Object d=new Person()這里發(fā)生了向上轉(zhuǎn)型,接著Demo a=(Demo)d 編譯的時(shí)候是不會(huì)出錯(cuò)的,因?yàn)榇颂幍膁引用變量是綁定的Object這個(gè)類;而運(yùn)行時(shí),發(fā)生動(dòng)態(tài)綁定也就綁定到了Person類上,把Person類的對(duì)象轉(zhuǎn)化成Demo類的對(duì)象,出現(xiàn)類型轉(zhuǎn)換錯(cuò)誤。
改正:加上以下判斷即可.
if(!d instanceof Demo) return ;新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注