Java 之路 (二) -- 一切都是對象

本章學習內(nèi)容

  • Java 程序的基本組成部分
  • 核心:理解 Java 中(幾乎)一切都是對象般此。
  • Java 是 混合型語言

1. 引用操縱對象

Java 中通過操縱對象的 “引用” 來操縱內(nèi)存中的元素韩容∠可以理解為通過遙控器(引用)操縱電視(對象),只要握住遙控器校读,就能保持和電視的連接脖母。同時通過操控遙控器(引用)來簡介操控電視(引用)户魏。

另外澡刹,即使沒有電視呻征,遙控器也可單獨存在,也就是說我們可以建立一個空引用罢浇,而沒有任何一個對象與之關(guān)聯(lián)陆赋,比如通過 String s; 建立一個 String 引用,記住這只是一個引用嚷闭,而不是對象攒岛,此時向 s 發(fā)送一個消息,會發(fā)生錯誤胞锰,因為沒有可以操作的對象灾锯。

因此正常的用法是:創(chuàng)建引用的同時便進行初始化。如 String s = "hello world";


2. 對象的創(chuàng)建

(1) 一旦創(chuàng)建了一個引用嗅榕,就希望它能與一個新的對象相關(guān)聯(lián)。通常用 new 關(guān)鍵字實現(xiàn)誊册。比如上面的例子可以寫成 String s = new String("hello world");

