學習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語言基礎的程序猿們更多的幫助。如果喜歡我的文章記得關注我并給我點個贊哦~