[JAVA]面向對象的三大特性

學習Java的進階過程罚屋,是理解面向對象的思想嗅绸,掌握面向對象的基本原則以及Java面向對象基本實現(xiàn)原理,熟練使用封裝尖滚、繼承瞧柔、多態(tài)的三大特征,接下來我會帶大家進一步探索Java世界的奧秘撼唾!

一哥蔚、類和對象

類:是抽象的概念集合糙箍,表示的是一個共性的產(chǎn)物,類之中定義的是屬性和行為(方法)抖格;
對象:對象是一種個性的表示咕晋,表示一個獨立的個體,每個對象擁有自己獨立的屬性滓玖,依靠屬性來區(qū)分不同對象质蕉。

1.定義類


[修飾符] class 類名
{
零到多個構造器定義...
零到多個field...
零到多個方法...
}


  • 定義field的語法格式:
    [修飾符] field 類型 field名[=默認值];
  • 定義方法的語法格式:
    [修飾符]方法返回值類型 方法名(形參列表)
    {
    //由零條到多條可執(zhí)行性語句組成的方法體
    }
  • 定義構造器是一個特殊的方法:
    [修飾符]構造器名(形參列表)
    {
    //由零條到多條可執(zhí)行性語句組成的構造器執(zhí)行體
    }

值得指出的是模暗,構造器既不能定義返回值類型,也不能使用void沒有返回值定義構造器

定義一個類


class Person { // 類名稱首字母大寫
//定義兩個Field
String name ;
int age ;
//定義一個tell方法
public void tell() { // 沒有static
System.out.println("姓名:" + name + "绷蹲,年齡:" + age) ;
}
}


2.對象的產(chǎn)生和使用

定義和使用對象


public static void main(String args[]) {
Person per = new Person() ;// 聲明并實例化對象
per.name = "張三" ;//操作屬性內(nèi)容
per.age = 30 ;//操作屬性內(nèi)容
per.tell() ;//調(diào)用類中的get()方法
}


二祝钢、封裝

1.什么是封裝若厚?

將類的某些信息隱藏在類的內(nèi)部,不允許外部程序直接訪問疤估,而是通過該類的提供方法來實現(xiàn)對隱藏信息的操作和訪問

  • 封裝的好處
    只能通過規(guī)定的方法來實現(xiàn)訪問

2.實現(xiàn)步驟

修改屬性的可見性—>設為private
創(chuàng)建Getter/setter方法—>用于屬性的讀寫
在getter/setter方法中加入屬性控制語句—>對屬性值的合法性進行判斷

3. 使用 java中的包管理類

1.包的作用

  • 管理文件
  • 解決同名文件沖突

2.定義包:package 包名
3.其他文件中使用另一個文件的包通過import關鍵字

全部必須是小寫

4.java中的訪問修飾符

訪問修飾符 本類 同包 子類 其他
private Y
默認 Y Y
protect Y Y Y
public Y Y Y Y

5. 內(nèi)部類

內(nèi)部類顧名思義就是定義在類內(nèi)部的另一個類

內(nèi)部類常用的幾種形式分為

  • 成員內(nèi)部類
  • 靜態(tài)內(nèi)部類
  • 方法內(nèi)部類
    接下來分別講解
    (1)內(nèi)部類中最常見的就是成員內(nèi)部類铃拇,也稱為普通內(nèi)部類慷荔。
    我們來看如下代碼:

運行結果為:


從上面的代碼中我們可以看到显晶,成員內(nèi)部類的使用方法
1、 Inner 類定義在 Outer 類的內(nèi)部偿警,相當于 Outer 類的一個成員變量的位置唯笙,Inner 類可以使用任意訪問控制符,如 public 尿庐、 protected 呢堰、 private 等
2枉疼、 Inner 類中定義的 test() 方法可以直接訪問 Outer 類中的數(shù)據(jù),而不受訪問控制符的影響惹资,如直接訪問 Outer 類中的私有屬性a
3航闺、 定義了成員內(nèi)部類后,必須使用外部類對象來創(chuàng)建內(nèi)部類對象侮措,而不能直接去 new 一個內(nèi)部類對象乖杠,即:內(nèi)部類 對象名 = 外部類對象.new 內(nèi)部類( );
4胧洒、 編譯上面的程序后墨状,會發(fā)現(xiàn)產(chǎn)生了兩個 .class 文件


