java基礎之面向物件的三大特徵:封裝、繼承、多型,學java必會!
java它是OOP語言(ObjectOrientedProgramming)面向物件程式語言,那麼什麼是物件?物件是什麼?毫無疑問這個問題有很多個答案,每個人對物件的理解是不一樣。
java面向物件的三大基本特徵之封裝:
我們為什麼要對我們的程式碼進行封裝?當我們定義一個人類的體重,要求使用者輸入,如果使用者輸入1000kg,這個對我們人來說是不現實的,那我們要怎樣使使用者輸入不合理時我們能及時的輸出異常?這就要用到java裡面的封裝了。封裝的優點:隱藏類實現細節;我們通過屬性的get和set方法執行,這樣我們後期修程式碼也比較方便。那麼我們是怎樣對屬性進行封裝?例
public class Dog { private String name; private int love; private int health; private String strain; /*** * 獲取name的值 * @return name的值 */ public String getName() { return name; } /*** * 對那麼進行賦值 * @param name 傳回來的狗的名字 */ public void setName(String name) { this.name = name; } /*** * 獲取狗狗的親密度 * @return 狗狗的親密度 */ public int getLove() { return love; } /*** * 對狗狗的親密度進行賦值 * @param love 返回狗狗的親密度 */ public void setLove(int love) { if (love>=0 && love<= 100){ this.love = love; }else { this.love = 40; System.err.println("親密度輸入有誤!!!預設為40"); } } /*** * 獲取狗狗的健康值 * @return 狗狗的健康值 */ public int getHealth() { return health; } /*** * 對狗狗的健康值進行賦值 * @param health 返回來的狗狗的健康的值 */ public void setHealth(int health) { if (health>=0 && health<= 100){ this.health = health; }else { this.health = 40; System.err.println("健康值輸入有誤!!!預設為40"); } } /*** * 獲取狗品種 * @return 狗品種 */ public String getStrain() { return strain; } /*** * 給狗的品種進行賦值 * @param strain 使用者輸入的狗的品種 */ public void setStrain(String strain) { if ("聰明的拉布拉多犬".equals(strain)||"酷酷的雪納瑞".equals(strain)) { this.strain = strain; }else { this.strain = "聰明的拉布拉多犬"; System.err.println("輸入有誤!!!!預設為聰明的拉布拉多犬"); } } public String toString(){ return "寵物自白:\n我的名字加"+name+"我的健康值為" +health+"我和主人的親密度為"+love+"我的型別為"+strain; } }
上述程式碼我們就是對我們定義的狗狗的名稱,健康值,親密度,以及狗的品種屬性並進行了封裝。我們通過set方法對屬性進行賦值,通過get方法來對屬性進行取值最後我們定義一個toString()方法輸出我們要輸出的內容。這要我們在測試類裡面我們只需要提示使用者輸入名稱,健康值,親密度,以及狗的品種,同時我們向Dog類裡面傳值就可以了。這樣我們要修改程式碼我們就只需要去修改Dog類就可以了。
在jsp中像上面的程式碼叫做JavaBean,其實就是封裝。
java面向物件的三大特性之繼承:
繼承就像太子繼承皇位一樣,他可以繼承他父親的皇位,得到他父親的江山,當時他需要自己的國家更加的強大,那麼他就需要有自己的改革。在java裡面的繼承也是這樣,我們子類可以繼承父類的東西,也可以有自己的東西。子類是通過關鍵字extends來繼承父類。子類繼承父類有幾點注意事項:
1、當父類是一個抽象類時,子類如果繼承他,那麼子類必須實現父類的抽象方法。如果子類沒有重寫父類的抽象方法,那麼這個子類也要定義為抽象類。
2、子類是不可以重寫父類的構造方法的。
例:
/** * Created by Zippo on 2016/7/4. * 建立一個抽象的寵物類 */ public abstract class Pet { private String name; private int love; private int health; public String getName() { return name; } /*** * 對寵物名字進行賦值 * @param name 傳回來的寵物的名字 */ public void setName(String name) { this.name = name; } /*** * 獲取寵物的親密度 * @return 寵物的親密度 */ public int getLove() { return love; } /*** * 對寵物的親密度進行賦值 * @param love 返回寵物的親密度 */ public void setLove(int love) { if (love>=0 && love<= 100){ this.love = love; }else { this.love = 40; System.err.println("親密度輸入有誤!!!預設為40"); } } /*** * 獲取寵物的健康值 * @return 寵物的健康值 */ public int getHealth() { return health; } /*** * 對寵物的健康值進行賦值 * @param health 返回來的寵物的健康的值 */ public void setHealth(int health) { if (health>=0 && health<= 100){ this.health = health; }else { this.health = 40; System.err.println("健康值輸入有誤!!!預設為40"); } } public abstract void print(); }
上述程式碼我們定義一個抽象的寵物類,因為寵物有很多,所以我們定義了一個抽象的方法輸出我們要輸出的東西。那麼如果我們定義一個子類的話,我們必須實現這個寵物類的抽象方法,如果沒有實現,那麼他的子類也必須是抽象的,那麼我們要怎樣實現呢?
例:
public class Dog extends Pet {
private String strain;
/***
* 獲取狗品種
* @return 狗品種
*/
public String getStrain() {
return strain;
}
/***
* 給狗的品種進行賦值
* @param strain 使用者輸入的狗的品種
*/
public void setStrain(String strain) {
if ("聰明的拉布拉多犬".equals(strain)||"酷酷的雪納瑞".equals(strain)) {
this.strain = strain;
}else {
this.strain = "聰明的拉布拉多犬";
System.err.println("輸入有誤!!!!預設為聰明的拉布拉多犬");
}
}
@Override
public void print() {
System.out.println("name::::"+getName()+"health::::"
+getHealth()+"love::::"+getLove()+"strian::::"+strain);
}
}
現在我們定義了一個Dog類他繼承了Pet類,那麼他要實現Pet類的抽象的輸出方法,Dog類重寫了Pet類的輸出方法,通過這樣的方式來實現Pet類的抽象方法。這就是繼承。子類繼承父類,不可以訪問父類的私有的屬性,子類只有通過父類的共有的方法去獲取父類屬性的值。這樣我們在測試類中只需要向子類傳值就可以了,同時我們也可以大量的節省重複的程式碼。
在類中,我們都知道類的載入順序:
靜態屬性->靜態程式碼塊->例項屬性->例項程式碼塊->構造方法。
那麼繼承狀態下的類載入順序:
父類靜態屬性 ->父類靜態塊 ->子類靜態屬性 ->子類靜態塊->父類例項屬性->父類例項塊 ->父類構造方法 ->子類例項屬性 ->子類例項塊 ->子類構造方法。
java面對象的第三大特性:多型。
多型就是我們運用一個訊息,可以有多個不同的了對它做出響應。
我們運用多型來編寫程式碼,在我們要更新我們程式碼的時候,我們再新建一個類,這樣我們就可以直接運用,就不要去修改其他的程式碼,這樣程式碼的可擴充套件性就比較的強了,同時我們也可以避免在我們修改程式碼的時候導致出現大量的bug.那我們怎樣運用都太呢?例:
我們先建立一個抽象的寵物類,同時他也是一個父類,並對它的屬性進行封裝,定義一個抽象的方法。
public abstract class Pet {
private String name;
private int health;
private int love;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public int getLove() {
return love;
}
public void setLove(int love) {
this.love = love;
}
public abstract void print();
}
然後我們建立一個寵物類的子類狗類,對品種這個屬性進行封裝,實現Pet類的抽象方法。
public class Dog extends Pet{
public String getStrain() {
return strain;
}
public void setStrain(String strain) {
this.strain = strain;
}
private String strain;
@Override
public void print() {
this.setHealth(getHealth());
System.out.println(this.getName()+"正在打針,吃藥體力恢復中.......");
}
}
我們再建立主人類來給寵物看病。
public class Master {
public void cure(Pet pet){
if (pet.getHealth()<50){
pet.print();
}
}
}
我們在主人這個類裡面我們只是定義一個,這個方法的引數我們就是父類,這樣我們在測試類中只需要呼叫這個方法就可以了。
public class petText {
public static void main(String[] args) {
Master master = new Master();
Scanner scanner = new Scanner(System.in);
System.out.print("請輸入寵物的品種:");
String str = scanner.next();
System.out.print("請輸入寵物的姓名:");
String name = scanner.next();
System.out.print("請輸入"+name+"的健康值:(0--100)");
int he = scanner.nextInt();
System.out.print("請輸入"+name+"的品種:");
String strina = scanner.next();
Dog dog = new Dog();
master.cure(dog);
}
}
這樣我們就不用再使用dog.方法名了,我們只需要呼叫主人了裡面的哪一個方法就可以了,把我們建立的dog這個物件傳進去,這樣我們就可以輸出了。因為我們在主人類裡面的有一個pet.print();方法,而我們的型別是父類。這樣寫的好處是當我們要更新新的一個動物的時候我們只需要建立一個該動物的類,我們不用去修改其它地方的程式碼,這樣我們就可以避免在我們更新程式碼的時候出現bug了。
好了,本篇文章就分享到這裡了。有興趣的新手夥伴們可以關注收藏起來,以後需要的時候可以多看看。如果有正在學java的程式設計師,可來我們的java技術學習扣qun哦:59789,1510裡面免費送java的視訊系統教程!