java學習筆記(基礎篇)—面向對象編程之封裝、繼承、多態

一. OOP中的基本概念

Java的編程語言是面向對象的,採用這種語言進行編程稱爲面向對象編程(Object-Oriented Programming, OOP), 它容許設計者將面向對象設計實現爲一個可運行的系統。Java的編程單位是類,對象最後要經過類進行實例化(即「建立」)。面向對象編程有三個特性:封裝,繼承,多態java

封裝:對類中的屬性和方法的具體實現進行封裝(隱藏),外界不可見
繼承:繼承父類中的屬性和方法 extends
      class 子類 extends 父類
      都是單繼承
多態:同一個領域中(繼承同一個類或者實現同一個接口)的不一樣對象調用相同的方     法表現不一樣。

二. 封裝

1.類和對象

類是具備相同屬性和行爲的對象的集合。對象是類的具體化,對象是惟一的。類是具備一組相同屬性和行爲的抽象化模板,類是對象的抽象。編程

對象是對問題領域中事件的抽象。對象具備如下特性:

1) 萬物皆爲對象。問題領域中的實體和概念均可以抽象爲對象。例如學生,成績單、教師、課和教室。
2) 每一個對象都是唯一的。
3) 對象具備屬性和行爲。
4) 對象具備狀態。狀態是指某個瞬間對象的各個屬性的取值。對象的某些行爲會改變對象自身的狀態,即屬性的取值。編程語言

5) 每一個對象都是某個類的實例。小張和小王都屬於學生類、中國和美國都屬於國家類、中文和英文都屬於語言類。
同一個類的全部實例都有相同屬性,但屬性取值不一事實上相同,可是它們的狀態不必定相同。
例如:小張和小王都屬於學生類,都有姓名、性別、年齡、身高和體重這些屬性,可是他們的屬性取值不一樣。同一個類的全部實例都有相同行爲,意味着它們具備一些相同的功能。ide

類是一組具備相同屬性和行爲對象的模板。面向對象編程的主要任務就是定義對象模型中的各個類:

1) 類是一種類型:是引用類型;
2) 類是元數據:描述數據的數據,數據在面向對象領域裏以對象的形式存在,類是對象共有屬性和方法的抽象描述。oop

2. 定義方法形式

格式: 修飾符 返回類型 方法名(參數列表)異常拋出類型{方法體}this

參數列表:傳入數據
返回值類型:傳出數據的類型沒有返回值,必須寫void
修飾符:訪問修飾符public,private或者static,final。沒有優先級設計

public int getValue(int value){
    if(value>10){
        return value+10;
    }
}

2. 參數傳遞:實參傳遞給形參

形參:方法聲明時的參數
實參:方法調用時傳遞的參數
1)值傳遞:傳遞的是數值
參數是基本數據類型的時候,採用值傳遞
2)地址傳遞:傳遞的是地址
參數是引用數據類型的時候,採用地址傳遞code

3. this關鍵字: 當前對象

​ 1)區分實例變量和局部變量
​ this.name=name;
​ 2)調用本類的構造器
​ this(參數列表);
​ 3)調用本類的方法
​ this.方法名()對象

4. 數據隱藏

好處:防止外界進行非法修改
如何實現:1)數據的訪問修飾符private
2)提供統一的操做(屬性的set,get)
數據隱藏就是封裝的一個方面,封裝的另外一個方面隱藏方法。繼承

5. 方法重載

對於類的方法(包括從父類中繼承的方法), 若是有兩個方法的方法名相同,但參數不一致,那麼能夠說,一個方法是另外一個方法的重載方法。這種現象叫重載。
方法的重載知足的條件:
1)在同一個類中
2)方法名相同
3)參數列表不相同
a)參數個數不相同 ||
b)參數類型不相同 ||
c)參數列表的順序不相同
4)返回值類型能夠不一樣
5)訪問修飾符能夠不一樣

