《Java編程思想》筆記3:初始化空另,訪(fǎng)問(wèn)控制

本篇關(guān)注:初始化(第5章),訪(fǎng)問(wèn)控制(第6章)


初始化 Initialization

構(gòu)造器 constructor

創(chuàng)建對(duì)象時(shí)被自動(dòng)調(diào)用鼓蜒,名稱(chēng)與類(lèi)名完全相同的特殊方法痹换,用來(lái)執(zhí)行初始化,沒(méi)有返回值

Java中都弹,創(chuàng)建和初始化是捆綁的娇豫。
new創(chuàng)造對(duì)象時(shí),會(huì)為對(duì)象分配空間畅厢,并調(diào)用相應(yīng)構(gòu)造器冯痢。

默認(rèn)構(gòu)造器
又叫無(wú)參構(gòu)造器。如果類(lèi)中沒(méi)有寫(xiě),則編譯器會(huì)自動(dòng)創(chuàng)建浦楣。

class Rock {
    Rock() {       // 默認(rèn)構(gòu)造器
        ...
    }
}

可以修改為有參數(shù)

重載 Oveloading

用多種方式創(chuàng)建一個(gè)對(duì)象袖肥。參數(shù)列表必須獨(dú)一無(wú)二。以返回值區(qū)分重載方法是行不通的振劳。

class Tree {
    int height;
    
        Tree() {
        System.out.println("Planting a seed");
        height = 0;
}

    Tree(int initialHeight) {
        height = initialHeight;
        System.out.println("The new tree is " + height + " feet tall");
    }

    void info() {
        System.out.println("Tree is " + height + " feet tall");
    }

    void info(String string) {
        System.out.println(string + ": Tree is " + height + " feet tall");
    }
}
  1. 如果傳入的數(shù)據(jù)類(lèi)型(實(shí)際參數(shù)類(lèi)型)小于方法中聲明的形式參數(shù)類(lèi)型椎组,實(shí)際數(shù)據(jù)類(lèi)型就會(huì)被提升。char型不同历恐,如果無(wú)法找到接受char參數(shù)的方法寸癌,就會(huì)把char提升至int。
  2. 如果傳入的實(shí)際參數(shù)較大弱贼,就得通過(guò)類(lèi)型轉(zhuǎn)換來(lái)執(zhí)行窄化轉(zhuǎn)換熊经。
this

this關(guān)鍵字只能在方法內(nèi)部使用长豁,表示對(duì)“調(diào)用方法的那個(gè)對(duì)象”的引用
很容易在一條語(yǔ)句里對(duì)同一個(gè)對(duì)象執(zhí)行多次操作疚脐∑季ǎ或者將其自身傳遞給外部方法。

在構(gòu)造器中調(diào)用構(gòu)造器
this加上參數(shù)列表庇勃,可以調(diào)用符合的構(gòu)造器檬嘀。

public class Flower {
    int petalCount = 0;
    String s = "initial value";
    Flower(int petals) {
        petalCount = petals;
        System.out.println("Constructor with int arg only");
    }
    Flower(String s, int petals) {
        this(petals);//call constructor <Flower(int petals)>
        //! this(s);//can't call two
        this.s = s;
        System.out.println("Constructor with int & String args");
    }
    Flower() {
        this("hi", 47);
        System.out.println("Default constructor with no arg");
    }
}

這種調(diào)用必須處在構(gòu)造器塊中的起始處。
不可以同時(shí)調(diào)用兩個(gè)構(gòu)造器匪凉。
this.s 可以指代數(shù)據(jù)成員枪眉。
其他方法中不可以調(diào)用構(gòu)造器。

成員初始化

基本數(shù)據(jù)類(lèi)型都有默認(rèn)的初值再层。對(duì)象引用的默認(rèn)值是null贸铜。

聲明變量的時(shí)候直接賦值,或者調(diào)用某方法為它賦值聂受。
類(lèi)的內(nèi)部蒿秦,變量定義的先后順序決定了初始化的順序。
變量定義于任意位置蛋济,它們?nèi)耘f會(huì)在任何方法(包括構(gòu)造器)被調(diào)用之前得到初始化棍鳖。

靜態(tài)初始化只在必要時(shí)刻(靜態(tài)對(duì)象被創(chuàng)建/靜態(tài)數(shù)據(jù)被訪(fǎng)問(wèn)),在class對(duì)象首次加載的時(shí)候進(jìn)行一次碗旅。

可以使用靜態(tài)塊組合多個(gè)靜態(tài)初始化

static int a渡处;
static int b;
static{
    a = 3祟辟;
    b = 4医瘫;
}

初始化順序:先是靜態(tài)對(duì)象,再是非靜態(tài)對(duì)象旧困。

