Java 基礎(chǔ)(12)——類與對(duì)象

Java是一門純粹的OOP(Object-Oriented Programming)[面向?qū)ο骫的編程語(yǔ)言弄唧。所以其實(shí)從這里開始才是重點(diǎn)哈哈广匙。

面向?qū)ο笞钤缡瞧呤甏臅r(shí)候由IBM的SmallTalk語(yǔ)言最先推廣,后來有了C++,再后來產(chǎn)生了今天的Java。

面向?qū)ο?/h1>

面向?qū)ο笫且环N技術(shù)的開發(fā)模式家卖,但是最早的時(shí)候所使用的模式是面向過程。

“面向過程”(Procedure Oriented) 是一種以過程為中心的編程思想庙楚。這些都是以什么正在發(fā)生為主要目標(biāo)進(jìn)行編程篡九,不同于面向?qū)ο蟮氖钦l(shuí)在受影響。與面向?qū)ο竺黠@的不同就是封裝醋奠、繼承、類伊佃。

面向過程:是針對(duì)某一個(gè)問題單獨(dú)提出解決方案以及代碼開發(fā)窜司。只能解決當(dāng)前問題,由于缺少合理做法航揉,只能完成一次服務(wù)塞祈,為特定功能服務(wù)。
面向?qū)ο螅菏前褬?gòu)成問題事務(wù)分解成各個(gè)對(duì)象帅涂,建立對(duì)象的目的不是為了完成一個(gè)步驟议薪,而是為了描敘某個(gè)事物在整個(gè)解決問題的步驟中的行為。

面向?qū)ο笫且砸环N組件化的形式進(jìn)行代碼的設(shè)計(jì)媳友。這樣開發(fā)出來的代碼有一個(gè)最大的好處就是重用斯议。

舉個(gè)栗子:
小王開了一家正裝店鋪,關(guān)于西服的進(jìn)貨醇锚,他現(xiàn)在有兩種選擇:

  1. 來一個(gè)客人之后哼御,量好身材,制作上衣焊唬、褲子恋昼、領(lǐng)帶。然后交付給客人赶促。(面向過程)
  2. 按照每一個(gè)尺碼分別制作若干上衣液肌、褲子、領(lǐng)帶鸥滨,客人直接按尺碼購(gòu)買嗦哆。(面向?qū)ο螅?/li>

在面向?qū)ο蟮某绦蛑杏腥N特性:

  • 封裝性:保護(hù)內(nèi)部的定義結(jié)構(gòu)安全性
  • 繼承性:在已有程序結(jié)構(gòu)上繼續(xù)擴(kuò)充新的功能
  • 多態(tài)性:在某一個(gè)概念范圍內(nèi)的滿足

面向?qū)ο箝_發(fā)的步驟分為:OOA(面向?qū)ο蠓治觯OD(面向?qū)ο笤O(shè)計(jì))爵赵、OOP(面向?qū)ο缶幊蹋?/p>

類與對(duì)象

面向?qū)ο笥袃蓚€(gè)基本概念:類與對(duì)象吝秕。

  • 類:是對(duì)客觀事物不斷認(rèn)識(shí)而產(chǎn)生的一個(gè)抽象概念
  • 對(duì)象:現(xiàn)實(shí)生活中的一個(gè)個(gè)實(shí)體(也稱實(shí)例)

類就是共性的集合,對(duì)象就是某一個(gè)性的產(chǎn)物空幻。

類是現(xiàn)實(shí)世界或思維世界中的實(shí)體在計(jì)算機(jī)中的反映烁峭,它將數(shù)據(jù)以及這些數(shù)據(jù)上的操作封裝在一起。 from 百度百科

相似的對(duì)象可以歸并為一類(共性集合),就與1约郁、2缩挑、3都是整數(shù),可以歸類到int類型里一樣鬓梅,所以同一個(gè)類所創(chuàng)建出的對(duì)象供置,它的值可以不相同,但是屬性一定相同绽快。比如1和2芥丧,他們一個(gè)數(shù)值上不相等,但是屬性上都是整數(shù)坊罢。

找個(gè)人干活 找到了小王同學(xué) 人就是類续担,小王同學(xué)就是對(duì)象~
去銀行辦一個(gè)賬戶,賬戶是類活孩,辦到的銀行卡是對(duì)象物遇。
招聘時(shí)HR需要的是附和他要求的那一類人,如果你每一項(xiàng)剛好符合他的需求憾儒,你就是他要找的對(duì)象询兴。

基本定義

