1. 程式人生 > >面向對象的三大特性(封裝 繼承 多態)

面向對象的三大特性(封裝 繼承 多態)

java 封裝 面向對象 多態 繼承

一丶封裝
1 權限修飾符
可以用來修飾成員變量和成員方法,對於類的權限修飾只可以用public和缺省default。
被public修飾的類可以在任意地方被訪問;default類只可以被同一個包內部的類訪問。
權限由大到小:public protected default(不寫) private
被private修飾的成員只能在本類中訪問,外界不能訪問技術分享

2 set()/get()方法
(1)this關鍵字
a.可以用來調用變量,方法,構造方法;
b.this.xx 理解為調用當前類的xx。
(2)成員變量和局部變量
1)在類中的位置不同
a:成員變量:在類中,方法外
b:局部變量:在方法聲明上(形式參數),或者是在方法定義中
2)在內存中的位置不同
a:成員變量:在堆內存
b:局部變量:在棧內存
3)生命周期不同
a:成員變量:隨著對象的創建而存在,隨著對象的消失而消失
b:局部變量:隨著方法調用而存在,隨著方法的調用結束而消失
4)初始化值不同
a:成員變量:有默認值

b:局部變量:必須初始化值,否則報錯!(在使用它之前,沒有初始化)
(3)set()/get()方法
當成員變量被private修飾時,不在本類中無法直接訪問,便需要set()/get()方法來解決這個問題技術分享

3 封裝性
封裝:是面向對象的第一大特性,所謂封裝,就是值對外部不可見(一般而言被private修飾),外部只能通過對象提供的接口(如set()/get()方法)來訪問。

封裝的好處:a.良好的封裝能夠減少耦合;
b.類內部的結構可以自己修改,對外部影響不大;
c.可以對成員進行更精準的控制(防止出現與事實不符的情況);
d.影藏實現細節。
註意:在開發中,類的成員變量全部要進行封裝,封裝之後通過set()/get()方法訪問。
二丶繼承extends
1 實現:通過 class Zi extends Fu{} 實現類的繼承
(1)子類繼承父類,父類中聲明的屬性,方法,子類都可以獲取到;
當父類中有私有的屬性方法時,子類同樣可以獲取到,由於封裝性的設計,使得子類不能直接調用訪問。
(2)子類除了可以繼承父類的結構外,還可以定義直接特有的成員變量,成員方法;
(3)Java中類的繼承只支持單繼承,一個類只能繼承一個父類,父類可以有多個子類,但是可以多層繼承;
(4)子類不能繼承父類的構造方法,可以間接的通過super關鍵字去訪問父類的構造方法(super(););
在子類的構造方法中如果沒有顯示的調用父類的構造方法,會默認調用父類的無參構造(所以最好父類都寫有無參構造方法)。
子類繼承父類的訪問特點:首先父類進行初始化,然後子類進行初始化;多層訪問!
2 方法的重寫(區別重載)
子類繼承父類以後,若父類的方法對子類不適用,那麽子類可以對父類方法重寫(override)
規則:1)要求子類方法的 返回值類型 方法名(參數列表) 與父類方法一致;
2)子類方法的權限修飾符不能小於父類方法的修飾權限;
3)若父類方法拋異常,那麽子類方法拋的異常類型不能大於父類;
註意: a.當子類重寫了父類的方法以後,可以用 super.方法 調用父類被重寫的內容;
b.子父類的方法必須同為static或同為非static。

class Fu{
private int i;
public Fu(){ //無參構造 super();可以省略
super();
}
public Fu(int i){ //有參構造
super();
this.i = i;
}
public void seti(int i){
this.i = i;
}
public int geti(){
return i;
}
public void show(){
System.out.println("這是父類");
}
}
class Zi extends Fu{
public Zi(){ //無參構造
super();
}
public Zi(int i){ //有參構造,這塊的super就不能省略
super(i);
}
@Override //重寫了父類中的show()方法
public void show(){
System.out.println("這是子類");
}
}
public class Test{
public static void main(String[]ages){
Zi z = new Zi();
z.seti(10); //Zi z = new zi(10);
System.out.println(z.geti()); //10
z.show(); //這是子類
}
}

3 super關鍵字
this與super區別: this:代表的是當前類的對象
super:代表的是父類的引用
應用場景:
成員變量
this.成員變量: 訪問當前類中的成員變量
super.成員變量: 訪問的是父類中的成員變量
構造方法
在構造器內部, super();/this()必須聲明在首行,且只能出現一個。
this(); 訪問的是本類中構造方法
super(); 訪問的是父類中的無參構造
成員方法
this.成員方法; 訪問的是本類的成員方法
super.成員方法; 訪問的就是父類中的成員方法
4 繼承性
優點: a:提高代碼復用性
b:提高代碼維護性
c:讓類與類產生了一種關系,它是多態的前提!(產生的這種關系也是一種弊端,java中開發原則:低耦合,高內聚)
三丶多態(主要子類對象的多態性)
1 多態的前提條件:
1)必須有繼承關系;
2)繼承一個類的同時,子類中必須有方法重寫(使用子類中的方法去覆蓋父類中的方法);
3)父類的引用指向子類對象。(向上轉型)
向上轉型:父類引用指向堆內存的子類的對象; Fu f = new Zi();
向下轉型:將父類的引用強制轉換為子類對象; Zi z = (Zi)f;
2 多態中的成員訪問特點: (左指的父類,右指的子類)
成員變量:
編譯看左,運行看左
非靜態成員方法:
編譯看左,運行看右(子類中的方法會覆蓋掉父類中的方法)
靜態的成員方法:
編譯看左邊,運行看左邊(靜態和類有關系,隨著類的加載而加載)

技術分享

3 多態性
優點:a.提高了代碼的維護性(由繼承保證);b.提高了代碼的擴展性(由多態的保證)。
弊端:父類對象不能訪問子類特有功能!
解決辦法:向下轉型(註意ClassCastException異常)

面向對象的三大特性(封裝 繼承 多態)