Question:請你談一下面向對象?java
Answer:算法
面向對象是相對於面向過程而言的。面向過程語言是一種基於功能分析的、以算法爲中心的程序設計方法;而面向對象是一種基於結構分析的、以數據爲中心的程序設計思想。早在面向過程語言時代,有一句話說:程序=算法+數據結構。而如今在面嚮對象語言時代,這句話變爲:程序= 對象+消息。對象:萬物皆對象; 消息:指對象之間的相互通訊。在面嚮對象語言中有一個有很重要東西,叫作類。從面向過程的角度看,類就是一個特殊的數據結構,它就好像是咱們C語言中的結構體;從面向對象的角度看,類就是具備相同屬性和方法的對象的集合。編程
面向對象有三大特性:封裝、繼承、多態。c#
所謂封裝,就是指隱藏對象的實現細節,給外界提供公共的方法來訪問。這一點,我我的認爲和麪向過程語言有本質的區別。在C語言中,咱們必須在意每個實現細節,去關注每個過程; 而自從從在面嚮對象語言中提出了封裝這個概念後,咱們就能夠沒必要要去關心每個對象的實現細節, 咱們只要關注咱們所要實現的功能就行,而後根據給咱們提供好的接口,咱們去面向接口編程就好了。面向對象的封裝思想,我認爲應用的最好、最成功的地方,就是在微軟的.NET技術上.微軟把不少常常用到的功能都封裝在一個控件裏,做爲咱們用戶沒必要去在乎到底這個控件是用什麼實現的,它內部究竟是怎麼樣的?咱們只須要關心咱們須要實現的功能就行, 而後根據控件給咱們提供的屬性和方法去操做這些控件,實現咱們想要的功能就好了。數據結構
面向對象第二個特徵,繼承。我認爲面向對象的繼承和生物學的繼承很類似。子類能夠繼承父類的公共屬性和方法,子類永遠無法繼承到父類的私有屬性和方法。這一點還區別於生物學的繼承,生物學中子類能夠同時繼承父親和母親。可是在java|C#|C++等面嚮對象語言中,是不容許多重繼承的,但能夠多層繼承。爲了彌補不能多重繼承這點,在java和c#語言中都提出了接口這一律念。接口就是一種規範。它一樣不會有實現細節,而只是給那些要實現這個接口的類一個規範和約束,約束那些實現這些接口的類,要實現我提供的功能,就必須實現個人全部方法, 要不你就聲明爲抽象類。spa
面向對象第三大特徵,多態。多態,就是同一個實現接口,對不一樣的實例而執行不一樣的操做。這一點,我記得在上高中生物的時候學過遺傳學,我以爲這裏的多態就是遺傳學的變異。 同一個物種的後代因爲基因突變或天然環境等影響,而形成不一樣的個體差別。而咱們這裏的多態也同樣,同屬一個基類的不一樣派生類也能夠有本身不一樣於其餘類的屬性和方法。除了這封裝、繼承、多態這三點基本特徵外,面向對象還有一個很重要的概念,叫抽象。抽象就是把提取事物的本質東西,而忽視非本質的東西。對應於抽象這一律念,java和c#中都有一個類叫作抽象類。抽象類中能夠給出方法的實現細節,同接口同樣若是你要實現我這個抽象類就必須實現個人全部方法,要不你就聲明你爲抽象類。若是不容許抽象類中有方法的實現細節,這就變成了接口。設計
總之,面向對象就是萬物皆對象,把客觀事物當成一個對象來處理的程序設計思想。是一種區別於POP、SOA、面向組件orm
等其餘程序設計思想,是一種基於結構分析的,以數據爲中心的程序設計思想。對象