注意:在一個類中不容許定義兩個方法名相同,而且參數簽名也徹底相同的方法。由於假如存在這樣的兩個方法,Java虛擬機在運行時就沒法決定到底執行哪一個方法。參數簽名是指參數的類型、個數和順序。

6. 建立和初始化對象(new)

public class Person{
    private String name="briup";
}

Person p=new Person();

1)在棧區開闢空間保存對象的引用
2)在堆區開闢空間保存對象自己的數據
3)堆區的地址賦值給棧區的對象的引用
4)爲對象的屬性進行默認初始化(系統完成)
5)爲對象的屬性進行顯示初始化
6)調用普通代碼塊{}
7)調用構造器

7. 構造方法

構造器:根據用戶需求傳入數據, 而後根據傳入數據對屬性進行初始化。
做用:爲屬性進行初始化
1)方法名和類名相同
2)沒有返回值類型
3)構造的重載(根據不一樣的狀況調用不一樣的構造器進行相應的初始化)調用本類的 構造器:this(參數列表),必須放在方法的第一行。
4)系統會提供一個無參的構造器,
可是若是本類實現了其餘的構造器,系統提供的無參構造器失效。

public class Test{
  public Test(){}
  public void Test(){} //普通的方法
}

二:繼承

好處:代碼複用,簡化編程

代碼複用用在哪些地方:

1)複用父類的屬性
2)複用父類的方法(直接調用父類的方法)
3)重寫父類的方法
實現:class 子類 extends 父類

java是單繼承,但也不是絕對的單繼承,java中有接口,一個接口能夠繼承多個接口,一個類也能夠實現多個接口,具體的內容會在接口那篇文章中說明。

關係:子類 is a 父類 或者 子類 is a like 父類

class Student extends Person
      student is a Person
      Person is a Student(error)

子類繼承父類哪些:

1)構造器不能繼承

2)方法和屬性所有繼承,private聲明的能夠繼承,但子類不能使用,只有父類自己才能使用。

繼承注意的問題:

1)建立一個子類對象必須先建立一個父類對象
2)子類的構造器會默認調用父類的無參構造器super();
3)父類的無參構造器失效,子類構造器就須要顯式的調用父類存在的其餘構造器super(參數列表);
4)當一個子類繼承了一個父類後,父類中全部的字段和方法都被子類繼承擁有,
子類能夠任意的支配使用,每一個子類對象中都擁有了父類中的全部字段。當構造一個子類的實例對象時,該對象的實例變量包括了子類自己以及父類中的全部實例變量,實例方法也包括了子類和父類中的全部實例方法。子類構造器用來初始化子類中全部的實例變量,而父類構造器super(實參)用來初始化父類中全部的實例變量。那麼在堆中爲子類實例對象分配的內存區域中包括了子類和父類中全部初始化後的實例變量。
5)在構造器不能同時出現this和super,而且this和super只能出如今構造器的第一行,不然會報錯。

1. super表明父類對象,this表明當前對象

1) 調用父類的屬性(不多用),由於都是私有的,不能調用
super.name=name;
2) 調用父類的構造器
super(參數列表);
3) 調用父類的方法(子類中包含和父類相同的方法名)
super.方法名(參數列表);

2. 方法的重寫

條件:當父類的方法不可以知足子類方法的需求。
就能夠對父類的方法進行重寫
1)發生在子父類
2)方法名必須相同 &&
參數列表必須相同 &&
返回值類型必須相同
3)可見性(訪問修飾符)不能變小
4)異常不能擴大
加上@Override讓編譯器來檢查是不是一個重寫方法

三:多態

概念:同一領域中的不一樣對象調用相同的方法表現不同。

靜態數據類型:變量申明時候的類型,編譯時
動態數據類型:建立對象時的數據類型,運行時
對象真正的數據類型是動態數據類型決定的,運行時數據類型

實現多態必須知足什麼條件:
1)子類必須重寫父類中的方法
2)父類的引用指向子類的對象: 父類 變量 = new 子類();

Person p=new Student();
相關文章
相關標籤/搜索