如果需要定義一個(gè)類的話,可以使用class 類名稱{ }起趾。類中的組成主要有兩點(diǎn):

  • Field(屬性诗舰,成員,變量)就是一堆變量的集合
  • Method(方法训裆,行為)之前學(xué)過的方法始衅,但是此時(shí)的方法是由對(duì)象調(diào)用的。
    定義一個(gè)類:
class book{ //定義一個(gè)新的類
    String title; //書的名字
    double price; //書的價(jià)格
    public void getInfo(){//此方法將由對(duì)象調(diào)用
        System.out.println("圖書名稱:"+title+"缭保,價(jià)格:"+price);
    }
}

那么這個(gè)類里定義了兩個(gè)屬性和一個(gè)方法汛闸。有類之后,如果想要使用類的話艺骂,就必須有對(duì)象诸老,對(duì)象的定義分為兩種格式:

  • 聲明對(duì)象并實(shí)例化:類名稱 對(duì)象名稱 = new 類名稱();
  • 分步完成:① 聲明對(duì)象:類名稱 對(duì)象名稱 = null; ② 實(shí)例化對(duì)象:對(duì)象名稱 = new 類名稱();

類屬于引用數(shù)據(jù)類型,而引用數(shù)據(jù)類型與基本數(shù)據(jù)類型最大的不同在于引用數(shù)據(jù)類型需要開辟內(nèi)存空間钳恕,我們使用new關(guān)鍵字來進(jìn)行內(nèi)存空間的開辟别伏。但是說到內(nèi)存之前,需要普及兩個(gè)概念:

堆棧(stack)忧额。位于通用 RAM 中厘肮,但通過它的 “堆棧指針” 可以從處理器哪里獲得支持。堆棧指針若向下移動(dòng)睦番,則分配新的內(nèi)存类茂;若向上移動(dòng)耍属,則釋放那些 內(nèi)存。這是一種快速有效的分配存儲(chǔ)方法巩检,僅次于寄存器厚骗。創(chuàng)建程序時(shí)候,JAVA 編譯器必須知道存儲(chǔ)在堆棧內(nèi)所有數(shù)據(jù)的確切大小和生命周期兢哭,因?yàn)樗仨毶?相應(yīng)的代碼领舰,以便上下移動(dòng)堆棧指針。這一約束限制了程序的靈活性迟螺,所以雖然某些 JAVA 數(shù)據(jù)存儲(chǔ)在堆棧中——特別是對(duì)象引用冲秽,但是 JAVA 對(duì)象不存儲(chǔ)其 中。
堆(heap)矩父。一種通用性的內(nèi)存池(也存在于 RAM 中)劳跃,用于存放所以的 JAVA 對(duì)象。堆不同于堆棧的好處是:編譯器不需要知道要從堆里分配多少存儲(chǔ)區(qū) 域浙垫,也不必知道存儲(chǔ)的數(shù)據(jù)在堆里存活多長(zhǎng)時(shí)間。因此郑诺,在堆里分配存儲(chǔ)有很大的靈活性夹姥。當(dāng)你需要?jiǎng)?chuàng)建一個(gè)對(duì)象的時(shí)候,只需要 new 寫一行簡(jiǎn)單的代碼辙诞,當(dāng)執(zhí)行 這行代碼時(shí)辙售,會(huì)自動(dòng)在堆里進(jìn)行存儲(chǔ)分配。當(dāng)然飞涂,為這種靈活性必須要付出相應(yīng)的代碼旦部。用>堆進(jìn)行存儲(chǔ)分配比用堆棧進(jìn)行存儲(chǔ)存儲(chǔ)需要更多的時(shí)間。

這一段太長(zhǎng)了哈较店,其實(shí)簡(jiǎn)單的來說士八,堆內(nèi)存保存的是每一個(gè)對(duì)象的屬性內(nèi)容,new關(guān)鍵字開辟的內(nèi)存空間也正是它梁呈。而棧內(nèi)存存放的是一塊堆內(nèi)存的地址婚度,能夠告訴機(jī)器這個(gè)東西存在哪里。

比如超市的儲(chǔ)物柜官卡,你按一下按鈕蝗茁,會(huì)打開一個(gè)柜子,并且出來一張條形碼的紙條寻咒。結(jié)賬完之后拿包什么的只需要拿著那個(gè)條形碼去掃一下就可以打開那個(gè)柜子哮翘。那么,打開的柜子就是你按下按鈕(new)開辟的“堆內(nèi)存”空間毛秘,出來的條形碼就是“棧內(nèi)存”饭寺,里面存放的是這個(gè)柜子的地址信息,可能是第幾排第幾個(gè),也可能是編號(hào)001號(hào)柜子佩研。

好柑肴,概念了解完就可以繼續(xù)了~

