最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

150天打卡day19_引用類型數(shù)組

2021-05-13 18:50 作者:關(guān)阿姨的Java日記  | 我要投稿

回顧

  • 多態(tài)

多態(tài)是同一個行為,具有不同的表現(xiàn)形式。

  • 多態(tài)的實(shí)現(xiàn)方式

    • 重寫

    • 接口

    • 抽象類或者抽象方法

  • 多態(tài)存在的必要條件

    • 繼承:重寫以繼承為基礎(chǔ),繼承以封裝為基礎(chǔ)

    • 重寫:子類重寫父類中的方法

    • 向上造型

      • 一個類型的引用在指向不同的對象時會有不同的實(shí)現(xiàn),用父類的引用指向子類的對象,最后執(zhí)行的是子類中重寫后的方法,這叫方法多態(tài)。

引入

那今天我們再來看一下引用類型數(shù)組。那什么是引用類型數(shù)組呢,單看“引用類型數(shù)組”這六個字信息量就是非常大的,可以總結(jié)出兩點(diǎn)

  • 首先,加了引用那就證明數(shù)組不屬于八大基本數(shù)據(jù)類型,是屬于引用類型,我們在面向?qū)ο蟮牡谝惶炀透嬖V過大家,這要用類,接口,數(shù)組來聲明的變量就叫做引用類型變量,所以數(shù)組本身也都是引用類型對象。

  • 其次,數(shù)組是具有相同數(shù)據(jù)類型的一組數(shù)據(jù)的集合,所以原則上,數(shù)組里面的元素可以是任意一種類型,既可以是八大基本數(shù)據(jù)類型之一,也可以是任何的一種引用類型。

引用類型數(shù)組

所以呢,今天要把數(shù)組當(dāng)成一個對象來看待,主要來學(xué)習(xí)一下數(shù)組當(dāng)做對象的本質(zhì),而且另外數(shù)組本身就是一組類型相同的變量的組合,所以關(guān)注數(shù)組同樣也樣像關(guān)注普通變量一樣,了解他的聲明和初始化。

如果最后還有時間咱們來看一下二維數(shù)組。

?

好的,那接下來呢我們就來深入學(xué)習(xí)一下引用類型數(shù)組,首先來看一下數(shù)組的本質(zhì)

一、數(shù)組是對象

數(shù)組的本質(zhì)有兩點(diǎn)

  • 第一點(diǎn),因?yàn)閿?shù)組不屬于八大基本類型之一,所以數(shù)組屬于引用類型

  • 第二點(diǎn),因?yàn)閿?shù)組是通過new運(yùn)算符創(chuàng)建出來的,new出來的是一個對象,所以呢,數(shù)組也是一個對象,數(shù)組是屬于引用類型,那用數(shù)組聲明的變量也屬于引用類型,存儲的是對象的地址信息。

  • 好的,那咱們繼續(xù)來看一下數(shù)組對象內(nèi)部的情況,我們說了,既然數(shù)組是當(dāng)做一個引用對象來使用,那對象要么有成員變量要么有方法,想一下,數(shù)組有沒有成員變量??當(dāng)然有了,其實(shí)啊,數(shù)組中的每一個元素都可以看成是他的成員變量,只不過,這些成員變量不是我們自己手動定義的,是在定義數(shù)組時Java編譯器會根據(jù)我們定義的數(shù)組類型和長度自動幫我們創(chuàng)建出指定個數(shù)的成員變量,而且這些成員變量類型全都相同。

比如:實(shí)例化一個int類型的數(shù)組,其中包含三個元素。保存在變量arr中。

int[] arr = new int[3];