構(gòu)造器也屬于靜態(tài)方法醇份。
對(duì)象創(chuàng)建過(guò)程:假設(shè)有個(gè)Dog類(lèi)

  1. 首次創(chuàng)建Dog對(duì)象稼锅,或者首次訪(fǎng)問(wèn)Dog類(lèi)的靜態(tài)方法/數(shù)據(jù)時(shí),定位Dog.class文件
  2. 載入Dog.class(創(chuàng)建Dog.class對(duì)象)僚纷。執(zhí)行靜態(tài)初始化矩距,之后不會(huì)執(zhí)行第二次。
  3. 用new Dog()創(chuàng)建對(duì)象時(shí)怖竭,在heap上分配內(nèi)存空間
  4. 內(nèi)存空間清零锥债,Dog對(duì)象所有基本數(shù)據(jù)類(lèi)型和引用變?yōu)槟J(rèn)值
  5. 執(zhí)行程序中定義的初始化
  6. 執(zhí)行構(gòu)造器
可變參數(shù)列表

參數(shù)個(gè)數(shù)或類(lèi)型不確定時(shí)
顯式地創(chuàng)建以O(shè)bject數(shù)組為參數(shù)的方法:

class A {}
public void printArray(Object[] args) {
    for(Object obj : args)
        System.out.print(obj + " ");
    System.out.println();
}
printArray(new Object[]{new Integer(47), new Float(3.14), new Double(11.11)});
printArray(new Object[]{"one", "two", "three"});
printArray(new Object[]{new A(), new A(), new A()});

定義可變參數(shù)列表:

public void printArray(Object... args) {
    for(Object obj : args)
        System.out.print(obj + " ");
    System.out.println();
}

類(lèi)型確定:

public void printArray(int i, String... args) {}

適用于參數(shù)個(gè)數(shù)不確定的情況侵状,java把可變參數(shù)當(dāng)做數(shù)組處理赞弥。

  1. 只支持有一個(gè)可變參數(shù),只能出現(xiàn)在參數(shù)列表的最后趣兄;
  2. ...前后有無(wú)空格都可以,args名字自定義悼嫉。
  3. 方法中以數(shù)組的形式訪(fǎng)問(wèn)可變參數(shù)艇潭。
  4. 把0個(gè)參數(shù)傳給可變參數(shù)列表也可以。
枚舉類(lèi)型 Enumerated types
public enum Spiciness {
    NOT, MILD, MEDIUM, HOT, FLAMING
}
public class SimpleEnum {
    public static void main(String[] args) {
        Spiciness spiciness = Spiciness.MEDIUM;
        System.out.println(spiciness);
        
        for(Spiciness s : Spiciness.values())
            System.out.println(s + ", ordinal " + s.ordinal());
    }
}

可以把enum看成是一個(gè)類(lèi)戏蔑。一個(gè)數(shù)據(jù)類(lèi)型蹋凝。
通常枚舉的元素命名全都大寫(xiě),多個(gè)單詞用_隔開(kāi)总棵。
但是enum不能使用extends繼承其他類(lèi)鳍寂,因?yàn)閑num已經(jīng)繼承了java.lang.Enum(Java是單一繼承)
枚舉類(lèi)中每個(gè)值都被映射到protected Enum(String name, int ordinal)
ordinal():獲取枚舉常量的聲明順序
values():獲取一個(gè)數(shù)組,按聲明順序

與switch組合絕佳情龄,因?yàn)閟witch是在有限的可能值集合中選擇

switch(degree) {
    case NOT:    
        System.out.println("not spicy at all");
        break;
    case MILD:
    case MEDIUM:    
        System.out.println("a little hot");
        break;
    case HOT:
    case FLAMING:
    default:    
        System.out.println("may be to hot");
        break;
}

EnumSet
提供了Set接口的實(shí)現(xiàn)

EnumSet allSpiciness = EnumSet.allOf(Spiciness.class);
EnumSet partSpiciness = EnumSet.of(Spiciness.NOT, Spiciness.MEDIUM);

EnumMap
提供了Map接口的實(shí)現(xiàn)迄汛。鍵(key)是一個(gè)枚舉類(lèi)型

EnumMap<Spiciness, String> enumMap = new EnumMap<>(Spiciness.class);
enumMap.put(Spiciness.NOT, "not spicy at all");
enumMap.put(Spiciness.MILD, "a little hot");
enumMap.put(Spiciness.HOT, "maybe too hot");
for(Spiciness s : Spiciness.values())
    System.out.println(s + " represents " + enumMap.get(s));

訪(fǎng)問(wèn)控制 Access control

.java文件被稱(chēng)為編譯單元 compilation unit,或轉(zhuǎn)譯單元 translation unit
每個(gè)編譯單元只能有一個(gè)public類(lèi)
編譯后產(chǎn)生同名的.class文件骤视。Java的可運(yùn)行程序就是一組.class文件(可打包為JAR)

