搬磚也要搬的不一般扭屁。
一算谈、前言
歲月匆匆而來,時光匆匆而去料滥。轉(zhuǎn)眼間然眼,做java開發(fā)已有3、4年的時間了葵腹,期間做過后臺開發(fā)高每,寫過前端web屿岂,而最主要的則是做android開發(fā)。語言也接觸過好多種鲸匿,什么Python爷怀、Kotlin、swift晒骇、Js霉撵、C等等,而最讓我迷戀的還是個java洪囤。
java的優(yōu)點我便不多說了徒坡,網(wǎng)上有太多的解釋。而本文則是我三年來對java的理解瘤缩,以及對網(wǎng)上收集資料的總結(jié)喇完,是最java進(jìn)階的知識整理。
進(jìn)入編程的第四年剥啤,不應(yīng)該僅僅處于java的使用锦溪,而java的理解才是一道不得不邁的一道坎。
二府怯、java第一步:啥是面向?qū)ο?/h2>
2種主流的開發(fā)方法:結(jié)構(gòu)化程序設(shè)計和面向?qū)ο蟪绦蛟O(shè)計刻诊;
* 結(jié)構(gòu)化程序設(shè)計:
理解:
2種主流的開發(fā)方法:結(jié)構(gòu)化程序設(shè)計和面向?qū)ο蟪绦蛟O(shè)計刻诊;
結(jié)構(gòu)化程序設(shè)計就是將程序功能,進(jìn)行一層一層的剝離牺丙,進(jìn)行功能細(xì)分则涯。一個細(xì)分功能就是一個函數(shù),然后再由上層函數(shù)進(jìn)行調(diào)用冲簿,在函數(shù)的層層調(diào)用之后粟判,最終由主函數(shù)進(jìn)行調(diào)用,實現(xiàn)完整的功能峦剔。
原則:
自頂向下档礁、逐步求精、模塊化吝沫。
* 面向?qū)ο蟪绦蛟O(shè)計:
理解:
1.什么是對象呻澜?
對象是實際存在的該類事物的個體,即對象是類的實例化野舶,現(xiàn)實中的萬物都可以理解為一個對象易迹;
如:一輛汽車,將其抽象為具體的屬性平道,即速度睹欲、大小、顏色、座位數(shù)等屬性窘疮,以及具體的行為袋哼,即加速、剎車闸衫、載客等行為涛贯。
2.什么是對象?
類是具有共同屬性和行為的一組對象的抽象蔚出。類是對象的抽象表現(xiàn)弟翘,是對象在代碼中的具體表現(xiàn)形式;它必須具有屬性和行為骄酗,才是一個完整的對象稀余。
3.對象就是類?
對象是類的實例化趋翻,而類是對象的抽象睛琳;
類是面向?qū)ο缶幊讨械淖钚〉膯卧穷惒⒉灰欢ㄊ且粋€對象踏烙,而類只是對象的一種表現(xiàn)形式师骗;
對象可以是一個類,也可以是一個函數(shù)讨惩,或者多個類的集合辟癌,即萬物皆可為對象;
而有些類在嚴(yán)格的意義上來講荐捻,卻并不是一個對象愿待;
如: 一個僅僅包含常量的類,就不是一個對象靴患。它僅僅具有屬性缺不具有行為。
4.面向?qū)ο蟮奶卣?/strong>
封裝要出、繼承鸳君、多態(tài)
- 封裝:
是把對象的屬性和行為結(jié)合成一個整體,對細(xì)節(jié)隱藏患蹂,對操作開放或颊。
如:一臺智能手機(jī),你不要關(guān)心手機(jī)內(nèi)部有什么传于?怎么運(yùn)行的程序囱挑?你只要點亮屏幕,就可以實現(xiàn)打電話沼溜、玩游戲平挑、聊天等功能。
java的封裝由權(quán)限修飾符:private、public通熄、protected唆涝、default實現(xiàn);
- 繼承:
是對一系列對象的公共屬性和行為進(jìn)行提取封裝唇辨,而后由其他類繼承廊酣,并實現(xiàn)自己獨(dú)有的屬性或行為。
父類獨(dú)立于子類赏枚,而子類則依賴于父類亡驰。
如:水果是一個父類,其具有酸饿幅、甜等屬性凡辱,也具有吃、腐爛等行為诫睬;而橘子也是水果的一種煞茫,它不僅具有父類的屬性,同時還具有剝皮的特殊行為摄凡。因此续徽,橘子是水果的一個子類,它實現(xiàn)了父類的所有方法亲澡,但要獨(dú)立實現(xiàn)剝皮的行為钦扭。
簡單說,沒有橘子床绪,水果依舊還是水果客情。但是,橘子如果不能吃癞己,那他就一定不是水果痹雅。
java的繼承使用extends或implements進(jìn)行標(biāo)記绩社,通過override(重寫)標(biāo)記父類的行為愉耙,通過super實現(xiàn)父類的方法猜谚。
- 多態(tài):
是對象的同種行為的不同表現(xiàn)形式。
多態(tài)僅僅針對行為祭隔,與屬性無關(guān)。
java的多態(tài)可以劃分為同一個類中的多態(tài)(重載),以及父類與子類間的多態(tài)(重寫)
如:‘吃’這個行為桩撮【铣剩可以表現(xiàn)為旱爆,吃飯、吃水果、吃茶等等。
java的多態(tài),由重寫(override)和重載(overload)來實現(xiàn);
三安岂、對象的番外篇
1.權(quán)限修飾符
修飾符 | 類內(nèi)部 | 本包 | 子類 | 外部包 |
---|---|---|---|---|
public | 可訪問 | 可訪問 | 可訪問 | 可訪問 |
protected | 可訪問 | 可訪問 | 可訪問 | |
default | 可訪問 | 可訪問 | ||
private | 可訪問 |
備注:??沒有填寫的內(nèi)容為不可訪問。
問題:被protected標(biāo)注的外部包的子類是否可以訪問淑蔚?
答:可以訪問的带迟,類優(yōu)先與包蝇摸,而被protected標(biāo)注的變量,在子類中是可以訪問的。
2.重寫和重載的對比
- 什么是重寫?
重寫父類與子類之間的多態(tài)性,是子類對父類的方法重新定義吵瞻,可以實現(xiàn)父類的方法葛菇,也可以不實現(xiàn)父類的方法。
即,方法名卿泽、參數(shù)與返回值完全相同覆致,且子類方法的訪問權(quán)限不可以小于類汰蜘;
- 什么是重載?
重載是在同一個類中比被,相同的行為的不同表現(xiàn)形式色难。
即,方法名相同尺迂,參數(shù)的個數(shù)或類型不同笤妙,返回值可以相同,也可以不同噪裕。
- 概述
重寫與重載是java多態(tài)性的具體表現(xiàn)形式.
??使用的原則是:相同的行為蹲盘,表現(xiàn)形式不同時使用。
3.普通類膳音、抽象類和接口的區(qū)別
普通類:
是具有一系列屬性和行為的類召衔,它可以被實例化成一個對象。抽象類:
是普通類的抽象形式严蓖,它僅僅代表一個分類或抽象概念薄嫡,它的實例化沒有任何意義,因此不希望它被實例化颗胡。即毫深,抽象類并不是一個完整的對象。
特征:
1.抽象類使用abstract class對類名進(jìn)行標(biāo)記毒姨;
2.抽象類可以有抽象方法哑蔫,也可以沒有抽象方法,其使用 abstract標(biāo)記弧呐;
3.抽象類不可以被實例化闸迷;
4.抽象類可以有普通方法,并實現(xiàn)具體行為俘枫。
5.抽象類的子類腥沽,必須實現(xiàn)父類的抽象方法,或者子類也是抽象類鸠蚪。
6.抽象類通過extends使用今阳,一個類只能繼承一個抽象類。接口:
接口是特殊的抽象方法茅信,在接口中所有的方法都是抽象方法盾舌。
特征:
1.接口使用interface對類名進(jìn)行標(biāo)記;
2.接口中全部都是抽象方法蘸鲸,不可以寫方法的實現(xiàn)妖谴,由子類實現(xiàn)具體的行為;
3.接口不可以被實例化酌摇;
4.接口通過implements使用膝舅,一個類可以實現(xiàn)多個接口。接口和抽象類的之間的區(qū)別妙痹。
1.變量铸史,抽象類可以有實例變量,而接口不能擁有實例變量怯伊,接口中的變量都是靜態(tài)的常量琳轿。
2.方法,抽象類中可以有非抽象方法耿芹,而接口中只能擁有抽象方法崭篡。
3.接口可以多繼承,抽象類只能繼承一個吧秕。接口和抽象類的使用場景
在考慮使用抽象類還是使用接口時琉闪,應(yīng)該從以下兩點出發(fā)。
1.父類中不需要實現(xiàn)具體的功能砸彬,使用接口颠毙;
2.子類需要繼承多個父類斯入,才能實現(xiàn)完整的功能時,使用接口蛀蜜;
其他情況刻两,一般會使用抽象類。
參考鏈接
4.類的初始化流程
父類:
public class ClassA {
//構(gòu)造方法
ClassA() {
System.out.println("父類-構(gòu)造方法");
}
//非靜態(tài)代碼塊
{
System.out.println("父類-非靜態(tài)代碼塊");
}
//靜態(tài)代碼塊
static {
System.out.println("父類-靜態(tài)代碼塊");
}
//靜態(tài)方法
public static void mothedA() {
System.out.println("父類-靜態(tài)方法");
}
}
子類:
public class ClassB extends ClassA {
//構(gòu)造方法
ClassB() {
System.out.println("子類-構(gòu)造方法");
}
//非靜態(tài)代碼塊
{
System.out.println("子類-非靜態(tài)代碼塊");
}
//靜態(tài)代碼塊
static {
System.out.println("子類-靜態(tài)代碼塊");
}
//靜態(tài)方法
public static void mothedB() {
System.out.println("子類-靜態(tài)方法");
}
//靜態(tài)方法
public static void mothedA() {
System.out.println("父類-靜態(tài)方法");
}
}
備注:
1.父類的方法優(yōu)先與子類的方法滴某;
2.同一個類中的非靜態(tài)代碼塊與構(gòu)造方法先后執(zhí)行磅摹,執(zhí)行完成后才會執(zhí)行到子類;
3.若直接調(diào)用靜態(tài)方法霎奢,優(yōu)先于非靜態(tài)代碼塊户誓。
調(diào)用方式 | 執(zhí)行順序 |
---|---|
new ClassA(); | 父類-靜態(tài)代碼塊 子類-靜態(tài)代碼塊 父類-非靜態(tài)代碼塊 父類-構(gòu)造方法 |
new ClassB(); | 父類-靜態(tài)代碼塊 子類-靜態(tài)代碼塊 父類-非靜態(tài)代碼塊 父類-構(gòu)造方法 子類-非靜態(tài)代碼塊 子類-構(gòu)造方法 |
ClassA.mothedA(); | 父類-靜態(tài)代碼塊 子類-靜態(tài)代碼塊 父類-靜態(tài)方法 |
ClassB.mothedA(); | 父類-靜態(tài)代碼塊 子類-靜態(tài)代碼塊 父類-靜態(tài)方法 |
ClassB.mothedB(); | 父類-靜態(tài)代碼塊 子類-靜態(tài)代碼塊 子類-靜態(tài)方法 |
總結(jié):
1.直接調(diào)用靜態(tài)方法,即沒有實例化幕侠,不會運(yùn)行非靜態(tài)代碼塊和構(gòu)造方法帝美;
2.同一個類中的非靜態(tài)代碼塊與構(gòu)造方法先后執(zhí)行,執(zhí)行完成后才會執(zhí)行到子類橙依;
3.相同方法证舟,父類優(yōu)先于子類;
以上是我對java象的簡單理解窗骑。
若有問題女责,歡迎指正、留言创译,歡迎大家一起討論抵知。