java 繼承內存分配

今天,複習的是繼承的內存分配。咱們知道,Java中內存能夠初略分爲堆、棧、方法區。java

 

[java]  view plain  copy
 
  1. package sort;  
  2. class Person{  
  3.     public int age;  
  4.     public String name;  
  5.     public Person(){  
  6.         System.out.println("父類");  
  7.         say();  
  8.     }  
  9.     public void say(){  
  10.         System.out.println("有人說話。");  
  11.     }  
  12. }  
  13. class Student extends Person{  
  14.     public String school;  
  15.     public Student(){  
  16.         System.out.println("子類");  
  17.     }  
  18.     public void say(){  
  19.         System.out.println("學生"+name+age);  
  20.     }  
  21. }  
  22. public class ExtendsDemo  
  23. {  
  24.     public static void main(String[] args) {  
  25.         Student s = new Student();  
  26.         s.age=20;  
  27.         s.name="tom";  
  28.         s.say();  
  29.     }  
  30. }  

上面是一個簡單的繼承例子,輸出的結果是:

父類
學生null0
子類
學生tom20函數

能夠先畫個內存圖:post

能夠簡易理解成父類的空間是一個小圓,被子類的大圓包住了,因此當咱們從子類找一個變量,是先從大圈圈找,找到了就返回,若是大圈圈沒有,那就到小圈圈裏找。spa

這個程序執行的基本流程是:.net

1.虛擬機加載Test類,提取類信息到方法區;線程

2.經過保存在方法去的字節碼,虛擬機開始執行main方法,main函數入棧;對象

3.執行Student s = new Student();給student實例對象分配堆空間。又由於實現本身要先實現父類,因此,虛擬機加載person類到方法區,並在堆中爲父類成員變量在子類空間中初始化。而後加載student類到方法區,爲子類的成員變量分配空間並初始化。blog

4.接下來兩條語句爲成員變量賦值,因爲name跟age是從父類繼承而來,會被保存在子類父對象中,因此就根據引用變量s持有的引用找到堆中的對象(子類對象),而後給name跟age賦值。繼承

 

5.調用say()方法,經過引用變量s持有的引用找到堆中的實例對象,經過實例對象持有的本類在方法區的引用,找到本類的類型信息,定位到say()方法。say()方法入棧。開始執行say()方法中的字節碼。ip

6.say()方法執行完畢,say方法出棧,程序回到main方法,main方法執行完畢出棧,主線程消亡,虛擬機實例消亡,程序結束。

  總結:相同的方法會被重寫,變量沒有重寫之說,若是子類聲明瞭跟父類同樣的變量,那意味着子類將有兩個相同名稱的變量。一個存放在子類實例對象中,一個存放在父類子對象中。父類的private變量,也會被繼承而且初始化在子類父對象中,只不過對外不可見。

當出現多態狀況的時候,調的具體是哪一個函數又須要匹配了。

相關文章
相關標籤/搜索