面向對象
- 面向對象:以特徵(屬性)和行爲(方法)的觀點去分析現實世界中事務的方式
- 面向對象編程:先使用面向對象的方式進行分析,再使用任意一門面向對象的編程語言進行翻譯的過程
類class
- 是什麼:人類(對具有相同特徵和行爲的多個對象共性的抽象描述,在Java語言中包含描述特徵的成員變量和描述行爲的成員方法,是創建對象的模板)
- 爲什麼:對象太多了,代碼重複量太大,也描述不過來,所以把他們共性的東西提取出來形成一個類!
對象new
- 是什麼:我這個人(客觀存在的實體,在Java語言體現爲內存空間的一塊區域)
- 爲什麼:類是抽象的概念,不能幹活,要想幹活就得依賴這一類的實體(對象)!
引用
- 是什麼:曹陽(在Java語言中使用引用數據類型聲明的變量叫做引用型變量,簡稱爲"引用")
- 爲什麼:創建對象的實質就是在堆區創建一塊存儲空間,如果這塊空間沒有記錄下來,下次用的時候就不知道怎麼找,爲了記錄這塊存儲空間,我們就得聲明一個引用!
成員變量和成員方法
- 成員變量:身高、體重(特徵)
- 成員方法:喫喝玩樂(行爲)
JVM內存結構
- 類:方法區
- 對象:堆區
- 引用:棧區
- 成員變量:靜態(方法區),非靜態(堆)
- 成員方法:棧區
- 局部變量:棧區,定義在函數中,函數結束內存釋放
- 字符串:常量池
構造方法
- 是什麼:方法名與類名相同,沒有返回值,void也不寫
- 爲什麼:希望在創建Person對象的同時能夠指定姓名和年齡時就需要構造方法!
方法重載
- 是什麼:像有參構造和無參構造這樣,方法名相同,參數列表的個數、順序、類型不同,調用方法時可以加以區分,這種關係叫重載
- 爲什麼:一個方法,需要傳遞的參數列表不同,這就需要方法重載,方便調用,省得記太多方法名!
this關鍵字
- 是什麼:在構造方法中代表當前正在構造的對象,在成員方法中代表當前正在調用方法的對象
- 爲什麼:形參變量名和成員變量名相同便於我們知道這個形參變量是給這個成員變量賦值的,但是他們的作用範圍不同,就近原則在方法體內成員變量就進不去了,這時就就需要this關鍵字了
參數傳遞
- 基本數據類型
- 形參變量的改變不會影響到實參
- 我天生就會笑,隨着年齡的增長我還能不會笑了?
- 引用數據類型
- 形參變量指向的內容的改變會影響到實參變量指向的內容
- 我本來不會騎自行車,誒但我學會了
- 引用數據類型
- 形參變量改變指向後再改變指向的內容時不會影響到實參變量指向的內容
- 我本來不會騎自行車也不會編程,但我學了騎自行車沒學編程,我編程不還是不會嘛
遞歸
- 是什麼:方法自己調用自己,階乘,漢諾塔
- 怎麼用:找退出條件(n=1) + 規律(n=n) =》 if判斷+調用自身
封裝
- 是什麼:一種保證成員變量值合理性和私密性的機制
- 爲什麼:main方法不是某個類獨有的,不應該放在類裏,單獨放到一個測試類裏。在測試類裏可以隨便改成員變量信息,合法但不合理,那不行,得封裝起來!
- 怎麼用:
- 我的車是我自己的(私有化成員變量)只有我能開;
- 我借你開(公有化get和set方法)你才能開,我借你車你開壞了也不行奧(set方法里加判斷);
- 聽話就可以開走了(構造方法裏調set方法)
static關鍵字
- 是什麼:就像在定義類的時候給成員屬性或成員方法一個默認值
- 爲什麼:在Person類實例中國籍都一樣,分配不同的內存空間,造成浪費。如果想把國籍都放在一塊內存空間就得用到static關鍵字
- 怎麼用:飲水機(被所有對象共享)可以加,水杯不可以加
單例
- 是什麼:在main方法中能得到且只能得到Singleton類的一個對象,Singleton類是單例類,任務管理器
- 餓漢式:
- 身份證號有且只能有一個自己的(私有化構造方法);
- 有了身份證號就可以證明有這個人了(本類型的引用指向本類類型的對象),怎麼讓別人知道有這個人呢你得加個static上個戶口,但也不能誰都可以用你身份證號啊你就得加個private;
- 怎麼找到這個人呢就得告訴他可以通過身份證號找你(提供公有的get方法負責將上面的對象返回出去),那人家也不知道你身份證號是啥啊你得加個static告訴他
- 懶漢式:
- 黑戶不上戶口,被抓了才上戶口
- 這種情況存在,但可不合理哦,不推薦!
繼承extends
- 是什麼:教師學生都是人,都得喫飯睡覺(把封裝的類中共性的內容提取出來形成一個公共類,其他類吸收這個公共類的機制就叫繼承)
- 爲什麼:除了喫飯睡覺,教師學生也都得喝水,那也不能挨個加啊,直接在人類里加一個就行了(提高代碼的複用性、擴展性和可維護性)
- 怎麼用:
- 兒子不能跟爸爸平輩也不能管媽媽叫媳婦啊(子類不能繼承父類的構造方法和私有方法),爸爸有名兒子也得有名啊,總不能一直叫誰誰誰的兒子吧,但是你也不能跟你爸用一個名吧(私有特徵可以繼承但不能訪問)
- 兒子生出來就遺傳了爸爸的基因(當構造子類對象時會自動構造父類的無參構造方法來初始化從父類中繼承下來的成員變量,相當於在子類構造方法的第一行增加代碼
super();
的效果) - 一個爸爸可以有多個兒子,但一個兒子只能有一個爸爸(Java語言中只支持單繼承)
- 兒子必須是爸爸親生的才能繼承他的基因(使用繼承必須滿足邏輯關係:子類 is a 父類)
方法重寫@Override + super
- 是什麼:爸爸賺的錢不夠花了,你就得自己掙了
- 爲什麼:Worker類繼承Person類調用show()方法是Person類裏的,只能打印Person類裏有的特徵,不能打印Worker類裏新加的特徵,這個時候就要用方法重寫
訪問控制
- 自己的東西只能自己用(private修飾的內容只能在本類中使用)
- 方法教你了你愛咋用咋用(public修飾的內容可以在任意位置使用)
包package
- 是什麼:就是文件夾
- 爲什麼:讓大家都寫一個類,最後命名全是一樣的,發給我就衝突了,放在一個不同的目錄裏就好了(便於管理,避免命名衝突的問題)
- 怎麼用:公司或組織域名的反寫.項目名.模塊名.類名
final關鍵字
- 是什麼:不要孩子,油鹽不進,有自己的想法誰也改變不了(本意爲"最終的,不可更改的",該關鍵字可以修飾類、成員方法、成員變量等)
- 爲什麼:final關鍵字防止濫用繼承,不經意方法重寫或數值的改變
- 對比this:
- this:本類(區分同名的成員變量和形參變量)
- super:父類(使用
super(實參)
的方式可以調用父類的構造方法,使用super.
的方式可以調用父類中被重寫的方法)
對象創建的執行流程
- 單個對象:main方法裏默認值 =》 顯示初始化 =》 構造塊 =》 構造方法體 =》 創建完畢
- 子類對象:父類靜態代碼塊 =》 子類靜態代碼塊 =》 父類構造塊 =》 父類構造方法體 =》 子類構造塊 =》 子類構造方法體
多態
- 是什麼:飲料:可樂雪碧紅牛(同一事物表現出來的多種形態)
- 爲什麼:
- 既能打印矩形又能打印圓形(父類Shape)(通過方法的參數傳遞形成多態,屏蔽不同子類的差異性實現通用的編程帶來不同的結果)
- 在方法體中直接用,抽象類/接口不能new對象,只能指向子類對象,當需要更換子類時只需要將new後面的類型修改而其它地方代碼不變就立即生效,提高了代碼的可維護性
- Calender類是抽象類不能new對象,返回值類型是Calender類型,但實際返回該類子類的對象
- 怎麼用:
- 可以通過“林肯他爸”找到他爸,但他爸就是他爸,會修鞋還是會修鞋,兒子能當總統但他爸不是總統(當父類類型的引用指向子類對象時,父類類型的引用可以直接調用父類中獨有的方法,不可以直接調用子類獨有的方法)
- 披着羊皮的狼,編譯父類,運行子類,在內存中子類其實是子類對象,靜態的被提成到類層級了(如果子類重寫了方法,靜態調父類的,非靜態調子類的)
類型轉換instanceof
- 是什麼:分爲自動類型轉換(子到父) 和 強制類型轉換(父到子)
- 爲什麼:多態不能直接使用子類中擴展的屬性和方法,但能通過強制類型轉換解決
抽象類abstract
- 是什麼:模板(抽象類主要指不能具體實例化的使用abstract關鍵字修飾的類並且擁有抽象方法的類)
- 爲什麼:(抽象方法沒有方法體,因此調用抽象方法是沒有意義的,爲了防止程序員不小心調用抽象方法,Java官方就規定抽象類不能new對象)
- 怎麼用:
- 就像知道學啥,但啥也不會幹,那我要你這對象幹啥,但是我可以問問你都學啥,然後自己去學(抽象類的實際意義不在於自身創建對象而在於被繼承,當一個類繼承抽象類之後必須重寫抽象方法,否則該類也變成抽象類)
- 不能和final共同修飾方法(重寫和不能重寫)
- 不能和static共同修飾(不能調用和可以調用)
- 不能和private共同修飾(不能繼承和重寫)
接口interface + implements
- 是什麼:沒有成員變量只有常量,只有抽象方法(特殊的抽象類)
- 爲什麼:你只有一個爸爸,但是你也想繼承你媽媽的基因(黃金既算金屬,又算貨幣,但是Java中只支持單繼承,讓黃金類同時實現金屬接口和貨幣接口,彌補不能多繼承的缺陷)
- 怎麼用:
- 類和接口:不同的東西implements,一樣的東西extends,有接口就是多的
- 抽象類和接口:abstract class可以有構造方法、成員方法、成員變量,增加方法可以不影響子類(因爲可以增加啥方法都行,但是接口只能加抽象方法,實現類必須重寫),jdk1.8之後接口可以有非抽象方法了,但必須default
- 接口類型的引用作爲方法的形參時,實參可以是實現接口的類的對象,和使用匿名內部類得到接口類型的引用
匿名內部類
- 是什麼:如果一段程序中需要創建一個類的對象(通常這個類需要實現某個接口或者繼承某個類),而且對象創建後這個類的價值也就不存在了,這個類可以不必命名,稱之爲匿名內部類
- 爲什麼:如果這個方法只調用一次,爲了它在寫一個類在方法區佔着一塊內存空間,有點浪費,所以就創建一個匿名內部類