其實(shí),創(chuàng)建的結(jié)果在內(nèi)存中是這樣的,首先會有一個int類型的數(shù)組名叫arr,因?yàn)樗菙?shù)組類型,所以arr是引用類型變量,將來保存的,不是數(shù)據(jù)本身,而僅僅是數(shù)組對象的地址。然后程序運(yùn)行new運(yùn)算符就會在內(nèi)存中創(chuàng)建一個數(shù)組對象,其中定義三個int類型元素,因?yàn)闆]有給具體值,所以程序運(yùn)行的時候,構(gòu)造方法會默認(rèn)給一個初始值,int類型的默認(rèn)值是0.創(chuàng)建完數(shù)組對象,這個對象一定會有一個內(nèi)存地址,假設(shè)為0x50 ,然后這個地址就會用=保存在arr變量中。

?

?

所以呢,剛剛說的大一堆咱們可以提煉出三點(diǎn)內(nèi)容:

  • 第一,Java中數(shù)組屬于引用類型

  • 第二,數(shù)組也是一個對象,數(shù)組變量屬于引用類型,僅存儲數(shù)組對象的地址信息,指向數(shù)組對象

  • 第三,數(shù)組的元素可以看成是數(shù)組對象的成員變量,只是類型全部相同而已

二、引用類型數(shù)組的聲明

我們學(xué)了數(shù)組,又學(xué)了面向?qū)ο笾?,我們就可以把?shù)組和面向?qū)ο蠼Y(jié)合起來使用

  • 其實(shí),數(shù)組中的元素可以是任意類型,當(dāng)然也包括引用類型,也就是說數(shù)組中的元素不僅僅只能放數(shù)據(jù),而且還能放任何一種活靈活現(xiàn)的對象

  • 如果數(shù)組中的元素是引用類型,那么數(shù)組就稱之是引用類型數(shù)組。

  • 那什么時候使用引用數(shù)組呢,只要希望分組管理多個對象,就要使用引用類型數(shù)組

事實(shí)上,現(xiàn)實(shí)中,數(shù)組中不應(yīng)該只放一種類型的數(shù)據(jù)或者元素,數(shù)組中的元素很可能是一個具有豐富屬性和行為的對象。

我知道男孩子都愛打游戲,那我們就拿英雄聯(lián)盟為例。

比如說,程序需要我們創(chuàng)建3個“英雄聯(lián)盟”中的游戲人物并組成一隊(duì)

  • 先來找對象:游戲人物(Character)

  • 人物的屬性大家肯定都耳熟能詳了,比如:name名字,生命值(hp),傷害值(dps)

如果想要創(chuàng)建這五個人物對象,肯定首先得要先聲明一個人物類Character,用來封裝人物的統(tǒng)一屬性,類中應(yīng)該包含3個屬性,分別是名字name,生命值hp,傷害值dps

這個類是用來封裝人物類的屬性,我們在學(xué)構(gòu)造的時候講過大部分的類為方便初始化成員變量,都需要我們自己定義兩個構(gòu)造方法,一個帶參構(gòu)造,一個空的無參構(gòu)造。

好的,只要需要分組管理對象,就要使用數(shù)組,而游戲中大家要創(chuàng)建的3個人物,都是Character類型的對象,所以接下來咱們在測試類中來定義一個能容納3個Character對象的數(shù)組。

Character[] chs = new Character[3];

代表創(chuàng)建了3個人物對象數(shù)組。那如果這時候程序運(yùn)行的時候,和基本數(shù)據(jù)類型的數(shù)組一樣,都會有一個數(shù)組對象,其中包含3個成員變量,然后呢都會將數(shù)組的內(nèi)存地址保存到數(shù)組變量chs中,這里最大的不同發(fā)生在數(shù)組中的每個成員變量里。

基本類型的數(shù)組中,每個類型都是基本類型有默認(rèn)的初始值是0,而引用類型數(shù)組的默認(rèn)值為null。表示現(xiàn)在還沒有創(chuàng)建人物對象。

?

三、引用類型數(shù)組的初始化

如果要讓每一個元素都指向具體的對象,需要針對每一個數(shù)組元素分別進(jìn)行new運(yùn)算實(shí)例化對象,這就相當(dāng)于游戲中你要專門挑選一個格子把你的人物放進(jìn)來。

  • 比如第一個格子中我們創(chuàng)建人物:金克絲,生命值380,傷害50

