java學習筆記-面向對象總結(二)

面向對象本質

標籤:核心總結


本人學習總結

this 本質

  • this的本質就是“創建好的對象的地址”! this不能用於static方法中。

構造方法:

  • 構造方法的作用是爲創建對象進行初始化工作,比如給成員變量賦值
  • 構造方法與類同名,不能書寫返回值類型
  • 構造方法的第一條語句如果是super(),則可以省略,該語句作用是調用父類無參數的構造方法
  • 調用順序:
    1、 先向上追溯到Object,然後在依次向下執行類的初始化和構造方法,直到當前子類爲止;
    2、 靜態初始化塊與上述相同;

類方法:

  • 在類方法中調用本類的類方法時可直接調用

繼承:

  • 子類繼承父類全部的屬性和方法(除了父類的構造方法),但不見的子類可以訪問父類的私有屬性和方法。

重寫:

  • 方法的重寫:
    1、“==” 同名同參
    2、“<=”返回值類型,聲明異常,子類的要小於父類
    3、">="訪問權限子類大於父等於父類

高內聚低耦合

高內聚:類的內部操作細節自己完成,不允許外部干涉

低耦合:儘量避免暴露少的方法細節給外部使用,儘量方便外部調用

訪問修飾符

在這裏插入圖片描述

對象的轉型

向上:(自動轉型)

fianl關鍵字作用:

  • 修飾變量不可修改
  • 修飾方法不能重寫,可以重載
  • 修飾類,類不可以被繼承

抽象類

  • 抽象類可以包括屬性、方法、構造方法
  • 抽象類只能被繼承
  • 必須被子類實現

爲什麼需要接口,接口和抽象類的區別

  • 接口就是比“抽象類”還“抽象”的“抽象類”,可以更加規範的對子類進行約束。全面地專業地實現了:規範和具體實現的分離。

  • 抽象類還提供某些具體實現,接口不提供任何實現,接口中所有方法都是抽象方法。接口是完全面向規範的,規定了一批類具有的公共方法規範。

  • 從接口的實現者角度看,接口定義了可以向外部提供的服務。

  • 接口是兩個模塊之間通信的標準,通信的規範。如果能把你要設計的模塊之間的接口定義好,就相當於完成了系統的設計大綱,剩下的就是添磚加瓦的具體實現了。大家在工作以後,做系統時往往就是使用“面向接口”的思想來設計系統。

  • 接口和實現類不是父子關係,是實現規則的關係。比如:我定義一個接口Runnable,Car實現它就能在地上跑,Train實現它也能在地上跑,飛機實現它也能在地上跑。就是說,如果它是交通工具,就一定能跑,但是一定要實現Runnable接口。