(2) 存儲位置:

  1. 寄存器:速度最快领突,位于處理器內(nèi)部,數(shù)量有限案怯。無法直接控制君旦。
  2. 堆棧:速度僅次于寄存器,位于 RAM 中嘲碱。堆棧指針向下移動分配內(nèi)存金砍,向上移動釋放內(nèi)存。Java 系統(tǒng)需要知道存儲在堆棧內(nèi)所有項的生命周期麦锯。對象的引用 存于堆棧中恕稠。(注意! 基本類型也存于此
  3. 堆:通用內(nèi)存池扶欣,位于 RAM鹅巍,用于存放所有的 Java 對象。編譯器不需要知道存儲的數(shù)據(jù)在堆里存活多長時間料祠,因此需要對象時骆捧,只需 new 一個對象,然后會自動在堆中進行存儲分配髓绽。
  4. 常量存儲:常量值通常直接存放在程序代碼內(nèi)部敛苇。
  5. 非 RAM 存儲:完全存活于程序之外的數(shù)據(jù)不受程序的任何控制。比如:流對象和持久化對象顺呕。

(3) 特例:基本類型

  • 特殊之處:一般來說枫攀,通過 new 將對象存儲在 ”堆“中括饶;而對于基本類型,不用 new 來創(chuàng)建變量来涨,而是創(chuàng)建一個并非是引用的”自動“變量图焰。這個變量直接存儲”值“,并置于堆棧中蹦掐。

  • 基本類型的大小楞泼、范圍以及包裝器如下:

    基本類型 大小 最小值 最大值 包裝器類型
    boolean —— —— —— Boolean
    char 16 bits Unicode 0 Unicode 2^16 - 1 Character
    byte 8 bits -128 +127 Byte
    short 16 -2^15 +2^15-1 Short
    int 32 -2^31 +2^31-1 Integer
    long 64 -2^63 +2^63-1 Long
    float 32 IEEE754 IEEEE754 Float
    double 64 IEEE754 IEEE754 Double
    void —— —— —— Void

    所有數(shù)值類型都有正負號,即 不存在無符號類型

  • 關(guān)于包裝器:可以通過包裝器類笤闯,在堆中創(chuàng)建一個非基本對象,用來表示對應(yīng)的基本類型:

    char c = 'x';
    Character ch = new Character(c);
    //或者如下
    Character ch = new Character("x");
    
    //也可以反向轉(zhuǎn)換
    Character ch = 'x';
    char c = ch;
    

    至于包裝基本類型的原因此處沒解釋棍厂。

  • 高精度數(shù)字:BigInteger 和 BigDecimal

    • BigInteger 支持任意精度的整數(shù)
    • BigDecimal 支持任意精度的定點數(shù)

(4) Java 中的數(shù)組

  • Java 確保數(shù)組會被初始化颗味,并且不能再它的范圍之外被訪問。
  • 創(chuàng)建數(shù)組時牺弹,實際上創(chuàng)建的是引用數(shù)組浦马,每個引用都會自動被初始化為一個特定值 null,表明這個引用還沒有指向某個對象张漂。使用 null 的引用會報錯晶默。
  • 同時也可以創(chuàng)建用來存放基本數(shù)據(jù)類型的數(shù)組

3. 對象的銷毀

(1) 作用域 (基本類型)

  • 作用域決定了在其內(nèi)定義的變量名的可見性和生命周期。

  • 由花括號 {} 的位置決定航攒,如:

    {
        int x = 12;
        //only x available
        {
            int q = 96;
            //both x & q available
        }
        // only x available
        // q is out of scope
    }
    
  • 作用域里定義的變量只能用于作用域結(jié)束之前磺陡。

(2) 對象的作用域

  • Java 對象 可以 存活 于作用域之外,而其 引用 會在作用于終點 消失漠畜。

  • 帶來問題:如何防止這些存活的 Java 對象填滿內(nèi)存空間币他,進而阻塞程序?

    • Java 的垃圾回收器:用來監(jiān)視用 new 創(chuàng)建的所有對象憔狞,并辨別那些不會再被引用的對象蝴悉。隨后釋放這些對象的內(nèi)存空間。簡單來說瘾敢,我們盡管創(chuàng)建對象拍冠,不需要的時候,它們會自行消失簇抵。

4. 創(chuàng)建新的數(shù)據(jù)類型:類

(1) 如何創(chuàng)建 庆杜?

通過 "class 關(guān)鍵字 + 類名" 來定義一個新的類型,如:

class TypeName{
    /* class body goes here /*
}

之后就可以通過 new 來創(chuàng)建這個類型的對象正压,盡管此時它什么都不能做欣福,確切地說是在定義它的方法之前,都不能向它發(fā)送任何有意義的消息:

TypeName type = new TypeName();

(2) 字段和方法

Java 中我們所作的工作核心就是:定義類焦履,產(chǎn)生類的對象拓劝,以及發(fā)送消息給這些對象

  • 類中可以設(shè)置兩種元素:字段和方法

    • 字段(數(shù)據(jù)成員/成員變量):可以是任何類型的對象雏逾,可以通過其引用與其進行通信;也可以是基本類型
    • 方法(成員函數(shù)):會在下一小節(jié)介紹
    // 此處舉一個只有字段但無方法的類
    class DataOnly{
        int i;
        double d;
        boolean b;
    }
    
  • 通過 “對象引用名稱 + ’.‘ + 內(nèi)部成員名稱“ 的方式來引用一個對象的成員郑临,如:

    objectReference.member栖博。該模式可用于對象的“嵌套”,即objectReference.menberObjectReference.menber

  • 基本成員默認值

    如果某個成員是基本數(shù)據(jù)類型,沒有進行初始化時耕肩,Java 會為其設(shè)置默認值(默認初始化)蜈膨,如下表所示:

    基本類型 默認值
    boolean false
    char '\uoooo'(null)
    byte (byte)0
    short (short)0
    int 0
    long 0L
    float 0.0f
    double 0.0d

    注意:只有成員變量才會進行默認初始化,局部變量并不會進行默認初始化丧叽。而如果局部變量未經(jīng)人為初始化就進行使用,會在編譯時返回錯誤公你。


5. 方法踊淳、參數(shù)和返回值

(1) 方法

  • 表示 “做某些事情的方式”,決定了一個對象能夠接收什么樣的信息

  • 基本組成包括:名稱陕靠、參數(shù)迂尝、返回值和方法體。最基本的形式如下:

    ReturnType methodName( /* Argument list */ ) {
      /* Method Body */
    }
    
    • 返回類型:調(diào)用方法之后從方法返回的值

    • 參數(shù)列表:要傳給方法的信息類型和名稱

      方法名和參數(shù)列表 唯一的標識出某個方法剪芥。針對以后的 重載 理解

  • 方法只能作為類的一部分垄开,只有通過對象才能被調(diào)用

    這句話是針對非靜態(tài) static 方法而言的

    static 方法是針對類調(diào)用的,不依賴于對象

  • 方法的調(diào)用形式:對象名 + '.' + 方法名 + 參數(shù)列表税肪,如:objectName.methodName(arg1, arg2, arg3);

  • 利用方法賦值時溉躲,需要保證返回值與對象的類型兼容

    • 比如類 A 中有一個 int 類型的方法 f(),而 a 是 A 的一個對象寸认,那么就可以這樣寫

      int x = a.f();签财,將 f() 的返回值賦給 x

  • 調(diào)用方法的行為通常被稱為 發(fā)送消息給對象。上面的例子中偏塞,消息是 f()唱蒸,對象是 a

(2) 參數(shù)列表

  • 指定要傳遞什么樣的信息灸叼,必須指定每個所傳遞對象的類型以及名字

    • 傳遞對象時:實際上傳遞的是對象的引用
    • 傳遞基本數(shù)據(jù)類型時神汹,傳遞的是值
  • 舉例:

    int storage(String s){
        return s.length() * 2;
    }
    

    該方法接收 String 為其參數(shù),參數(shù)類型是 String古今,參數(shù)名是 s屁魏。將 s 傳遞給此方法后,該方法就可以對 s 動手動腳了捉腥。

  • return 關(guān)鍵字

    • 首先代表“已經(jīng)完成氓拼,離開此方法”
    • 其次,如果此方法產(chǎn)生了一個值,這個值通過 return 回傳桃漾。
    • 如果是 void 類型的方法坏匪,那么 return 就只是用來退出方法。

6. 構(gòu)建一個 Java 程序

(1) 名字可見性

  • 為庫設(shè)置名字時采取反轉(zhuǎn)域名撬统,如 com.leanjava.whdalive 适滓。

(2) 使用其他類

  • 通過 import 關(guān)鍵字導入包,即導入一個類庫恋追,如:

    import java.util.ArrayList;凭迹,也可以使用通配符 “*” 導入 util 下所有的類:import java.util.*;

(3) static 關(guān)鍵字

  • 當聲明一個事物是 static 時,意味著這個域或方法不會與包含它的那個類的任何對象實例關(guān)聯(lián)在一起苦囱。所以嗅绸,及時從未創(chuàng)建某個類的任何對象,也可以調(diào)用其 static 方法或訪問其 static 域撕彤。

    可以理解為 static 的方法或域是和類綁在一起的朽砰,直接通過 類 訪問。

    非 static 的情況下:

    當執(zhí)行 new 創(chuàng)建對象時喉刘,數(shù)據(jù)存儲空間才分配,方法才供外界調(diào)用漆弄。

  • static 成員占有單一存儲空間

    • 舉例:

      class StaticTest{
          static int i = 47;
      }
      
      StaticTest st1 = new StaticTest();
      StaticTest st2 = new StaticTest();
      

      此時睦裳,st1.i 和 st2.i 指向同一存儲空間,也可以直接通過 StaticTest.i 訪問撼唾,一般建議通過 類名 訪問廉邑。

    • 類似的,靜態(tài)方法也建議直接通過 ClassName.staticMethod() 的方式調(diào)用倒谷。


7. 第一個 Java 程序

叨叨了半天了蛛蒙,終于能開始寫 Java 程序了,感動不感動

直接上個例子吧:

//HelloData.java
import java.util.*;

public class HeloDate{
    public static void main(String[] args){
        System.out.println("Hello渤愁,it's ");
        System.out.println(new Date());
    }
}

解釋:

  • 我們需要使用 Date 這個類牵祟,位于 Java.util 下,通過 import 引入
  • public 關(guān)鍵字表示這是一個可由外部調(diào)用的方法抖格,后面會講解诺苹。
  • main 方法的寫法是固定的,指明程序的入口雹拄,args 參數(shù)用來存儲命令參數(shù)收奔,此例中未用到。
  • System.out.println 用來打印到控制臺滓玖,完成后換行坪哄。

8. 注釋和嵌入式文檔

(1) 注釋

  • 單行注釋:// 起頭,到句末都是注釋
  • 多行注釋:/* */,/* 和 */ 中間的都會被注釋掉

(2) 文檔

  • 通過 Javadoc 命令
  • 語法:在 /** 注釋中出現(xiàn)翩肌,結(jié)束于 */
  • 嵌入式 HTML
  • 標簽

9. 編碼風格

駝峰風格模暗,示例如下:

class AllTheColorsOfTheRainbow{
    int anIntegerRepresentingColors;
    void changeTheHueOfTheColoc(int newHue);
}
  • 類名首字母大寫,每個單詞首字母均大寫
  • 方法摧阅、字段等標識符的首字母小寫汰蓉,其余單詞的首字母大寫。

小結(jié)

本章的內(nèi)容也是屬于偏入門的棒卷,從對象入手介紹 Java 是如何面向?qū)ο缶幊痰墓四酢.斎灰仓皇呛唵蔚慕榻B一下,只通過這一章就能了解的非常透徹顯然是不現(xiàn)實的比规。