chs[0] ?= new Character(“金克絲”,380,50);

  • 第二個格子中我們創(chuàng)建人物:創(chuàng)建人物“奎因”,生命值390,傷害48

chs[1] ?= new Character(“奎因”,390,48);

  • 第三個格子中創(chuàng)建人物“阿貍”,生命值514.4,傷害53.04

chs[2] ?= new Character(“阿貍”,514.4, 53.04);

數(shù)組中的元素下標(biāo)都從0開始,所以中括號0代表第一個元素。new 創(chuàng)建一個Character類型的對象。

如果程序執(zhí)行到這的時候,引用類型的數(shù)組每一個元素都是一個引用類型的變量,僅保存對象地址,不保存對象本身,程序執(zhí)行的時候,每new一個都會創(chuàng)建一個人物對象。

?

?

那下面呢,我們就試著遍歷一下數(shù)組,通過數(shù)組地址來引用每個人物對象。遍歷數(shù)組和以前一樣,同樣使用for循環(huán),int i = 0;i<數(shù)組的長度,i++,然后在循環(huán)當(dāng)中調(diào)用輸出的printInfo方法。如果沒有特殊情況,數(shù)組的遍歷到哪都這么寫。

for (int i = 0; i < chs.length; i++) { ? chs[i].printInfo(); ?}

好的,那關(guān)于引用類型數(shù)組就先說到這里,以后引用類型數(shù)組的用途是非常廣泛的,因?yàn)橐院蠛苌贂袛?shù)組中僅保存一種數(shù)值的情況,通常都是將多個對象組織在數(shù)組結(jié)構(gòu)中,理解引用類型數(shù)組,大家主要理解其實(shí)數(shù)組中并沒有保存對象的本身,而是僅保存對象的地址,通過地址指向?qū)嶋H對象而已。但是使用時,使用元素就等效于直接使用元素中地址所指向的實(shí)際對象。

二維數(shù)組

定義

下面呢,我們來看一種更加高大上的數(shù)組類型二維數(shù)組,既然數(shù)組中的元素可以是任意類型,那同樣也可以是數(shù)組類型,如果數(shù)組中的元素仍然是一個數(shù)組的話,那么它就是一個二維數(shù)組。

所謂二維在現(xiàn)實(shí)世界中其實(shí)就是一個橫行數(shù)列的結(jié)構(gòu),所以今后呢,只要是看到橫行數(shù)列的表現(xiàn)形式,就使用二維數(shù)組。比如說大家經(jīng)??吹娜諝v,再者說,大家去超市買雞蛋的時候有沒有觀察過雞蛋是怎么擺的?是不是先把雞蛋水平放在一層盒子里,然后再摞幾層啊。那么在程序中,

他就可以用二維數(shù)組來表示,咱們就拿超市摞雞蛋的例子來看。

案列

首先,要求每層都放5個雞蛋,要摞3層,那首先我們就得準(zhǔn)備3個能放5個雞蛋的包裝盒,分別裝入5個雞蛋。我們直接在main方法中完成

char [] box1 = new char[] {'蛋','蛋','蛋','蛋','蛋'}; char [] box2 = new char[] {'蛋','蛋','蛋','蛋','蛋'}; char [] box3 = new char[] {'蛋','蛋','蛋','蛋','蛋'};

首先,分別創(chuàng)建3盒雞蛋,每盒裝5個,這是個體力活,我就直接復(fù)制就可以,這時候這三盒雞蛋是隨機(jī)擺放的,但是現(xiàn)在我要求這三盒摞在一起。那就的需要有一個可以容納這三個盒子的數(shù)組,既然是數(shù)組那就得有數(shù)據(jù)類型和元素個數(shù),來觀察一下,每個盒子的類型都是一個char類型的數(shù)組,所以我們就可以把char類型的數(shù)組當(dāng)成盒子的數(shù)據(jù)類型。

所以我們可以定義一個可以容納三個盒子對象的數(shù)組,三個盒子都是char類型數(shù)組

