搬磚也要搬的不一般。
一、前言
歲月匆匆而來,時光匆匆而去。轉眼間,做java開發已有3、4年的時間了,期間做過后臺開發,寫過前端web,而最主要的則是做android開發。語言也接觸過好多種,什么Python、Kotlin、swift、Js、C等等,而最讓我迷戀的還是個java。
java的優點我便不多說了,網上有太多的解釋。而本文則是我三年來對java的理解,以及對網上收集資料的總結,是最java進階的知識整理。
進入編程的第四年,不應該僅僅處于java的使用,而java的理解才是一道不得不邁的一道坎。
二、java第一步:啥是面向對象
2種主流的開發方法:結構化程序設計和面向對象程序設計;
* 結構化程序設計:
理解:
結構化程序設計就是將程序功能,進行一層一層的剝離,進行功能細分。一個細分功能就是一個函數,然后再由上層函數進行調用,在函數的層層調用之后,最終由主函數進行調用,實現完整的功能。
原則:
自頂向下、逐步求精、模塊化。
* 面向對象程序設計:
理解:
1.什么是對象?
對象是實際存在的該類事物的個體,即對象是類的實例化,現實中的萬物都可以理解為一個對象;
如:一輛汽車,將其抽象為具體的屬性,即速度、大小、顏色、座位數等屬性,以及具體的行為,即加速、剎車、載客等行為。
2.什么是對象?
類是具有共同屬性和行為的一組對象的抽象。類是對象的抽象表現,是對象在代碼中的具體表現形式;它必須具有屬性和行為,才是一個完整的對象。
3.對象就是類?
對象是類的實例化,而類是對象的抽象;
類是面向對象編程中的最小的單元,但是類并不一定是一個對象,而類只是對象的一種表現形式;
對象可以是一個類,也可以是一個函數,或者多個類的集合,即萬物皆可為對象;
而有些類在嚴格的意義上來講,卻并不是一個對象;
如: 一個僅僅包含常量的類,就不是一個對象。它僅僅具有屬性缺不具有行為。
4.面向對象的特征
封裝、繼承、多態
- 封裝:
是把對象的屬性和行為結合成一個整體,對細節隱藏,對操作開放。
如:一臺智能手機,你不要關心手機內部有什么?怎么運行的程序?你只要點亮屏幕,就可以實現打電話、玩游戲、聊天等功能。
java的封裝由權限修飾符:private、public、protected、default實現;
- 繼承:
是對一系列對象的公共屬性和行為進行提取封裝,而后由其他類繼承,并實現自己獨有的屬性或行為。
父類獨立于子類,而子類則依賴于父類。
如:水果是一個父類,其具有酸、甜等屬性,也具有吃、腐爛等行為;而橘子也是水果的一種,它不僅具有父類的屬性,同時還具有剝皮的特殊行為。因此,橘子是水果的一個子類,它實現了父類的所有方法,但要獨立實現剝皮的行為。
簡單說,沒有橘子,水果依舊還是水果。但是,橘子如果不能吃,那他就一定不是水果。
java的繼承使用extends或implements進行標記,通過override(重寫)標記父類的行為,通過super實現父類的方法。
- 多態:
是對象的同種行為的不同表現形式。
多態僅僅針對行為,與屬性無關。
java的多態可以劃分為同一個類中的多態(重載),以及父類與子類間的多態(重寫)
如:‘吃’這個行為。可以表現為,吃飯、吃水果、吃茶等等。
java的多態,由重寫(override)和重載(overload)來實現;
三、對象的番外篇
1.權限修飾符
修飾符 | 類內部 | 本包 | 子類 | 外部包 |
---|---|---|---|---|
public | 可訪問 | 可訪問 | 可訪問 | 可訪問 |
protected | 可訪問 | 可訪問 | 可訪問 | |
default | 可訪問 | 可訪問 | ||
private | 可訪問 |
備注:??沒有填寫的內容為不可訪問。
問題:被protected標注的外部包的子類是否可以訪問?
答:可以訪問的,類優先與包,而被protected標注的變量,在子類中是可以訪問的。
2.重寫和重載的對比
- 什么是重寫?
重寫父類與子類之間的多態性,是子類對父類的方法重新定義,可以實現父類的方法,也可以不實現父類的方法。
即,方法名、參數與返回值完全相同,且子類方法的訪問權限不可以小于類;
- 什么是重載?
重載是在同一個類中,相同的行為的不同表現形式。
即,方法名相同,參數的個數或類型不同,返回值可以相同,也可以不同。
- 概述
重寫與重載是java多態性的具體表現形式.
??使用的原則是:相同的行為,表現形式不同時使用。
3.普通類、抽象類和接口的區別
普通類:
是具有一系列屬性和行為的類,它可以被實例化成一個對象。抽象類:
是普通類的抽象形式,它僅僅代表一個分類或抽象概念,它的實例化沒有任何意義,因此不希望它被實例化。即,抽象類并不是一個完整的對象。
特征:
1.抽象類使用abstract class對類名進行標記;
2.抽象類可以有抽象方法,也可以沒有抽象方法,其使用 abstract標記;
3.抽象類不可以被實例化;
4.抽象類可以有普通方法,并實現具體行為。
5.抽象類的子類,必須實現父類的抽象方法,或者子類也是抽象類。
6.抽象類通過extends使用,一個類只能繼承一個抽象類。接口:
接口是特殊的抽象方法,在接口中所有的方法都是抽象方法。
特征:
1.接口使用interface對類名進行標記;
2.接口中全部都是抽象方法,不可以寫方法的實現,由子類實現具體的行為;
3.接口不可以被實例化;
4.接口通過implements使用,一個類可以實現多個接口。接口和抽象類的之間的區別。
1.變量,抽象類可以有實例變量,而接口不能擁有實例變量,接口中的變量都是靜態的常量。
2.方法,抽象類中可以有非抽象方法,而接口中只能擁有抽象方法。
3.接口可以多繼承,抽象類只能繼承一個。接口和抽象類的使用場景
在考慮使用抽象類還是使用接口時,應該從以下兩點出發。
1.父類中不需要實現具體的功能,使用接口;
2.子類需要繼承多個父類,才能實現完整的功能時,使用接口;
其他情況,一般會使用抽象類。
參考鏈接
4.類的初始化流程
父類:
public class ClassA {
//構造方法
ClassA() {
System.out.println("父類-構造方法");
}
//非靜態代碼塊
{
System.out.println("父類-非靜態代碼塊");
}
//靜態代碼塊
static {
System.out.println("父類-靜態代碼塊");
}
//靜態方法
public static void mothedA() {
System.out.println("父類-靜態方法");
}
}
子類:
public class ClassB extends ClassA {
//構造方法
ClassB() {
System.out.println("子類-構造方法");
}
//非靜態代碼塊
{
System.out.println("子類-非靜態代碼塊");
}
//靜態代碼塊
static {
System.out.println("子類-靜態代碼塊");
}
//靜態方法
public static void mothedB() {
System.out.println("子類-靜態方法");
}
//靜態方法
public static void mothedA() {
System.out.println("父類-靜態方法");
}
}
備注:
1.父類的方法優先與子類的方法;
2.同一個類中的非靜態代碼塊與構造方法先后執行,執行完成后才會執行到子類;
3.若直接調用靜態方法,優先于非靜態代碼塊。
調用方式 | 執行順序 |
---|---|
new ClassA(); | 父類-靜態代碼塊 子類-靜態代碼塊 父類-非靜態代碼塊 父類-構造方法 |
new ClassB(); | 父類-靜態代碼塊 子類-靜態代碼塊 父類-非靜態代碼塊 父類-構造方法 子類-非靜態代碼塊 子類-構造方法 |
ClassA.mothedA(); | 父類-靜態代碼塊 子類-靜態代碼塊 父類-靜態方法 |
ClassB.mothedA(); | 父類-靜態代碼塊 子類-靜態代碼塊 父類-靜態方法 |
ClassB.mothedB(); | 父類-靜態代碼塊 子類-靜態代碼塊 子類-靜態方法 |
總結:
1.直接調用靜態方法,即沒有實例化,不會運行非靜態代碼塊和構造方法;
2.同一個類中的非靜態代碼塊與構造方法先后執行,執行完成后才會執行到子類;
3.相同方法,父類優先于子類;
以上是我對java象的簡單理解。
若有問題,歡迎指正、留言,歡迎大家一起討論。