package:聲明一個(gè)包鞍爱。位于除了注釋外的第一行。
import:導(dǎo)入一個(gè)包专酗。
包名:全部小寫(xiě)睹逃。通常是把自己的域名反過(guò)來(lái)〉豢希或者是機(jī)器上的class文件路徑沉填。
處于同路徑且沒(méi)有聲明包名的class文件,會(huì)被看作隸屬于該目錄的默認(rèn)包中佑笋。

如果import兩個(gè)包翼闹,包含相同的類(lèi)名。創(chuàng)建時(shí)就必須明確指明:
java.util.Vector v = new java.util.Vector()

類(lèi)中成員(變量/方法)訪(fǎng)問(wèn)權(quán)限:

類(lèi)內(nèi)部 本包其他類(lèi) 外部包子類(lèi) 外部包其他類(lèi)
public
protected
default
private

default:默認(rèn)的包訪(fǎng)問(wèn)權(quán)限允青,不需要寫(xiě)出來(lái)橄碾。class Abc{ }

類(lèi)的修飾:不可以是private和protected的卵沉。內(nèi)部類(lèi)可以。
不希望別人訪(fǎng)問(wèn)該類(lèi)法牲,可以把構(gòu)造器設(shè)為private史汗。但是public static成員可以被訪(fǎng)問(wèn)。
通常最好是把域保持為private拒垃,通過(guò)protected方法控制類(lèi)的繼承者的訪(fǎng)問(wèn)權(quán)限停撞。

封裝 encapsulation:把數(shù)據(jù)和方法包裝進(jìn)類(lèi)中,隱藏具體實(shí)現(xiàn)悼瓮。得到一個(gè)數(shù)據(jù)類(lèi)型戈毒。


References:

呂龍寶的《Java編程思想》學(xué)習(xí)筆記

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市横堡,隨后出現(xiàn)的幾起案子埋市,更是在濱河造成了極大的恐慌,老刑警劉巖命贴,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件道宅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡胸蛛,警方通過(guò)查閱死者的電腦和手機(jī)污茵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)葬项,“玉大人泞当,你說(shuō)我怎么就攤上這事∶裾洌” “怎么了襟士?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)穷缤。 經(jīng)常有香客問(wèn)我敌蜂,道長(zhǎng),這世上最難降的妖魔是什么津肛? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任章喉,我火速辦了婚禮,結(jié)果婚禮上身坐,老公的妹妹穿的比我還像新娘秸脱。我一直安慰自己,他們只是感情好部蛇,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布摊唇。 她就那樣靜靜地躺著,像睡著了一般涯鲁。 火紅的嫁衣襯著肌膚如雪巷查。 梳的紋絲不亂的頭發(fā)上有序,一...
    開(kāi)封第一講書(shū)人閱讀 51,590評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音岛请,去河邊找鬼旭寿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛崇败,可吹牛的內(nèi)容都是我干的盅称。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼后室,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼缩膝!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起岸霹,我...
    開(kāi)封第一講書(shū)人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤疾层,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后贡避,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體云芦,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年贸桶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桌肴。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡皇筛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出坠七,到底是詐尸還是另有隱情水醋,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布彪置,位于F島的核電站拄踪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏拳魁。R本人自食惡果不足惜惶桐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望潘懊。 院中可真熱鬧姚糊,春花似錦、人聲如沸授舟。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)释树。三九已至肠槽,卻和暖如春擎淤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背秸仙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工嘴拢, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人筋栋。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓炊汤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親弊攘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抢腐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 第一章 對(duì)象導(dǎo)論 對(duì)象具有狀態(tài)、行為和標(biāo)識(shí)襟交。這意味著每一個(gè)對(duì)象都可以擁有內(nèi)部數(shù)據(jù)和方法迈倍,并且每一個(gè)對(duì)象都可以唯一地...
    niaoge2016閱讀 824評(píng)論 0 0
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法捣域,內(nèi)部類(lèi)的語(yǔ)法啼染,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法焕梅,線(xiàn)程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,632評(píng)論 18 399
  • 面向?qū)ο笾饕槍?duì)面向過(guò)程迹鹅。 面向過(guò)程的基本單元是函數(shù)。 什么是對(duì)象:EVERYTHING IS OBJECT(萬(wàn)物...
    sinpi閱讀 1,057評(píng)論 0 4
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 10,974評(píng)論 6 13
  • 七歲那年我上了小學(xué)贞言,那是在上世紀(jì)70年代斜棚。 爸媽給我了0.85元。讓我?guī)У綄W(xué)校交給老師该窗,那是一個(gè)學(xué)期的弟蚀,全部學(xué)雜費(fèi)...
    大增益_漠雨閱讀 499評(píng)論 0 0