char[][]rack =new char[][]{box1,box2,box3};

前面的char[]是數(shù)據(jù)類型,那么程序運(yùn)行的時候他的內(nèi)存中會發(fā)生什么情況呢,咱們還是先來看一下。理解了二維數(shù)組的結(jié)構(gòu),以后才能運(yùn)用自如。

?

首先我們創(chuàng)建了三個二維數(shù)組對象,分別將地址保存在box1,box2,box3中,

后來我們又發(fā)現(xiàn)需要將三個數(shù)組統(tǒng)一起來管理,不能散著放。只要需要成組的管理數(shù)據(jù)就要使用數(shù)組。所以我們又創(chuàng)建了一個rack數(shù)組表示一個貨架,

在實(shí)例化數(shù)組對象的同時,使用box1,box2,box3,中的值初始化數(shù)組rack的每個元素,在Java中任何情況下都是值傳遞,所以rack數(shù)組中得到的其實(shí)是box1,box2,box3的地址值,不是數(shù)組對象本身,得到地址后的rack中的三個元素就分別指向了三個具體的數(shù)組對象地址,在程序中,引用類型變量只保存地址所以不會真的把雞蛋保存在貨架上,都是通過每個元素中的地址指向數(shù)組中的對象。

遍歷二維數(shù)組

遍歷數(shù)組使用for循環(huán),同樣,遍歷二維數(shù)組,是要使用嵌套for循環(huán)。

// 遍歷rack中的每個元素,得到每個box對象的地址 for (int i = 0; i < rack.length; i++) { // rack[i]表示rack數(shù)組中下標(biāo)為i的元素中保存的地址同時也指向具體的一個box對象 // 每得到一個box對象的地址就進(jìn)一步遍歷其中的每個元素 for (int j = 0; j < rack[i].length; j++) { // 可以理解為是貨架上第i層,第j個元素的內(nèi)容 System.out.print(rack[i][j] + ","); } // 最后,每打印一行,就輸出一次換行,準(zhǔn)備打印下一組元素 System.out.println(); }

我說明一下昂rack[i][j]其實(shí)就可以理解為是第i層的第j個元素,只不過這個i和j都是從0開始,通常這種寫法都是用來訪問二維數(shù)組中任意位置的元素。

其實(shí)二維數(shù)組經(jīng)常用于表示表,表中的信息以行和列的形式組織,第一個下標(biāo)代表元素所在的行,第二個下標(biāo)代表元素所在的列。聲明的時候我們可以直接這樣定義

?數(shù)據(jù)類型[][] 數(shù)組變量=new 數(shù)組類型[行數(shù)][列數(shù)]; ?創(chuàng)建3行5列的數(shù)組char [][] arr ?=new char[3][5];

總結(jié)

如果數(shù)組中的元素是一個引用類型的話,那這個數(shù)組就叫引用類型數(shù)組,引用類型數(shù)組本質(zhì)上是一個對象,數(shù)組變量里面存儲的是一個對象地址,用于指向數(shù)組本身,而二維數(shù)組呢大家可以這么理解,就是數(shù)組里套了一個數(shù)組對象。遍歷二維數(shù)組使用雙重for循環(huán)。


150天打卡day19_引用類型數(shù)組的評論 (共 條)

分享到微博請遵守國家法律
盱眙县| 桐庐县| 阿巴嘎旗| 贡山| 佛学| 嘉黎县| 平度市| 玉门市| 麻栗坡县| 安丘市| 南和县| 蒙自县| 阳新县| 湟源县| 蕲春县| 河西区| 四会市| 凌源市| 南部县| 建平县| 仁寿县| 昌都县| 永靖县| 钟祥市| 类乌齐县| 丰镇市| 德州市| 萨迦县| 汾阳市| 金乡县| 织金县| 栾川县| 金川县| 靖边县| 正定县| 卢湾区| 昌邑市| 淳安县| 西城区| 朔州市| 襄汾县|