Java面向對象編程思想

1、面向對象編程是什麼

   面向對象編程(Object Oriented Programming,故常稱OOP)並非Java獨有,而是一種編程的思想,Java、C++、Python均有對其實現。其本質是以建立模型體現出來的抽象思維過程和麪向對象的方法。模型是用來反映現實世界中事物特徵的,任何一個模型都不可能反映客觀事物的一切具體特徵,只能對事物特徵和變化規律的一種抽象,且在它所涉及的範圍內更普遍、更集中、更深刻地描述客體的特徵。通過建立模型而達到的抽象是人們對客體認識的深化。

2、OOP的優缺點

優點:易於維護與擴展,代碼複用性高。由於面向對象有封裝、繼承、多態性的特性,可以設計出低耦合的系統,使系統更加靈活多變。
缺點:CPU開銷大、佔據資源多

3、三大特性

封裝:隱藏對象的屬性和實現細節,僅保留一些對外接口;
繼承:子類可以繼承父類的屬性和方法;
多態:同一個行爲具有多個不同表現形式或形態的能力。

3.1、封裝

   使用訪問權限修飾符來實現對屬性和方法的控制,包括private:僅限本類可以訪問;default(默認權限):僅限本包可以訪問;protected:僅限包內和繼承的子類可以訪問;public:均可訪問。
  我們在定義一個對象類時,通常對屬性進行隱藏,提供公共的set、get方法進行訪問。

/**
 * @author RuiMing Lin
 * @date 2020-03-05 16:01
 */
public class Person {

    private String name;
    private int age;

    public Person() {
    }

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

    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;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

3.2、繼承

   繼承可以使子類獲得父類的所有非私有屬性和方法,減少了代碼的複用。繼承可以使對象層次化,類型比較明確。

/**
 * @author RuiMing Lin
 * @date 2020-03-05 18:18
 */
public class Demo {
    public static void main(String[] args) {
        Son s = new Son("小明",23);
        s.eat();        //從父類繼承的方法
        s.sleep();      //重新父類的方法
        s.study();      //子類自己定義的方法
    }
}

class Father{
    String name;
    int age;

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

    public void eat(){
        System.out.println("吃飯");
    }

    public void sleep(){
        System.out.println("父親睡覺");
    }
}

class Son extends Father{
    public Son(String name, int age) {
        super(name, age);
    }

    @Override
    public void sleep(){
        System.out.println("兒子睡覺");
    }

    public void study(){
        System.out.println("兒子學習");
    }
}

3.3、多態

public abstract class Animal { 
    public abstract void eat(); 
}
class Cat extends Animal { 
    public void eat() { 
        System.out.println("吃魚"); 
    } 
}
class Dog extends Animal { 
    public void eat() { 
        System.out.println("吃骨頭"); 
    } 
}
public class Test { 
    public static void main(String[] args) { 
    // 多態形式,創建對象 
    Cat c = new Cat(); 
    Dog d = new Dog(); 
    // 調用showCatEat 
    showCatEat(c);
    // 調用showDogEat
    showDogEat(d); 
    showAnimalEat(c); 
    showAnimalEat(d); 
}
    public static void showCatEat (Cat c){ 
        c.eat(); 
    }
    public static void showDogEat (Dog d){ 
        d.eat(); 
    }
    public static void showAnimalEat (Animal a){ 
        a.eat(); 
    } 
}

   由於多態特性的支持,showAnimalEat方法的Animal類型,是Cat和Dog的父類類型,父類類型接收子類對象,可以把Cat對象和Dog對象傳遞給方法。當eat方法執行時,多態規定,執行的是子類重寫的方法,那麼效果自然與showCatEat、showDogEat方法一致, 所以showAnimalEat完全可以替代以上兩方法。不僅僅是替代,在擴展性方面,無論之後再多的子類出現,我們都不需要編寫showXxxEat方法了,直接使用 showAnimalEat都可以完成。 所以,多態的好處,體現在可以使程序編寫的更簡單,並有良好的擴展。

3.3.1、多態運行規則

  編譯期若是父類(父接口)擁有該方法或類,則使用的IDE不會報錯;運行期則看具體的類型,若是該類該方法或類,則使用的IDE不會報錯。

  1. 成員變量:編譯期看左邊,運行期看左邊;
  2. 靜態方法:編譯期看左邊,運行期看左邊;
  3. 非靜態方法:編譯期看左邊,運行期看右邊。

4、總結

  面向對象編程思想不同於面向過程編程,它的使用更加的嚴格與規範。Java的面向對象編程更是有許多規範,需要對Java學習的更加深入纔會對它更好的理解。

  

有錯誤的地方敬請指出,歡迎大家評論區或者私信交流!每日持續更新Java、Python、大數據技術,請大家多多關注!

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