接口的本質:

  • 接口就是規範,定義的是一組規則,體現了現實世界中“如果你是…則必須能…”的思想。如果你是天使,則必須能飛。如果你是汽車,則必須能跑。如果你是好人,則必須能幹掉壞人;如果你是壞人,則必須欺負好人。

  • 接口的本質是契約,就像我們人間的法律一樣。制定好後大家都遵守。

  • 面向對象的精髓,是對對象的抽象,最能體現這一點的就是接口。爲什麼我們討論設計模式都只針對具備了抽象能力的語言(比如C++、Java、C#等),就是因爲設計模式所研究的,實際上就是如何合理的去抽象。

  • 接口和抽象類區別:
    1、普通類:具體實現
    2、抽象類:具體實現,規範(抽象方法)
    3、接口:規範(契約)

定義接口的詳細說明:

  • 只能是public或者默認。
  • 接口名:和類同級。
  • extends:可以多繼承
  • 常量:接口中的屬性只能是常量,總之是public static final 修飾,不寫也是。
  • 方法:接口中的方法只能是public abstract,省略的話,也是public abstract。

要點:

  1. 子類通過implements來實現接口中的規範。

  2. 接口不能創建實例,但是可用於聲明引用變量類型。

  3. 一個類實現了接口,必須實現接口中所有的方法,並且這些方法只能是public的。

  4. JDK1.7之前,接口中只能包含靜態常量、抽象方法,不能有普通屬性、構造方法、普通方法。

  5. JDK1.8後,接口中包含普通的靜態方法。

內部類:

  • 內部類可以使用public、default、protected 、private以及static修飾。而外部頂級類(我們以前接觸的類)只能使用public和default修飾。

注意:內部類是一個編譯時的概念,一蛋編譯成功,就會成爲兩個完全不同的兩個類。對於一個名爲Outer的外部類和其內部定義的名爲Inner的內部類。編譯完成後會出現Outer.class和Outer$Inner.class兩個類的字節碼文件。所以內部類是相對獨立的一種存在,其成員變量/方法名可以和外部類的相同。

內部類中可以聲明與外部類同名的屬性與方法

內部類的作用:

  1. 內部類提供了更好的封裝,只讓外部類直接訪問,不允許同一個包中的其他類訪問。
  2. 內部類可以直接訪問外部類的私有屬性,內部類被當成其外部類的成員,外部類不能訪問內部類的屬性。
  3. 接口只是解決了多重繼承的問題,而內部類使得多重繼承更加完整

內部類的使用場合:

  1. 由於內部類提供了更好的封裝特性,並且可以很方便的訪問外部類的屬性。所以,在只爲外部類提供服務的情況下可以優先考慮使用內部類。
  2. 使用內部類間接實現多繼承:每個內部類都能獨立地繼承一個類或者實現某些接口,所以無論外部類是否已經繼承了某個類或者實現了某些接口,對於內部類沒有任何影響。

內部類的分類:

  • 在Java中內部類主要分爲成員內部類(非靜態內部類、靜態內部類)、匿名內部類、局部內部類。

  • 成員內部類(可以使用private、default、protected、public任意進行修飾。 類文件:外部類$內部類.class)

  • 非靜態內部類(外部類裏使用非靜態內部類和平時使用其他類沒什麼不同)
    i. 非靜態內部類必須寄存在一個外部類對象裏。因此,如果有一個非靜態內部類對象那麼一定存在對應的外部類對象。非靜態內部類對象單獨屬於外部類的某個對象。
    ii. 非靜態內部類可以直接訪問外部類的成員,但是外部類不能直接訪問非靜態內部類成員。
    iii. 非靜態內部類不能有靜態方法、靜態屬性和靜態初始化塊。
    iv. 外部類的靜態方法、靜態代碼塊不能訪問非靜態內部類,包括不能使用非靜態內部類定義變量、創建實例。
    v. 成員變量訪問要點:

    1. 內部類裏方法的局部變量:變量名。
    2. 內部類屬性:this.變量名。
    3. 外部類屬性:外部類名.this.變量名。
  • 靜態內部類:
    i.定義方式:static class Inner{}
    ii. 當一個內部類對象存在,並不能保證外部類對象存在。因此靜態內部類的實例對象並不能訪問外部類的實例方法

內部類的訪問:

  1. 外部類定義內部類 new Inner();
  2. 外部類以外的地方引用內部類:(先創建外部類實例,然後使用該外部類實例創建內部類實例)
    Outer.Inner inner = new Outer().new Inner();

匿名內部類:

注意:

匿名內部類沒有修飾符
匿名內部類沒有構造方法,因爲他連名字都沒有何來構造方法。

局部內部類:

  • 定義在方法內部的,作用域只限於本方法,稱爲局部內部類。

  • 局部內部類的的使用主要是用來解決比較複雜的問題,想創建一個類來輔助我們的解決方案,到那時又不希望這個類是公共可用的,所以就產生了局部內部類。局部內部類和成員內部類一樣被編譯,只是它的作用域發生了改變,它只能在該方法中被使用,出了該方法就會失效。

  • 局部內部類在實際開發中應用很少。

編譯運行如下Java代碼,輸出結果是(D )–上轉型對象無法使用對象的新增方法,只能使用繼承或重寫的方法

class Base {
    public void method(){
        System.out.print ("Base method");
    }
}
class Child extends Base{   
    public void methodB(){
        System.out.print ("Child methodB");
    }
}
class Sample {
    public static void main(String[] args) {
        Base base= new Child();
        base.methodB();
    }
}

A.Base method

B.Child methodB

C.hild methodB

D.編譯錯誤

繼承條件下子類構造方法的執行過程。

(1)如果子類的構造方法中沒有通過super顯式調用父類的有參構造方法,也沒有通過this顯式調用自身的其他構造方法,則系統會默認先調用父類的無參構造方法。在這種情況下,寫不寫“super();”語句,效果是一樣的;

(2)如果子類的構造方法中通過super顯式調用父類的有參構造方法,那將執行父類相應構造方法,而不執行父類無參構造方法;

(3)如果子類的構造方法中通過this顯式調用自身的其他構造方法,在相應構造方法中應用以上兩條規則;

(4)特別注意的是,如果存在多級繼承關係,在創建一個子類對象時,以上規則會多次向更高一級父類應用,一直到執行頂級父類Object類的無參構造方法爲止;

Error和Exception區別:

  • 1、你開車遇到一隻豬,你剎車,這叫exception。
  • 2、你開車,車壞了,這叫error

NumberFormatException異常

public class Test7 {
    public static void main(String[] args) {
        String str = "1234abcf";
        System.out.println(Integer.parseInt(str));
    }
}

執行結果如圖6-8所示:

在這裏插入圖片描述

數字格式化異常的解決,可以引入正則表達式判斷是否爲數字:

import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class Test7 {
    public static void main(String[] args) {
        String str = "1234abcf";
        Pattern p = Pattern.compile("^\\d+$");
        Matcher m = p.matcher(str);
        if (m.matches()) { // 如果str匹配代表數字的正則表達式,纔會轉換
            System.out.println(Integer.parseInt(str));
        }
    }
}

已覈查的異常CheckedException

  • 所有不是RuntimeException的異常,統稱爲Checked Exception,又被稱爲“已檢查異常”,如IOException、SQLException等以及用戶自定義的Exception異常。 這類異常在編譯時就必須做出處理,否則無法通過編譯。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章