1. 程式人生 > 資訊 >蔚來李斌:買蔚來是參與美好,車主陪著克服困難有價值

蔚來李斌:買蔚來是參與美好,車主陪著克服困難有價值

1. 面向物件基本概念

本質是一種抽象的程式設計思維,是思考問題的方式。
先整體,再區域性;
先抽象,再具體;
先目的,再方法。

2. 類與物件

類:類是一種分類,一個模板。它描述一類物件的行為和狀態,是一組具有相同特性(屬性)與行為(方法)的事物集合。
物件:是類的一個例項,有個體的特徵。

3. 類和物件的定義

類的定義:
訪問修飾符 class 類名 {}
物件的定義及賦初值:
類名稱 物件名稱 = new 類名稱();
訪問物件中的屬性:物件.屬性
呼叫物件的方法:物件.方法()

4. 物件的記憶體分析

引用型別的物件,儲存的是一個引用地址,而不是直接儲存具體物件。物件中的屬性和方法儲存在引用地址指向的堆記憶體中。

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
(1)new關鍵字:表示向記憶體申請空間,也表示例項化一個物件,建立一個物件。
(2)一個物件在記憶體中的大小,由該物件的所有屬性所佔的記憶體大小的總和。引用型別變數在32位系統上佔4個位元組,在64位系統上佔8個位元組。加上而外的物件隱性資料所佔的大小。
(3)相同的型別才可以賦值
(4)不同的引用,指向同一個物件,任何一個引用改變物件的值,其它引用都會反映出來。
(5)程式設計時要注意的問題,在確定不使用物件時,要儘早釋放物件:引用=null
(6)當一個堆中的物件沒有被任何引用變數所指向時,該物件會被JVM 的 GC 程式認為是垃圾物件,從而被回收

5. 封裝

封裝性是面向物件思想的三大特徵之一,思路是隱藏實現細節,僅對外提供訪問介面。

封裝的好處:模組化、資訊隱藏、程式碼重用、易於除錯、安全性高。

未封裝:

public class Person {
    public String name;
    public int age = 25;
}

訪問:

public class Test {
    public static void main(String[] args) {
        Person person = new Person();
        person.name = "Randy";
        System.out.println(person.age);
    }
}

封裝後:

public class Person {
    private String name;
    private int age = 25;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

訪問:

public class Test {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("Randy");
        System.out.println(person.getAge());
    }
}

