前言
暑假的時(shí)候?qū)W過一段時(shí)間的Java,但只是自己買一本書來看,書中的一大段一大段文字顯得十分生硬,因此學(xué)完之后感覺自己對(duì)于一些概念還是一知半解。于是國慶假期我在慕課網(wǎng)重新學(xué)習(xí)了Java,一來是可以復(fù)習(xí)曾經(jīng)學(xué)過的知識(shí),二來是可以弄清楚自己曾經(jīng)感到模糊的概念,三來還可以了解到各路大神對(duì)Java這門語言的見解,加深自己對(duì)其的認(rèn)知與理解。下面我就整理了一些我認(rèn)為在Java的學(xué)習(xí)過程比較關(guān)鍵的內(nèi)容(這里只闡述一些基本概念,具體操作請參考本文最下方提供的參考資料):
一、類與對(duì)象
和我們所熟悉的C++一樣,Java也是面向?qū)ο缶幊痰恼Z言,因此對(duì)象便是Java的核心。
一些概念:
對(duì)象:
在現(xiàn)實(shí)世界中,客觀存在的事物就是對(duì)象,例如人類、書桌、計(jì)算機(jī)等。而對(duì)于計(jì)算機(jī)來說,面向?qū)ο缶褪侵戈P(guān)注具體事物的信息。
類:
類是對(duì)象的類型,確定對(duì)象了對(duì)象擁有的特征和行為,翻譯成計(jì)算機(jī)語言就是屬性和方法。類是具有相同屬性和方法的對(duì)象的集合,可以把多個(gè)具有相同屬性和方法的對(duì)象有一個(gè)類來表示。但和對(duì)象不同,類并不是客觀存在的事物。
對(duì)象的屬性:
對(duì)象的屬性就是對(duì)象具有的各種特征,而對(duì)于每個(gè)對(duì)象來說,每個(gè)特征都具有特定值。
對(duì)象的方法:
對(duì)象的方法就是對(duì)象執(zhí)行的操作,也可以理解為對(duì)象能干什么。
說了一大堆概念,下面舉一個(gè)更直觀的例子來說明:手機(jī)是一個(gè)總稱,可以把它看成是一個(gè)類,而具體到某一品牌某一型號(hào)的手機(jī)則是手機(jī)類中的一個(gè)對(duì)象。以最新的蘋果產(chǎn)品iPhone7為例(我真的沒有在賣廣告),它的屏幕有大小、內(nèi)存有大小、還有價(jià)格,因此屏幕、內(nèi)存和價(jià)格便是它這個(gè)對(duì)象的特征(屬性),而屏幕的大小、內(nèi)存的大小、具體的價(jià)格就是特征的值(屬性值);除了這些,iPhone7還有打電話、發(fā)短信的功能,這便是它這個(gè)對(duì)象的行為(方法),即能打電話、能發(fā)短信。試想一下,是不是所有手機(jī)都有屏幕、內(nèi)存和價(jià)格這些特征,都有打電話、發(fā)短信這些行為呢(當(dāng)然有些手機(jī)功能更先進(jìn),會(huì)擁有其它手機(jī)沒有的功能,這要用到接口的概念,以后將會(huì)介紹)?可想而知是的,因此手機(jī)便是一個(gè)類,而iPhone7就是手機(jī)類中的一個(gè)具體對(duì)象。同樣,三星Note 7 、華為P9這些手機(jī)也是手機(jī)類中的具體對(duì)象。
成員變量和局部變量:
成員變量在類中定義,用來描述對(duì)象的屬性;局部變量在類的成員方法中定義,用來存放臨時(shí)數(shù)據(jù)。
區(qū)別:
- 作用域:成員變量的作用域?yàn)檎麄€(gè)類;局部變量的作用域?yàn)樗诘某蓡T方法
- 初始值:Java會(huì)給成員變量賦一個(gè)初始值,但不會(huì)給局部變量賦一個(gè)初始值(這一點(diǎn)比較容易忽略的,如果不給局部變量賦初始值,則程序會(huì)報(bào)錯(cuò))
- 名稱:在同一個(gè)方法中不能有同名的局部變量,但在不同的方法中可以有同名的局部變量(局部變量的作用域能很好地解釋這一點(diǎn):第一個(gè)方法中的局部變量并不會(huì)在第二個(gè)方法中生效。因此同名的兩個(gè)(或多個(gè))局部變量是不同的局部變量,只不過名稱相同罷了)
- 優(yōu)先級(jí):當(dāng)成員變量和局部變量同名時(shí), 局部變量具有更高的優(yōu)先級(jí)(這在Java中是允許的,但調(diào)用這個(gè)局部變量時(shí)優(yōu)先取局部變量的值而不是成員變量的值)
構(gòu)造方法:
構(gòu)造方法是定義類中用來初始化對(duì)象的方法。與上面介紹的對(duì)象的方法有所不同,構(gòu)造方法不代表對(duì)象能干什么,但它能創(chuàng)建這個(gè)對(duì)象并給對(duì)象初始化。
在創(chuàng)建對(duì)象的過程中,用new關(guān)鍵字來創(chuàng)建:類名 對(duì)象名 = new 類名() 。這里的類名()其實(shí)就是調(diào)用這個(gè)類的無參構(gòu)造方法(不管是有參還是無參,構(gòu)造方法都與類同名)。
注意:
- 當(dāng)沒有指定構(gòu)造方法時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用無參的構(gòu)造方法
- 當(dāng)指定了構(gòu)造方法時(shí),無論這個(gè)方法是有參的還是無參的,系統(tǒng)都不會(huì)調(diào)用無參的構(gòu)造方法(舉個(gè)例子,通過兩種構(gòu)造方法來初始化對(duì)象:
類名 對(duì)象名 = new 類名()、類名 對(duì)象名 = new 類名(參數(shù)類型 參數(shù)名),如果此時(shí)已經(jīng)定義了有參(或者無參)的方法的話,類名 對(duì)象名 = new 類名()這里系統(tǒng)就會(huì)報(bào)錯(cuò),即系統(tǒng)不會(huì)調(diào)用原本默認(rèn)的無參的構(gòu)造方法來創(chuàng)建對(duì)象,只能通過已定義的有參(或者無參)的構(gòu)造方法來創(chuàng)建對(duì)象) - 構(gòu)造方法不但可以給對(duì)象的屬性賦值(即初始化對(duì)象), 還能夠保證給對(duì)象的屬性賦一個(gè)合理的值(舉個(gè)例子,現(xiàn)實(shí)生活中我們知道如今手機(jī)屏幕的大小不可能為負(fù)數(shù),也不可能太大,因此當(dāng)我們定義一個(gè)有參的構(gòu)造方法的時(shí)候就可以給手機(jī)的屏幕大小這一屬性賦一個(gè)合乎常理的值,當(dāng)傳入的參數(shù)小于0或者大于8(單位為英寸),就可以通過構(gòu)造方法強(qiáng)制把屏幕大小設(shè)定為一個(gè)正常值)
權(quán)限修飾符:
權(quán)限修飾符控制著對(duì)類、類的成員變量和類的成員方法的訪問,種類和作用范圍如下圖所示:

