JAVA面向對象三大特性總結
什麽是面向對象?
面向對象編程(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、final(private默認是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面向對象三大特性總結