其中肾砂,第二個是外部類的 .class 文件巴粪,第一個是內(nèi)部類的 .class 文件,即成員內(nèi)部類的 .class 文件總是這樣:外部類名$內(nèi)部類名.class
另外,友情提示哦:
1派哲、 外部類是不能直接使用內(nèi)部類的成員和方法滴

可先創(chuàng)建內(nèi)部類的對象掺喻,然后通過內(nèi)部類的對象來訪問其成員變量和方法感耙。
2、 如果外部類和內(nèi)部類具有相同的成員變量或方法即硼,內(nèi)部類默認訪問自己的成員變量或方法只酥,如果要訪問外部類的成員變量,可以使用 this 關鍵字损离。如:


運行結果:


(2)靜態(tài)內(nèi)部類
靜態(tài)內(nèi)部類是 static 修飾的內(nèi)部類僻澎,這種內(nèi)部類的特點是:
1十饥、 靜態(tài)內(nèi)部類不能直接訪問外部類的非靜態(tài)成員绷跑,但可以通過** new 外部類().成員** 的方式訪問
2、 如果外部類的靜態(tài)成員與內(nèi)部類的成員名稱相同砸捏,可通過“類名.靜態(tài)成員”訪問外部類的靜態(tài)成員;如果外部類的靜態(tài)成員與內(nèi)部類的成員名稱不相同梆暖,則可通過“成員名”直接調(diào)用外部類的靜態(tài)成員
3轰驳、 創(chuàng)建靜態(tài)內(nèi)部類的對象時,不需要外部類的對象冒黑,可以直接創(chuàng)建 內(nèi)部類 對象名= new 內(nèi)部類();


運行結果 :

(3)方法內(nèi)部類
方法內(nèi)部類就是內(nèi)部類定義在外部類的方法中抡爹,方法內(nèi)部類只在該方法的內(nèi)部可見芒划,即只在該方法內(nèi)可以使用。

一定要注意哦:由于方法內(nèi)部類不能在外部類的方法以外的地方使用泵殴,因此方法內(nèi)部類不能使用訪問控制符和 static 修飾符笑诅。

匿名內(nèi)部類這里不做講述映屋,如有興趣可以自行學習

三、繼承

1.什么是繼承

定義一個父類早处,再定義一個子類瘫析,讓子類繼承父類,則子類可以使用父類中定義的方法和成員咸包。但是private屬性是不能繼承的杖虾。

2.方法的重寫

我們經(jīng)常會遇到這樣的方法,子類繼承了父類的方法坟比,但是對父類方法不滿意葛账,則可以重寫父類的方法,這樣調(diào)用時會優(yōu)先調(diào)用子類重寫的方法菲宴,也就是重寫過的方法

繼承的初始化順序
1.初始化父類再子類
2.先初始化對象中的屬性趋急,再執(zhí)行構造方法中的初始化

3. java中final的使用

final刻意修飾類、方法愈犹、屬性和變量
修飾類不允許被繼承闻丑,修飾方法不允許被重寫嗦嗡,修飾屬性不允許隱式的初始化必須有值或在構造方法中賦值饭玲,修飾變量只能賦一次值變?yōu)槌A?/p>

4. java中的super的使用

  • 在對象的內(nèi)部使用表示父類的對象
    例:如果在子類重寫了父類的方法,想調(diào)用父類的方法時 super.父類的方法名()
  • 子類的構造過程中必須調(diào)用父類的構造法方法相當于默認寫了super()
  • 如果顯式調(diào)用構造方法(必須運用super方法調(diào)用)必須放在構造方法第一行矮冬,也就是說super()必須放在子類構造方法的第一行
  • 如果父類有一個有參的構造法方法次哈,子類又沒有顯式調(diào)用構造方法則報錯

