瘋狂的java進階之01搬磚從磚頭(對象)開始

搬磚也要搬的不一般。

一、前言

歲月匆匆而來,時光匆匆而去。轉眼間,做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象的簡單理解。
若有問題,歡迎指正、留言,歡迎大家一起討論。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容