java基本功16課:(2)對象與內存控制

前言

上一節提到了實例變量和實例對象的區別,那么這節就繼續深入一下變量以及對象。
主要內容:

  • 實例變量和類變量
  • 父,子類實例變量和內存分配機制
  • final 的注意事項

1. 實例變量和類變量

1.1 定義

  • 實例變量:在類里面沒有使用static修飾的變量,例如:int i;也稱為非靜態變量
  • 類變量:在類里面使用了static修飾的變量,例如:static int i; 也稱為靜態變量

1.2 區別

  • 首先在同一個JVM內每個類對應一個Class對象,也就是說,只會給該類劃分一次內存空間,因此類變量才會只有一次初始化。相對于實例變量,當每次建立對象(實例),都會劃分一塊新的內存空間。
    所以,所有的該類的實例對象,都是共用一個類變量。

1.3 初始化

  • 首先看一段代碼
class test{
    //1.weight 初始化的值是多小
    double weight=2.3;
    {
        weight=4.3;
    }   
    test(){
        this.weight=4.6;
    }


    // 2.向前引用(為什么)
    int num1=num2+2;
    static int num2=4;
    

    // 3.請說出name 初始化的值應該是什么
    static{
        name="我愛java";
    }
    static String name="給我丶鼓勵";


}

  • 有答案了嗎?有疑問嗎?
    • 首先得把該類的初始化過程理解清楚。第一步是建立劃分一個類對象的內存空間,然后把變量初始化(優先是把類變量給初始化,然后再到實例變量初始化)。第二步,再對變量進行賦值,在賦值的過程中,是按照代碼順序由上往下賦值的。
    • 在了解完類初始化過程之后,第一個問題weight=4.6就很顯然了。但是有趣的事,在編譯的時候,是可以看到,其實編輯器是把weight=2.3,和非靜態代碼塊放在構造方法里面了。順序是由上往下排,所以結果還是4.6而已。
    • 為什么可以向前引用呢?那是因為在類初始化的時候,類變量是優先與實例變量初始化的,所以才可以向前引用。
    • name=“給我丶鼓勵”,為什么呢?因為這里就很好地解釋了初始化其實是兩步。變量先初始化默認的值,例如int 是0,然后再把變量給賦值。所以name=null,然后name="我愛java",然后name="給我丶鼓勵"。

2. 父,子類實例變量和內存分配機制

2.1 繼承的初始化

  • 先看代碼
class father{
    int age=44;

   //構造方法
    father(){
        System.out.println("父類的構造輸出"+this.age);
        this.say();
    }
    public void say(){
        System.out.println("父類的say"+this.age);
    }
}

class son extends father{
    int age=33;
   //構造方法
    son(){
      System.out.println("子類構造方法");
    }
    public void say(){
        System.out.println("子類的say:"+this.age);
    }
}

public class second{
    public static void main(String[] ages){
       son myson=new son();

    }
}
  • 你覺得會輸出什么?
    • 答案是
父類的構造輸出44
子類的say:0
子類構造方法
  • 為什么同一個this。第一行輸出的是父類的44而第二行是子類的方法,而且是0呢? 這個首先涉及繼承的初始化問題,以及繼承變量的方法和變量的區別了。
  • 首先在初始化的時候,是優先把父類給初始化,因為在子類構造函數中,是先調用super()方法,此方法是把父類初始化。所以是整個初始化過程是 fater->son。所以首先輸出的是:父類的構造方法輸出44;
  • 為什么第二句是子類的say:0呢?
"因為子類son把父類的say()重寫了,因此,當調用的時候,是調用子類的say()的。"

恩~其實這個說話不正確的。首先需要理解這個this是誰。其實這個this是son。不信?

System.out.println(this.getClass());

輸出結果是:class son 。
所以,this.say()調用的自然是son的say()方法了。
那為什么輸出是0呢?
因為值此時賦值只是到父類,子類的age還沒賦值,還是初始值0呢。

2.2 繼承的變量和方法的區別以及內存控制

  • 一句話,變量沒有重寫,方法有重寫。
    • 用起來有什么區別呢? 還是剛剛的son類和fater類:
       son myson=new son();
       father myfather=myson;

       System.out.println(myson.age);
       myson.say();
       System.out.println(myfather.age);
       myfather.say(); 
      //將會輸出什么
33
子類的say:33
44
子類的say:33
  • 為什么?因為,變量沒有重寫,方法有重寫。所以父類還是可以調用自己的變量,而方法是調用子類的方法。

  • 細心的同學注意到,為什么

father myfather=myson

明明是new 子類,但卻可以輸出父類的age呢?

  • 那是因為在建立子類對象的時候,在劃分地址的時候,也有一塊內存地址是存父類的變量,因此。子類中的super(),也是可以調用父類的變量的值。(可以試試噢~)

3. final 的注意事項

3.1 final方法不能被重寫,只能被程序顯式地賦值一次。
3.2 final最大作用是"宏替換"
3.3 在內部類中的局部變量,需要用final。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容

  • 重點掌握 3 類對象和方法 對象就是一個物體 類的獨特存在就是一個實例,對實例進行操作叫做方法。方法可以應用于類或...
    Coder大雄閱讀 1,271評論 0 2
  • java筆記第一天 == 和 equals ==比較的比較的是兩個變量的值是否相等,對于引用型變量表示的是兩個變量...
    jmychou閱讀 1,508評論 0 3
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,709評論 18 399
  • 第四章 面向對象 面向對象思想 面向對象思想的引入前面我們講過數組,當有多個數組都需要遍歷時,我們可以將遍歷的代碼...
    chongsheng閱讀 566評論 0 0
  • 感恩爸媽的關心和愛,讓我一直被關注著! 感恩合作伙伴的配合,成功簽約! 感恩金錢寶寶讓我可以投資項目,獲取更多的財...
    我不叫許仲斌閱讀 154評論 0 2