當(dāng)一個(gè)對(duì)象實(shí)例化之后就可以按照下列方式利用對(duì)象操作類:

  • 對(duì)象.屬性 表示要操作類中的屬性內(nèi)容
  • 對(duì)象.方法() 表示要調(diào)用類中的方法

那么就使用一下剛剛的book類吧:

public class Test01{
    public static void main(String[] args){
        Book bk=new Book();//聲明并實(shí)例化對(duì)象
        bk.title="Java開發(fā)";//操作屬性內(nèi)容
        bk.price=89.9;//操作屬性內(nèi)容
        bk.getInfo();//調(diào)用類中的getInfo方法
    }
}

分析一下:

Book bk=new Book();//聲明并實(shí)例化對(duì)象

聲明了bk對(duì)象,并且為bk對(duì)象new了一個(gè)堆內(nèi)存空間旬薯。(堆內(nèi)存:title=null price=0.0)ps. String是引用數(shù)據(jù)類型晰骑,所以默認(rèn)值為null,double型的price默認(rèn)值為0.0

bk.title="Java開發(fā)";//操作屬性內(nèi)容

修改bk對(duì)象的title(堆內(nèi)存:title="Java開發(fā)" price=0.0)

bk.price=89.9;//操作屬性內(nèi)容

修改bk對(duì)象的price(堆內(nèi)存:title="Java開發(fā)" price=89.9)


那么如果是分步來呢绊序?

Book bk;//聲明對(duì)象
bk = new Book();//實(shí)例化對(duì)象

依然還是來分析一下哈:

Book bk;//聲明對(duì)象

聲明了bk對(duì)象硕舆,由于沒有實(shí)例化,所以目前的bk對(duì)象為引用類型的默認(rèn)值null骤公。

bk = new Book();//實(shí)例化對(duì)象

實(shí)例化bk對(duì)象抚官,new開辟了bk的內(nèi)存空間,所以bk就不為空了(但是里面的屬性是默認(rèn)值null和0.0)

任何情況下只要出現(xiàn)了關(guān)鍵字new阶捆,都表示要開辟新的內(nèi)存空間凌节,一旦堆內(nèi)存空間開辟了,里面就一定會(huì)有所有類中定義的屬性洒试,當(dāng)然所有的屬性的值都是它對(duì)應(yīng)的數(shù)據(jù)類型的默認(rèn)值

我們?cè)诼暶鲗?duì)象之后一定要記得實(shí)例化對(duì)象倍奢,如果忘記的話:

public class Test01 {
    public static void main(String[] args) {
        Book bk;
        // bk = new Book();  //模擬沒有初始化
        bk.title = "測(cè)試用書";
        bk.price = 100.1;
        bk.getInfo();
    }
}

輸出的結(jié)果:

Exception in thread "main" java.lang.NullPointerException
    at Test01.main(Test01.java:11)

NullPointerException 空指針異常
開辟了堆內(nèi)存的對(duì)象叫實(shí)例化對(duì)象,但是如果使用未實(shí)例化的對(duì)象垒棋,程序在運(yùn)行時(shí)就會(huì)出現(xiàn)空指針異常卒煞。
(編譯的過程中報(bào)的錯(cuò)誤屬于語(yǔ)法錯(cuò)誤,空指針這個(gè)是運(yùn)行時(shí)報(bào)錯(cuò))


引用數(shù)據(jù)

引用 是Java的核心精髓所在叼架。引用類似于C++中的指針概念畔裕,但是比指針更加的簡(jiǎn)單。

在所有的引用分析里乖订,最關(guān)鍵的還是在于關(guān)鍵字"new"扮饶,一定要注意每一次使用關(guān)鍵詞new都一定會(huì)開辟新的堆內(nèi)存空間,所以代碼里聲明了兩個(gè)對(duì)象乍构,并且分別進(jìn)行了實(shí)例化操作贴届,那么一定是開辟了兩個(gè)堆內(nèi)存空間,互不影響蜡吧。

舉個(gè)栗子 01:

Book bk1 = new Book();
Book bk2 = null;

聲明了兩個(gè)對(duì)象了毫蚓,但是只實(shí)例化了bk1,也就是說只開辟了bk1這一個(gè)內(nèi)存空間昔善。

bk1.title = "Java開發(fā)";  // 操作屬性內(nèi)容
bk1.price = 89.9;        // 操作屬性內(nèi)容

修改了bk1的屬性值

bk2 = bk1;               // 引用傳遞

這句話元潘,將bk1賦值給bk2。意思就是將bk1的堆內(nèi)存空間的地址給了bk2的棧內(nèi)存君仆,所以bk2與bk1目前指向的是同一塊堆內(nèi)存翩概。

