面向對象編程(Object Oriented Programming,故常稱OOP)並不是Java獨有,而是一種編程的思想,Java、C++、Python均有對其實現。其本質是以創建模型體現出來的抽象思惟過程和麪向對象的方法。模型是用來反映現實世界中事物特徵的,任何一個模型都不可能反映客觀事物的一切具體特徵,只能對事物特徵和變化規律的一種抽象,且在它所涉及的範圍內更廣泛、更集中、更深入地描述客體的特徵。經過創建模型而達到的抽象是人們對客體認識的深化。java
優勢:易於維護與擴展,代碼複用性高。因爲面向對象有封裝、繼承、多態性的特性,能夠設計出低耦合的系統,使系統更加靈活多變。
缺點:CPU開銷大、佔據資源多編程
封裝:隱藏對象的屬性和實現細節,僅保留一些對外接口;
繼承:子類能夠繼承父類的屬性和方法;
多態:同一個行爲具備多個不一樣表現形式或形態的能力。ide
使用訪問權限修飾符來實現對屬性和方法的控制,包括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 + '}'; } }
繼承可使子類得到父類的全部非私有屬性和方法,減小了代碼的複用。繼承可使對象層次化,類型比較明確。大數據
/** * @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("兒子學習"); } }
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均可以完成。 因此,多態的好處,體如今可使程序編寫的更簡單,並有良好的擴展。ui
編譯期如果父類(父接口)擁有該方法或類,則使用的IDE不會報錯;運行期則看具體的類型,如果該類該方法或類,則使用的IDE不會報錯。this
- 成員變量:編譯期看左邊,運行期看左邊;
- 靜態方法:編譯期看左邊,運行期看左邊;
- 非靜態方法:編譯期看左邊,運行期看右邊。
面向對象編程思想不一樣於面向過程編程,它的使用更加的嚴格與規範。Java的面向對象編程更是有許多規範,須要對Java學習的更加深刻纔會對它更好的理解。設計
有錯誤的地方敬請指出,歡迎你們評論區或者私信交流!每日持續更新Java、Python、大數據技術,請你們多多關注!code