6. 構造方法

	public Person() {
    }

    public Person(String name) {
        this.name = name;
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

(1)構造方法名稱與類名相同,沒有返回值宣告(包括 void);
(2)構造方法用於初始化資料(屬性);
(3)如果類中沒有顯式構造方法,那麼會預設一個隱式的公有無參構造方法;
(4)如果類中有顯式的構造方法,那麼預設構造方法將失效;
(5)如果有顯式的構造方法,還想保留預設構造方法,需要顯示的寫出來;
(6)構造方法可以有多個,但引數不一樣,稱為構造方法的過載;
(7)在構造方法中呼叫另一個構造方法,使用this(…),該句程式碼必須在第一句;
(8)構造方法之間的呼叫,必須要有出口;
(9)給物件初始化資料可以使用構造方法或setter方法,通常情況下,兩者都會保留;
(10)一個好的程式設計習慣是要保留預設的構造方法(為了方便一些框架程式碼使用反射來建立物件);
(11)可以用private訪問修飾符使得構造方法私有化。

7. this關鍵字

this關鍵字指向的是當前物件的引用
呼叫類中的屬性:this.變數名稱,訪問類中的成員變數,用來區分成員變數和區域性變數(重名問題);
呼叫類中的方法:this.方法名稱,用來訪問本類的成員方法;
呼叫類構造方法:this();訪問本類的構造方法。
注意:

  1. this() 不能使用在普通方法中,只能寫在構造方法中
  2. 必須在構造方法中的第一條語句中

8. static關鍵字

static(靜態)關鍵字的作用:方便在沒有建立物件的情況下來進行呼叫(方法/變數)可以用於修飾一個成員屬性、一個方法、一個程式碼塊或一個內部類。
宣告為靜態的方法有以下幾條限制:
靜態方法不能呼叫非靜態的方法;但反過來,非靜態方法可以呼叫靜態方法。
靜態方法不能訪問非靜態的屬性;
靜態方法中不能以任何方式引用this或super。

9. 繼承

繼承是面向物件三大特徵之一。
繼承是以已存在的類作為父類,使用父類的定義作為基礎建立子類,子類的定義可以增加新的資料或新的功能,也可以用父類的功能。

被繼承的類稱為父類(超類),繼承父類的類稱為子類(派生類)。
通過繼承可以實現程式碼重用。
子類繼承父類的所有屬性和普通方法。
子類可以擁有自己的屬性和方法,即子類可以對父類進行擴充套件。
子類可以用自己的方式實現(重寫)父類的方法。
父類的構造方法可以被子類通過super()呼叫,但不能被繼承。
語法:[訪問許可權] class 子類名 extends 父類名{
  類體定義;
}

public class Programmer extends Person {
}

訪問:

public class Test {
    public static void main(String[] args) {
        Programmer programmer = new Programmer();
        System.out.println(programmer.getAge());
    }
}

10. 方法重寫

在Java中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時子類想對父類的方法做出一些修改,這就需要採用方法的重寫。又稱方法覆蓋。
在子類和父類中,重寫方法後,在呼叫時,以建立的物件型別為準,確定呼叫的是誰的方法。

重寫特性:
a、發生在繼承的子類和父類中,方法重寫涉及的兩個方法返回值、方法名、引數列表必須完全一致(子類重寫父類的方法);
b、子類丟擲的異常不能超過父類相應方法丟擲的異常(子類異常不能大於父類異常);
c、子類方法的訪問級別不能低於父類相應方法的訪問級別(子類訪問級別不能低於父類訪問級別);
d、父類中的方法若使用private、static、final任意修飾符修飾,那麼,不能被子類重寫。

11. super關鍵字

可以理解為對父類的引用,使用super來呼叫父類的屬性,方法,和構造方法

  1. 使用super.屬性呼叫父類中的屬性,可以從父類例項處獲得資訊。
  2. 使用super.方法()呼叫父類中的方法,可以委託父類物件幫助完成某件事情。
  3. 使用super()呼叫父類中的構造方法,必須在子類構造方法的第一條語句,呼叫父類中相應的構造方法,若不顯示的寫出來,預設呼叫父類的無參構造方法。

12. final關鍵字

  1. 使用final關鍵字宣告一個常量。若為基本資料型別,則該常量的值在初始化之後不能被修改;若為引用資料型別,則引用的地址不能被修改,但引用所指向的物件中的屬性是可以變化的。
  2. 使用final關鍵字宣告一個方法。該方法可以被子類繼承,但不能被重寫。
  3. 使用final關鍵字宣告一個類。該類不能被繼承。

13. 抽象類

抽象類的基本概念
(1)抽象類是對一系列看上去不同,但是本質上相同的具體概念的抽象
(2)使用abstract關鍵字宣告的類為抽象類。
抽象類的規則:
a、抽象類可以沒有抽象方法,有抽象方法的類必須是抽象類
b、非抽象類繼承抽象類必須實現所有抽象方法
c、抽象類可以繼承抽象類,可以不實現父類抽象方法。
d、抽象類可以有方法實現和屬性
e、抽象類不能被例項化
f、抽象類不能宣告為final
g、抽象類可以有構造方法

14. 介面

介面的使用規則:
(1)使用interface關鍵字定義介面
(2)在一個介面中,只能定義常量、抽象方法,JDK1.8後可以定義預設的實現方法
(3)介面可以繼承多個介面:extends xxx,xxx
(4)一個具體類實現介面使用implements關鍵字
(5)一個類可以實現多個介面
(6)抽象類實現介面可以不實現介面的方法
(7)在介面中定義的方法沒有宣告 訪問修飾符,預設為public
(8)介面不能有構造方法
(9)介面不能被例項化
Java8之後,介面中定義的方法如果用default或static關鍵字修飾,則可以有方法體。
default方法屬於例項化的物件,static方法屬於介面,不會被繼承。

介面和抽象類的區別:

  1. 介面強調功能實現,而抽象類強調從屬關係;
  2. 抽象類只能被繼承,不能被例項化;介面可以通過實現所有內部定義的抽象方法而例項化;
  3. 介面中只能定義常量和抽象方法,抽象類中允許定義變數和實現方法;
  4. 一個類可以實現多個介面,而對抽象類的繼承必須符合繼承規則(只能繼承一個類);

15. 多型

多型是面向物件三大特徵之一。
多型就是指程式中定義的引用變數所指向的具體型別和通過該引用變數發出的方法呼叫在程式設計時並不確定,而是在程式執行期間才確定,即一個引用變數倒底會指向哪個類的例項物件,該引用變數發出的方法呼叫到底是哪個類中實現的方法,必須在由程式執行期間才能決定。因為在程式執行時才確定具體的類,這樣,不用修改源程式程式碼,就可以讓引用變數繫結到各種不同的類實現上,從而導致該引用呼叫的具體方法隨之改變,即不修改程式程式碼就可以改變程式執行時所繫結的具體程式碼,讓程式可以選擇多個執行狀態,這就是多型性。

a、方法的過載與重寫就是方法的多型性表現
b、多個子類就是父類中的多種形態
c、父類引用可以指向子類物件,自動轉換
d、子類物件指向父類引用需要強制轉換(注意:型別不對會報異常)
e、在實際開發中儘量使用父類引用(更利於擴充套件)

java實現多型有三個必要條件:繼承、重寫、向上轉型。
繼承:在多型中必須存在有繼承關係的子類和父類。
重寫:子類對父類中某些方法進行重新定義,在呼叫這些方法時就會呼叫子類的方法。
向上轉型:在多型使用中需要將子類的引用賦給父類物件,如此該引用可以呼叫父類方法或重寫後的不同子類方法。

基於繼承實現的多型
繼承是通過重寫父類的同一方法的幾個不同子類來體現的
對於引用子類的父類型別,在處理該引用時,它適用於繼承該父類的所有子類,子類物件的不同,對方法的實現也就不同,
執行相同動作產生的行為也就不同。

基於介面實現的多型
指向介面的引用必須是指定這實現了該介面的一個類的例項程式,在執行時,根據物件引用的實際型別來執行對應的方法。