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不會報錯。
- 成員變量:編譯期看左邊,運行期看左邊;
- 靜態方法:編譯期看左邊,運行期看左邊;
- 非靜態方法:編譯期看左邊,運行期看右邊。
4、總結
面向對象編程思想不同於面向過程編程,它的使用更加的嚴格與規範。Java的面向對象編程更是有許多規範,需要對Java學習的更加深入纔會對它更好的理解。
有錯誤的地方敬請指出,歡迎大家評論區或者私信交流!每日持續更新Java、Python、大數據技術,請大家多多關注!