對于老手而言(顯然我不是)若厚,可能遺漏的絕對不是如何寫代碼,這太 low 了蜒什;還是需要了解代碼背后的思想测秸,為什么我要這么寫,這么寫有什么便利之處灾常?

看到這里霎冯,估計也能感覺的出來吧,末尾這一部分我就是完全在水了钞瀑,因為沒什么好總結(jié)的沈撞。就是一種會的依舊會,不常用的還是不太清楚雕什,需要用的時候仍然需要查閱資料(比如 javadoc 生成文檔缠俺,我重溫 Java 一時半會又不會去寫底層代碼,等到我需要的時候早忘光了好不好)贷岸。


漫漫 Java 之路壹士,共勉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末偿警,一起剝皮案震驚了整個濱河市躏救,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌螟蒸,老刑警劉巖落剪,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異尿庐,居然都是意外死亡忠怖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門抄瑟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凡泣,“玉大人枉疼,你說我怎么就攤上這事⌒猓” “怎么了骂维?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贺纲。 經(jīng)常有香客問我航闺,道長,這世上最難降的妖魔是什么猴誊? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任潦刃,我火速辦了婚禮,結(jié)果婚禮上懈叹,老公的妹妹穿的比我還像新娘乖杠。我一直安慰自己,他們只是感情好澄成,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布胧洒。 她就那樣靜靜地躺著,像睡著了一般墨状。 火紅的嫁衣襯著肌膚如雪卫漫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天肾砂,我揣著相機與錄音汛兜,去河邊找鬼。 笑死通今,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的肛根。 我是一名探鬼主播辫塌,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼派哲!你這毒婦竟也來了臼氨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤芭届,失蹤者是張志新(化名)和其女友劉穎储矩,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體褂乍,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡持隧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了逃片。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屡拨。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出呀狼,到底是詐尸還是另有隱情裂允,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布哥艇,位于F島的核電站绝编,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏貌踏。R本人自食惡果不足惜十饥,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哩俭。 院中可真熱鬧绷跑,春花似錦、人聲如沸凡资。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽隙赁。三九已至垦藏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間伞访,已是汗流浹背掂骏。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留厚掷,地道東北人弟灼。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像冒黑,于是被迫代替她去往敵國和親田绑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349