java三大特徵封裝、繼承、多態

    

面向對象的三大特徵:封裝、繼承、多態

1封裝:屬性私有化,對外提供統一訪問的get/set接口。完全封裝

封裝指的是將對象的狀態信息(屬性)和行爲(方法)捆綁爲一個邏輯單元的機制。將類的某些信息隱藏在類的內部,不允許外部程序直接訪問,而是通過該類提供的方法實現對隱藏

信息的操作與訪問。

java中通過將數據封裝聲明爲私有的(private),再提供一個或多個公開的(public)方法實現對該屬性的操作,以實現下述目的:

(1).隱藏一個類的實現細節

(2).防止對封裝數據未經授權的訪問。使用者只能通過事先制定好的方法來訪問數據,可以方便的加入控制邏輯,限制對屬性的不合理操作。

(3)有利於保證數據的完整性

(4)便於修改,增強代碼的可維護性。

爲了實現良好的封裝,需要從兩方面考慮:

(1)將對象的屬性和實現細節隱藏起來,不允許外部直接訪問

(2)把方法暴露出來,讓方法來操作或訪問這些屬性

實現封裝的關鍵是不要讓方法直接訪問其他類的屬性,程序應該只能通過指定的方法與對象的數據交互。封裝賦予對象黑盒特性,這是實現重用性和可靠性的關鍵。

使用訪問控制符:(private、默認、protectedpublic)

(1)private:訪問控制級別:如果類裏的一個成員(包括屬性或方法)使用private訪問控制符來修飾,則這個成員只能在該類的內部被訪問。顯然,這個訪問控制符修飾屬性最合適,使用它來修飾屬性就可把屬性隱藏在類的內部。

(2)default訪問控制權限(包訪問權限):如果類裏的一個成員(包括屬性和方法)或則一個頂級類不使用任何訪問控制符,我們就成他爲默認的訪問控制,defaule訪問控制的成員或頂級類可以被相同包下的其他類訪問

(3)protected訪問控制權限(子類訪問權限):如果一個成員(包括屬性和方法)使用protected訪問控制修飾符,那麼這個成員既可以被同一包中的其他類訪問,也可以被不同包中的子類訪問。通常情況下,如果protected來修飾一個方法,通常是希望其子類重用這個方法。

(4)public訪問控制權限(公共訪問權限):這是一個最寬鬆的訪問控制級別,如果一個成員(包括屬性和方法)或者一個頂級類使用public修飾,這個成員或頂級類就可以被所有的類訪問。不管訪問類和被訪問類是否處於同一個包中,是否具有父子類繼承關係。

定義一個Animals類

 

public class Animals {
//定義屬性
private String name;
private int age;
public void Info(){
System.out.println("我是一隻動物");
}
//定義輸出名字name和年齡age的方法
public void ToString(String name,int age){
System.out.println("name:"+this.getName()+",age:"+this.getAge());
}
//定義屬性存值取值的get()/set()方法
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

 

2.繼承:

繼承的特點:

(1)java通過extends關鍵字來實現,實現繼承的類被稱爲子類,被繼承的類被稱爲父類,有時候也稱爲基類、超類。

(2)在繼承關係中,父類更通用,子類更具體,父類具有更一般的特徵和行爲,而子類除了具有父類的特徵之外還具有自己特有的特徵和行爲。

繼承的好處:

(1).代碼的複用

(2).爲了以後多態的使用

繼承來的東西:

(1).一般的屬性和方法被繼承

(2).構造方法不被繼承

(3).私有的方法不被繼承

(4)私有的屬性被隱藏,可以通過繼承來的公有方法訪問

(5).什麼時候建立父子類關係:任何A出現的地方,換做是B之後仍然成立,或者說:“B is a A”,如果符合這個公式,就可以建立父子類關係。

對於構造方法來使:

構造方法第一行不是super(...)就是this(...),如果一個構造方法第一行不是this(...)super(...),則默認是對父類無參構造的調用super(...);不可能所有的構造都是this(...),至少有一個super(...);

注意:

在子類中使用和父類同樣名字的屬性沒有意義,對實際開發沒有任何好處,所以應該避免。

如果子類中有和父類名字相同的方法:

(1).如果參數不同,構成了重載

(2).如果參數相同,構成了重寫

重寫:覆蓋、複寫

(1).發生在父子類中

(2).同名同參同返回類型

(3).子類方法的修飾符不能比父類方法的修飾符更封閉。(要麼相同、要麼更開放)

(4)private--默認--protected--public

(5)子類方法拋出的異常不能比父類方法拋出的異常更寬泛

this()super():

(1).this指本類對象

(2)Super指父類對象

a).可以通過super.來訪問父類的屬性或方法,屬性的話注意修飾符的作用範圍。

b).子類可以通過super(..)訪問父類的構造方法,給屬性賦值

c)如果子類構造方法中沒有對本類及父類構造方法的調用,則默認有super(...);

d)如果一個類沒有指定繼承其他父類,則它的父類是Object.

定義一個子類Cat在定義一個子類Dog都繼承自類Animals

Cat類:

 

public class Cat extends Animals{
//定義子類特有屬性
private String food;
//定義子類特有屬性的get()/set()方法
public String getFood() {
return food;
}
public void setFood(String food) {
this.food = food;
}
public void Info(){
System.out.println("我是一隻小貓");
}
}

Dog類:

 

public class Dog extends Animals{
//定義私有屬性
private String food;
public void Infomation(){
System.out.println("我是一隻小狗");
}
public String getFood() {
return food;
}
public void setFood(String food) {
this.food = food;
}
}

 

3.多態:一個對象,多種狀態。父類引用指向子類的對象。

多態的兩個基本原理:

(1).發生多態時,只能調用父類的方法,不能調用子類的方法

(2).發生多態時,如果子類中重寫了父類的方法,在調用這個方法,調用的是子類重寫之後的方法。

 

寫一個測試類TestAnimal:

 

public class TestAnimal {
public static void main(String[] args) {
//多態
Animals cat = new Cat();
//在子類Cat中重寫了父類Info()方法,所以在調用這個方法時,調用的是子類重寫之後的方法。
cat.Info();
//在子類Dog中沒有重寫父類的Info()方法,所以子類對象調用該方法時,調用的是父類的該方法
Animals dog = new Dog();
dog.Info();
//發生多態時,只能調用父類的方法,不能調用子類的方法.這裏Infomation()是子類的方法,所以發生多態是子類對象無法調用子類方法
//dog.Infomation();
}
}

輸出結果:

我是一隻小貓    
我是一隻動物

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章