1. 程式人生 > >JAVA面向對象三大特性總結

JAVA面向對象三大特性總結

col 簡單 兩張 繼承 opp exce ati 概念 顯示

什麽是面向對象?

  面向對象編程(Object Oriented Programming,OOP,面向對象的程序設計)。所謂“對象”在顯示支持面向對象的語言中,一般是指類在內存中裝載的實力,具有相關的成員變量和成員函數(也稱為:成員方法)。面向對象的程序設計完全不同於傳統的面向過程程序設計,它大大降低了軟件開發的難度,使編程就像搭積木一樣簡單。

什麽是面向過程?

  面向過程編程(Procedure Oriented Programming,OPP,面向過程的程序設計)。是一種以過程為中心的編程思想,這些都是在以什麽正在發生為主要目標進行編程,不同於面向對象的是誰在受影響。與面向對象明顯的不同就是封裝、繼承、類。

以上概念均參考自百度詞條

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

  這是由於OOP與OPP本質的區別,總結出來OOP特有的性狀

1.封裝

  JAVA中的訪問權限修飾符:public、private、protected、default(不加訪問修飾符)。訪問權限範圍:

  

訪問權限 子類 整個項目
public
protected ×
default × ×
private × × ×

  這些訪問修飾符,可以修飾類、屬性、方法。

  封裝:通過private修飾符,可以將修飾的內容私有化,拒絕外部直接訪問(這裏的訪問即調用的意思),從而將接口(這裏不完全指interface接口,指的是方法、屬性的調用)與實現(封裝的部分)分離。

2.繼承

  提到繼承就不得不說另一種方式----組合,這兩張方式都是把一個類放到另一個類中。但是組合是顯式的,繼承是隱式的。

  在繼承中,子類相對於父類是is-a(是一個)的關系。通過繼承可以使用向上轉型來將父類轉變為子類的類型。

  在組合中,僅僅是將一個對象,放入到另一個類中作為該類的屬性。是has-a(有一個)的關系。組合則不能使用向上轉型。

    向上轉型?

      在JAVA繼承關系樹中,父類總是在樹的上方。所以子類轉換成父類的過程稱之為向上轉型。

     //創建Cat對象,自動向上轉型
        Animal animal1 = new Cat();
        animal1.eat();
        
        //創建Dog對象,自動向上轉型
        Animal animal2 = new Dog();
        animal2.eat();

    向上轉型?

      將父類轉換成子類的過程稱之為向下轉型,此過程是不安全的

        //將本身就是Animal類型的Dog對象,向下轉型
        Dog dog = (Dog)animal1;
        dog.eat();
        
        //將本身不是Animal類型的Dog對象,向下轉型-------失敗ClassCastException
        Dog dog1 = (Dog)animal2;
        dog1.eat();

3.多態

  多態:同一行為,產生不同的狀態。

    同一行為,指用“同一個類型”的對象調用“同樣的方法”

    不同狀態,指產生了截然不同的結果

  原因:動態綁定,本質原因是因為調用方法主體的不同。

  什麽是綁定?  

    * 將方法調用與方法主體的關聯起來。

  綁定分為前期綁定和後期綁定(動態綁定),對於static、finalprivate默認是final的)修飾的方法都是前期綁定,所以對這些方法的調用不存在多態。

  多態的前提:方法的重載重寫,這樣才能產生多個不同的方法主體,用於動態綁定。下面用例子來介紹:

  先定義一個動物類:

package com.demo2;

//動物接口
public interface Animal {

    //動物進食
    void eat();
}

  定義一個狗類,繼承動物類:

package com.demo1;

//狗類
public class Dog extends Animal {

    @Override
    public void eat() {
        System.out.println("狗吃骨頭。。。");
    }
}

  定義一個貓類,繼承動物類:

package com.demo1;

//貓類
public class Cat extends Animal {

    @Override
    public void eat() {
        System.out.println("貓吃魚。。。");
    }
}

  測試

package com.demo1;

//測試類
public class Demo {

    public static void main(String[] args) {
        Dog dog = new Dog();
        Cat cat = new Cat();
        dog.eat();
        cat.eat();
        
        System.out.println("多態的體現如下-------------------");
        
        //直接new一個Animal對象
        Animal animal = new Animal();
        animal.eat();
        
        //創建Cat對象,自動向上轉型
        Animal animal1 = new Cat();
        animal1.eat();
        
        //創建Dog對象,自動向上轉型
        Animal animal2 = new Dog();
        animal2.eat();
        
    }
}

  結果:

技術分享圖片

  可以看出當直接new出Dog對象或者Cat對象時。調用eat時,都是調用了自身的重寫的eat方法。

  * 直接new出Animal對象,調用eat時,也是自身的eat方法。

  * 但是當創建了Dog對象時,用自動的向上轉型轉換為父類Animal類型時,再次調用eat方法,調用的是Dog類中的eat方法。

  同樣都是Animal類型的對象調用eat方法(同一行為),

  直接new出Animal時,輸出的是Animal類中的內容,從Dog對象向上轉型成的Animal時,則輸出Dog類中的內容(不同狀態),這就是多態。

JAVA面向對象三大特性總結