5. java中的Object類

object類式所有類的父類窑滞,如果一個類沒有使用extends關鍵字明確標識繼承另一個類,那么這個類繼承object類
object類中的方法適合所有子類巨坊。
1.tostring()方法
返回對象式哈希code碼(對象地址字符串)
2.equals()方法
比較的是對象的引用是否指向同一塊內(nèi)存地址
Dog dog = new Dog()此改;
Dog dog2 = new Dog();
dog,dog2對象其實是dog指向了兩個個不同的內(nèi)存地址
if(dog.equals(dog2)){
System.out.println("地址值相同");
}else{System.out.println("地址值不相同");}
結果:地址值不相同

四共啃、多態(tài)

對象的多種形態(tài)

1.引用多態(tài)

父類的引用可以指向本類的對象
父類的引用可以指向子類的對象

2.方法多態(tài)

創(chuàng)建本類的對象時暂题,調(diào)用本類方法
創(chuàng)建子類對象時調(diào)用子類的重寫方法或繼承的方法

3. java 中的抽象類

就像公交車妈候,出租車,摩托車等可以抽象出一個公共的特征是交通工具啸胧,有相同的使用方法是出行幔虏,那么類似的我們可以把許多類抽象出一個公共類想括,里面定義共有的成員變量以及方法,這樣的類就是抽象類烟逊。定義一個抽象類在扰,包括我們在c++中定義虛函數(shù)膳汪,這樣的模塊化使用不僅減少了代碼的重復率访雪,還減輕了開發(fā)人員的工作量臣缀,所以在面向對象的編程思想中泻帮,抽象類是一個很重要的運用。

  • 抽象類的定義
    abstract class Instrument {
    // 抽象類中可以有非抽象方法氯窍。
    private int i;
    public abstract void play(Note n);
    public String what() { return "Instrument"; }
    public abstract void adjust();
    }

4.java 中的接口

接口則是一個抽象類型狼讨,是抽象方法的集合柒竞,接口是為了實現(xiàn)不能抽象到一個類的兩個有公共方法的類的方法的抽象。比如飛機和鳥布隔,兩個都具有相同的方法就是飛行,但是我們不能將飛機和鳥抽象到一個類里招刨,那么飛機是一個類哀军,鳥是一個類杉适,同時我們定義一個接口,接口里抽象了飛行這個方法片习,則飛機和鳥兩個類都可以通過調(diào)用這個接口實現(xiàn)飛行這個方法的實例化蹬叭。

  • 定義接口
    [修飾符]interface 接口名[extends 父接口1,extends 父接口2侈离,....]
    {
    零到多個常量定義...public static final
    零到多個抽象方法的定義...public abstract
    }
  • 繼承父類實現(xiàn)接口的語法為:
    [修飾符]class 類名 extends 父類 implements 接口1,接口2 铺坞。济榨。

    類體部分//如果繼承了抽象類,需要實現(xiàn)繼承的抽象方法腐晾;要實現(xiàn)接口中的抽象方法

5.抽象類和接口的區(qū)別