bk2.title = "JSP開發(fā)";  // 操作屬性內(nèi)容
bk2.price = 68.8;        // 操作屬性內(nèi)容

修改了bk2指向的堆內(nèi)存中的數(shù)據(jù)牲距。但是由于bk2和bk1指向的是同一個(gè)堆內(nèi)存,所以bk1也同樣修改了

bk1.getInfo();           // 調(diào)用類中的getInfo方法
bk2.getInfo();           // 調(diào)用類中的getInfo方法

所以這里bk1和bk2的getInfo()方法輸出的結(jié)果是一樣的钥庇!


舉個(gè)栗子 02:

Book bk1 = new Book();
Book bk2 = new Book();
bk1.title = "Java開發(fā)";  // 操作屬性內(nèi)容
bk1.price = 89.9;        // 操作屬性內(nèi)容
bk2 = bk1;               // 引用傳遞
bk2.title = "JSP開發(fā)";  // 操作屬性內(nèi)容
bk2.price = 68.8;        // 操作屬性內(nèi)容
bk1.getInfo();           // 調(diào)用類中的getInfo方法
bk2.getInfo();           // 調(diào)用類中的getInfo方法

這一次的bk2也被實(shí)例化了牍鞠,也就是說開辟了兩個(gè)堆內(nèi)存空間。但是在第五行的時(shí)候评姨,bk2再一次的指向了bk1的堆內(nèi)存地址难述!于是,bk2原來的堆內(nèi)存空間就沒有任何棧內(nèi)存指向它了吐句,所以這個(gè)沒有任何棧內(nèi)存指向的堆內(nèi)存胁后,就將成為垃圾

所有的垃圾會(huì)不定期的被垃圾收集器(GC)進(jìn)行回收嗦枢,回收之后會(huì)釋放掉其所占用的空間攀芯。

ps. 雖然Java中有支持自動(dòng)的垃圾收集處理,但在開發(fā)過程中應(yīng)該盡量減少垃圾空間的產(chǎn)生文虏。


以上侣诺,修改于 20190512 。
學(xué)自李興華老師的Java課
from ahanwhite
如有錯(cuò)誤氧秘,敬請(qǐng)批評(píng)年鸳!非常感謝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末敏储,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子朋鞍,更是在濱河造成了極大的恐慌已添,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滥酥,死亡現(xiàn)場(chǎng)離奇詭異更舞,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)坎吻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門缆蝉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瘦真,你說我怎么就攤上這事刊头。” “怎么了诸尽?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵原杂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我您机,道長(zhǎng)穿肄,這世上最難降的妖魔是什么年局? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮咸产,結(jié)果婚禮上矢否,老公的妹妹穿的比我還像新娘。我一直安慰自己脑溢,他們只是感情好僵朗,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著焚志,像睡著了一般衣迷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酱酬,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天壶谒,我揣著相機(jī)與錄音,去河邊找鬼膳沽。 笑死汗菜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挑社。 我是一名探鬼主播陨界,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼痛阻!你這毒婦竟也來了菌瘪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤阱当,失蹤者是張志新(化名)和其女友劉穎俏扩,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弊添,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡录淡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了油坝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嫉戚。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖澈圈,靈堂內(nèi)的尸體忽然破棺而出彬檀,到底是詐尸還是另有隱情,我是刑警寧澤瞬女,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布凤覆,位于F島的核電站,受9級(jí)特大地震影響拆魏,放射性物質(zhì)發(fā)生泄漏盯桦。R本人自食惡果不足惜慈俯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拥峦。 院中可真熱鬧贴膘,春花似錦、人聲如沸略号。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)玄柠。三九已至突梦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間羽利,已是汗流浹背宫患。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留这弧,地道東北人娃闲。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像匾浪,于是被迫代替她去往敵國(guó)和親皇帮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,089評(píng)論 1 32
  • 一蛋辈、基礎(chǔ)知識(shí):1属拾、JVM、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機(jī)...
    殺小賊閱讀 2,365評(píng)論 0 4
  • 整理來自互聯(lián)網(wǎng) 1冷溶,JDK:Java Development Kit渐白,java的開發(fā)和運(yùn)行環(huán)境,java的開發(fā)工具...
    Ncompass閱讀 1,534評(píng)論 0 6
  • 1.import static是Java 5增加的功能,就是將Import類中的靜態(tài)方法挂洛,可以作為本類的靜態(tài)方法來...
    XLsn0w閱讀 1,213評(píng)論 0 2
  • 面向?qū)ο笾饕槍?duì)面向過程礼预。 面向過程的基本單元是函數(shù)眠砾。 什么是對(duì)象:EVERYTHING IS OBJECT(萬(wàn)物...
    sinpi閱讀 1,046評(píng)論 0 4