對(duì)類和對(duì)象的操作:
定義類:
簡單來說,定義Java中的類分為三個(gè)步驟:
1.定義訪問權(quán)限、類名等
2.編寫類的屬性
3.編寫類的方法
即為:
[權(quán)限修飾符] class 類名{
//屬性(成員變量)
[權(quán)限修飾符] 屬性1的類型 屬性1;
[權(quán)限修飾符] 屬性2的類型 屬性2;
[權(quán)限修飾符] 屬性3的類型 屬性3;
...
//方法
方法1;
方法2;
方法3;
...
}
注意:
- 這里的屬性和方法可為一個(gè)或多個(gè),也可以沒有
- 類名通常以大寫字母開頭
- []代表可有可無的內(nèi)容,下同
定義屬性:
定義屬性就是聲明變量并賦初始值。
注意:如果變量有初始值就賦初始值,無初始值則賦0(int型、long型)或者0.0(double型)或者" "(String型),以此類推。
定義方法:
[權(quán)限修飾符] 返回值類型 方法名(參數(shù)類型 參數(shù)名){
//方法體
return 返回值;
}
注意:
- 方法名后的括號(hào)內(nèi)容可以為空,即代表無參的方法
- 方法也可以無返回值,此時(shí)返回值類型為
void - 方法體可以為空
- 返回值的類型一定要與第一行所聲明的返回值類型相符,否則程序會(huì)報(bào)錯(cuò)
- 方法名如果由多個(gè)單詞構(gòu)成,不使用下劃線,而是除第一個(gè)單詞外其余單詞首字母大寫,其余字母均小寫,以此區(qū)分
調(diào)用對(duì)象的屬性:
對(duì)象名.屬性
調(diào)用對(duì)象的方法:
對(duì)象名.方法名()
二、封裝
首先要強(qiáng)調(diào),面向?qū)ο笸瑫r(shí)也是Java三大特性:封裝、繼承與多態(tài)。
封裝:
封裝是指將類的某些信息隱藏在類的內(nèi)部,不允許外部程序直接訪問,只能通過該類提供的成員方法來實(shí)現(xiàn)對(duì)這些信息的訪問與操作。這樣使得外部程序只能通過規(guī)定的方法訪問和操作類中的數(shù)據(jù),提高了程序的安全性。
封裝的實(shí)現(xiàn)步驟為:
1.修改成員變量(屬性)的可見性(將權(quán)限修飾符設(shè)為private,即只能在本類中調(diào)用)
2.創(chuàng)建getter和setter方法,用于屬性的讀寫(這里不必糾結(jié)于這兩種方法的名稱,知道它們的具體代碼和作用就好。實(shí)際上只要正確,用其他方法也可以實(shí)現(xiàn)屬性的讀寫,但規(guī)范來說應(yīng)使用getter和setter方法)
3.在getter和setter方法中加入一些控制語句,對(duì)屬性值是否合法(合乎常理)進(jìn)行判斷
this關(guān)鍵字:
在Java中,this關(guān)鍵字被隱式地用來引用本類中的成員變量和成員方法,常常與封裝聯(lián)系起來使用。
現(xiàn)在以上文提到的手機(jī)類為例描述封裝的具體實(shí)現(xiàn),先定義Phone類:
package com.project;//聲明包
public class Phone{//定義Phone類
private float screen;//定義屏幕屬性(單位為英寸)
private float CPU;//定義內(nèi)存屬性(單位為G)
private int price;//定義價(jià)格屬性(單位為元)
//這里封裝了3個(gè)屬性,用private修飾它們的訪問權(quán)限
public float getScreen(){//定義screen屬性的getter方法
return screen;//返回screen屬性的值
}
public void setScreen(float screen){//定義screen屬性的setter方法
this.screen = screen;//把screen屬性的值設(shè)置為傳入的參數(shù)的值
}
}
這樣就定義好了Phone類中screen屬性的getter和setter方法,外部程序可以通過對(duì)象名.getScreen()和對(duì)象名.setScreen(float型數(shù)據(jù))來獲得對(duì)象的screen屬性值和設(shè)置對(duì)象的screen屬性值。
PS:利用開發(fā)工具(Eclipse、Myeclipse)能快速創(chuàng)建getter和setter方法,小伙伴們可以自行試試應(yīng)該怎么操作。
在倒數(shù)第三行代碼中出現(xiàn)了this關(guān)鍵字,在這里它的作用是引用phone類中的成員變量screen,而this.screen = screen語句中第二個(gè)screen是指形參screen,這條語句的作用就是將形參screen的值賦給成員變量screen。由于它們同名,因此需要使用this關(guān)鍵字來區(qū)分它們。
此外,this關(guān)鍵字還可以引用本類中的成員方法,還是以上文的Phone類為例:
package com.project;
public class Phone{
...
public void call(){//定義無參無返回值的call方法
System.out.println("手機(jī)具有打電話的功能");//打印輸出“手機(jī)具有打電話的功能”這句話
}
public void sendMessage(){//定義無參無返回值的sendMessage方法
System.out.println("手機(jī)具有發(fā)短信的功能");//打印輸出“手機(jī)具有發(fā)短信的功能”這句話
}
public void function(){//定義無參無返回值的function方法
System.out.println("手機(jī)具有以下功能");
this.call();
this.sendMessage();
}
}
新建一個(gè)項(xiàng)目測試類用于測試功能的實(shí)現(xiàn):
package com.project;
public class Test {
public static void main(String[] args) {
Phone iPhone7 = new Phone();//創(chuàng)建Phone類對(duì)象iPhone7
iPhone7.function();調(diào)用iPhone7的function()方法
}
}
控制臺(tái)界面會(huì)輸出以下信息:

說明this關(guān)鍵字既可以引用本類中的成員變量,又可以引用本類中的成員方法。