要知道接口并不是類丐一,編寫接口的方式和類很相似,但是它們屬于不同的概念巨柒。類描述對象的屬性和方法。接口則包含類要實現(xiàn)的方法晶乔。
1正罢、抽象類和接口都不能直接實例化驻民,如果要實例化,抽象類變量必須指向實現(xiàn)所有抽象方法的子類對象呛占,接口變量必須指向實現(xiàn)所有接口方法的類對象懦趋。
2仅叫、抽象類要被子類繼承,接口要被類實現(xiàn)笙隙。
3坎缭、接口只能做方法申明,抽象類中可以做方法申明坏快,也可以做方法實現(xiàn)
4憎夷、接口里定義的變量只能是公共的靜態(tài)的常量拾给,抽象類中的變量是普通變量。
5级及、抽象類里的抽象方法必須全部被子類所實現(xiàn)窄锅,如果子類不能全部實現(xiàn)父類抽象方法缰雇,那么該子類只能是抽象類械哟。同樣殿雪,一個實現(xiàn)接口的時候,如不能全部實現(xiàn)接口方法爸业,那么該類也只能為抽象類扯旷。
6索抓、抽象方法只能申明,不能實現(xiàn)耸黑,接口是設計的結果 篮幢,抽象類是重構的結果
7三椿、抽象類里可以沒有抽象方法
8、如果一個類里有抽象方法男翰,那么這個類只能是抽象類
9纽乱、抽象方法要被實現(xiàn)鸦列,所以不能是靜態(tài)的鹏倘,也不能是私有的纤泵。
10镜粤、接口可繼承接口玻褪,并可多繼承接口带射,但類只能單根繼承。

end.

作者有話說:
我也是一個java方向技術小白券勺,所以文章更多的是知識點干貨內(nèi)容灿里,我會往自己的理解方面更多的努力匣吊,此篇文章希望可以給予有一定的java語言基礎的程序猿們更多的幫助。如果喜歡我的文章記得關注我并給我點個贊哦~

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末侣灶,一起剝皮案震驚了整個濱河市褥影,隨后出現(xiàn)的幾起案子咏雌,更是在濱河造成了極大的恐慌赊抖,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異报亩,居然都是意外死亡弦追,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門掸哑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苗分,“玉大人,你說我怎么就攤上這事躺枕」┨睿” “怎么了近她?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵粘捎,是天一觀的道長。 經(jīng)常有香客問我泳桦,道長娩缰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任拼坎,我火速辦了婚禮浮毯,結果婚禮上,老公的妹妹穿的比我還像新娘泰鸡。我一直安慰自己债蓝,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布盛龄。 她就那樣靜靜地躺著饰迹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪余舶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天欧芽,我揣著相機與錄音,去河邊找鬼葛圃。 笑死千扔,一個胖子當著我的面吹牛憎妙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播曲楚,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼厘唾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了龙誊?” 一聲冷哼從身側響起抚垃,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎趟大,沒想到半個月后鹤树,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡逊朽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年罕伯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叽讳。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡追他,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出岛蚤,到底是詐尸還是另有隱情邑狸,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布涤妒,位于F島的核電站单雾,受9級特大地震影響,放射性物質發(fā)生泄漏届腐。R本人自食惡果不足惜铁坎,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望犁苏。 院中可真熱鬧硬萍,春花似錦、人聲如沸围详。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽助赞。三九已至买羞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雹食,已是汗流浹背畜普。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留群叶,地道東北人吃挑。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓钝荡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親舶衬。 傳聞我的和親對象是個殘疾皇子埠通,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

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

  • 1 面向對象No6 面向對象 OO Object Oriented 編程時以對象為單元,封裝數(shù)據(jù)和邏輯逛犹,以此提...
    征程_Journey閱讀 1,141評論 0 2
  • 1. Java基礎部分 基礎部分的順序:基本語法端辱,類相關的語法,內(nèi)部類的語法虽画,繼承相關的語法舞蔽,異常的語法,線程的語...
    子非魚_t_閱讀 31,622評論 18 399
  • 一:java概述:1狸捕,JDK:Java Development Kit喷鸽,java的開發(fā)和運行環(huán)境,java的開發(fā)工...
    ZaneInTheSun閱讀 2,649評論 0 11
  • 本文出自 Eddy Wiki 灸拍,轉載請注明出處:http://eddy.wiki/interview-java.h...
    eddy_wiki閱讀 1,201評論 0 5
  • 1.import static是Java 5增加的功能,就是將Import類中的靜態(tài)方法做祝,可以作為本類的靜態(tài)方法來...
    XLsn0w閱讀 1,222評論 0 2