導航:首頁 > 編程知識 > 用什麼故事解釋面向對象編程

用什麼故事解釋面向對象編程

發布時間:2023-05-10 09:43:24

❶ 面向對象編程是什麼意思

面向對象編程又稱OOP,是一種計算機編程架構。本質是以建立模型體現出來的抽象思維過程和面向對象的方法。

OOP的一條基本原則是計算機程序由單個能夠起到子程序作用的單元或對象組合而成。OOP達到了軟體工程的三個主要目標:重用性、靈活性和擴展性。OOP=對象+類+繼承+多態+消息,其中核心概念是類和對象。

面向對象程序設計方法是盡可能模擬人類的思維方式,使得軟體的開發方法與過程盡可能接近人類認識世界、解決現實問題的方法和過程,也即使得描述問題的問題空間與問題的解決方案空間在結構上盡可能一致,把客觀世界中的實體抽象為問題域中的對象。


(1)用什麼故事解釋面向對象編程擴展閱讀

面向對象程序設計以對象為核心,該方法認為程序由一系列對象組成。類是對現實世界的抽象,包括表示靜態屬性的數據和對數據的操作,對象是類的實例化。對象間通過消息傳遞相互通信,來模擬現實世界中不同實體間的聯系。在面向對象的程序設計中,對象是組成程序的基本模塊。

模型是用來反映現實世界中事物特徵的。任何一個模型都不可能反映客觀事物的一切具體特徵,只能對事物特徵和變化規律的一種抽象,且在所涉及的范圍內更普遍、更集中、更深刻地描述客體的特徵。通過建立模型而達到的抽象是人們對客體認識的深化。

❷ 什麼是面向對象的編程思想可以用一個形象的例子說明一下么

時間萬物皆是對象,也就是說你能看得見的或者看不見的東西,只要實際存在,它就是對象。對象是就某個具體個體而言的。
比如你自己的班級,對於你來說,你們班就是一個班級對象。而班級中的某個具體的人,他也是一個對象。
面向對象的編程思想就是把你需要解決的問題中的所有具體的東西,都看成一個對象,然後把所有具有相同性質的對象組成一個類,那些與問題無關的對象則忽略。
舉個簡單的例子:計算你們班所有人某次測驗數學的總成績。從下到上分析這個問題的所有對象。
要計算成績,成績必須有吧,那麼一份成績就是一份對象; 成績哪裡來呢,你們班同學的,如果你們班33個人,那麼就是33個同學對象;既然計算你們班整體成績,那麼你們班級也是個對象。
其他與這個問題無關的對象可以不管,也就是說,這個時候他們是不是對象跟你無關,
比如如果只要計算你個人的成績,那麼班級這個對象,就與這個問題無關,這時候只需要兩個對象。但是如果就每個對象編程的話,33個人就是33個對象,都寫一遍,寫死你都不夠。
雖然每個人的個性不一樣,但是跟我們的問題無關,每個人都有成績這點是相同的,所以33個人其實在這個時候就是一個人。只要把他們定義成一個變數就行了,這就是類的概念。
比如對於數字,11,2,3,4,5,每個數字都是一個對象,但是他們具有相同的特點,把他們分成一個int類,用變數的形式表示具體的對象就可以了。

語言表達不行,不知道有沒有說清楚,希望對你有點幫助。

❸ 什麼是面向對象的編程思想

面向對象的編程的主要思想是把構成問題的各個事物分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描述一個事物在解決問題的過程中經歷的步驟和行為。對象作為程序的基本單位,將程序和數據封裝其中,以提高程序的重用性,靈活性和可擴展性。類是創建對象的模板,一個類可以創建多個對象

❹ 什麼是面向對象編程

前言:面向對象程序設計(Object-Oriented Programming,以下簡稱OOP)是一種起源於六十年代的Simula語言,發展已經將近三十年的程序設計思想。其自身理論已經十分完善,並被多種面向對象程序設計語言(Object-Oriented Programming Language,以下簡稱OOPL)實現。如果把Unix系統看成是國外在系統軟體方面的文化根基,那麼Smalltalk語言無疑在OOPL領域和Unix持有相同地位。由於很多原因,國內大部分程序設計人員並沒有很深的OOP以及OOPL理論,很多人從一開始學習到工作很多年都只是接觸到c/c++,java,vb,delphi等靜態類型語言,而對純粹的OOP思想以及作為OOPL根基的Smalltalk以及動態類型語言知之甚少,不知道其實世界上還有一些可以針對變數不綁定類型的編程語言。而這些對比卻是深刻理解OO理論的重要部分,而國內這方面的資料也為數不多。故把自己的一些OO學習心得寫下來做為一個系列文章(一共三篇,第一篇描敘OOP的一些基本但容易被誤解的理論,第二篇主要說明各種OOPL演化和發展以及對於OOP理論的支持,第三篇主要是說模式和組件在OOP中的地位以及展望OOP的未來),由於文章描敘的只是自己對於OOP/OOPL的理解,錯誤以及淺薄之處在所難免,只是希望對大家能起到拋磚引玉的作用。

❺ 面向對象編程怎麼理解簡單點說。。

說到面向對象,就會提到面向過程,兩者有區別,對兩者進行一個比較就會知道什麼是面向對象。可以通過舉一個例子進行說明,首先面向過程:假設一杯水從一個桌面上往地上掉,在0.01秒時,還在桌面上,0.02秒時快脫離桌面,0.05秒時脫離桌面,0.1秒時掉到半空中,0.4秒時掉到地上,0.5秒時玻璃破碎,這就是面向過程的編程;而面向對象是水從桌面上落下,你看到時它已經破碎了,你看不到它的過程,只有一個結果。這就是它們的區別,不知道你可不可以接受。

❻ 怎麼理解面向對象編程

我覺得沒必要去深究他的意思。
按我的理解,
面向對象編程
,主要是將我們實際生活中的對象經過抽象,將它定義成為一個類,通過類的屬性和方法來模擬生活中的這個對象。這樣使得程序更容易結構化、抽象起來更方便。
面向對象技術
最初是從面向對象的程序設計開始的,
面向對象編程並不困難
它的出現以60年代simula語言為標志。80年代中後期,
面向對象程序設計
逐漸成熟,被計算機界理解和接受,人們又開始進一步考慮面向對象的開發問題。這就是九十年代以Microsoft
Visual系列OOP軟體的流行的背景。
傳統的結構化分析與設計開發方法是一個線性過程,因此,傳統的結構化分析與設計方法要求現實系統的業務管理規范,處理數據齊全,用戶能全面完整地其業務需求。
傳統的
軟體結構
和設計方法難以適應軟體
生產自動化
的要求,因為它以過程為中心進行功能組合,軟體的擴充和復用能力很差。
對象是對現實世界實體的模擬,因面能更容易地理解需求,即使用戶和分析者之間具有不同的教育背景和工作特點,也可很好地溝通。
區別面向對象的開發和傳統過程的開發的要素有:對象識別和抽象、封裝、
多態性
和繼承。
對象(Object)是一個現實實體的抽象,由現實實體的過程或信息牲來定義。一個對象可被認為是一個把數據(屬性)和程序(方法)封裝在一起的實體,這個程序產生該對象的動作或對它接受到的外界信號的反應。這些對象操作有時稱為方法。對象是個動態的概念,其中的屬性反映了對象當前的狀態。
類(Class)用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例。
由上分析不難看出,盡管OOP技術更看中用戶的對象模型,但其目的都是以編程為目的的,而不是以用戶的信息為中心的,總想把用戶的信息納入到某個用戶不感興趣的「程序對象」中。

❼ 如何簡單的理解面向對象編程

分類: 電者液腦/網路 >> 程序設計 >> 其他編程語言
問題描述:

如何簡單的理解面向對象編程??

有什麼形象的例子可以幫助理解??

解析:

轉自:伊圖網[4ico]在闡述類的概念之前我們來先說說面向對象編程的概念:面向對象的程序設計(Object-Oriented Programming,簡記為OOP)立意於創建軟體重用代碼,具備更好地模擬現實世界環境的能力,這使它被公認為是自上而下編程的優勝者。它通過給程序中加入擴展語句,把函數「封裝」進編程所必需的「對象」中。面向對象的編程語言使得復雜的工作條理清晰、編寫容易。說它是一場革命,不是對對象本身而言,而是對它們處理工作的能力而言。對象並不與傳統程序設計和編程方法兼容,只是部分面向對象反而會使情形更糟。除非整個開發環境都是面向對象的,否則對象產生的好處還沒有帶來的麻煩多。有人可能會說PHP不是一個真正的面向對象編程的語言, PHP 是一個混合型 語言,你可以使用面向對象編程,也可以使用傳統的過程化編程。然而,對於大型項目的開發,你可能想需要在PHP中使用純的面首攔物向對象編程去聲明類,而且在你的項目開發只用對象和類。隨著項目越來越大,使用面向對象編程可能會有幫助,面向對象編程代碼很容易維護,容易理解和重復使用,這些就是軟體工程的基礎。在基於Web的項目中應用這些概念就成為將來網站成功的關鍵。

對象(Object)是問題域或實現域中某些事物的一個衡盯抽象,它反映此事物在系統中需要保存的信息和發揮的作用;它是一組屬性和有權對這些屬性進行操作的一組服務的封裝體。 關於對象要從兩方面理解:一方面指系統所要處理的現實世界中的對象;另一方面對象是計算機不直接處理的對象,而是處理相應的計算機表示,這種計算機表示也稱為對象。簡單的來說,一個人就是一個對象,一個尺子也可以說是個對象。當這些對象可以用數據直接表示時,我們就稱他為屬性,尺子的度量單位可以是厘米,公尺或英尺,這個度量單位就是尺子的屬性。

在PHP里我們可以定義一個類,類(Class)就是指變數與一些使用這些變數的函數的 *** 。PHP是一種鬆散類型的語言,所以通過類型重載不起作用,通過參數的個數不同來重載也不起作用。 有時在面向中重載構造函數非常好,這樣你可以通過不同的方法創建對象(傳遞不同數量的參數)。在PHP中就是通過類來實現的。

在PHP中是通過類來完成信息封裝的,在PHP中定義類的語法是:

<?php

class Class_name 在面向對象編程類中,習慣上類的第一個字元為大寫,並且必須符合變數的命名規則。

{

函數與變數的 ***

}

?>

在定義類時你可以按自已的喜好的格式進行定義,但最好能保持一種標准,這樣開發起來會更有效些。

數據成員在類中使用"var"聲明來定義,在給數據成員賦值之前,它們是沒有類型的。一個數據成員可以是一個整數,一個數組,一個相關數組(Associative Array)或者是一個對象。

下面是一個類定義的實際例子:

<?php

class Student

{

var $str_Name; 姓名

var $str_Sex; 性別

var $int_Id; 學號

var $int_English; 英語成績

var $int_maths; 數學成績

}

?>

這是一個很普通定義類的簡單例子,用於顯示學生的學習成績,類名為Student,Student類包涵了一個學生的基本屬性:姓名、性別、學號、英語成績和數學成績。

function我們稱之為在類中被定義的函數,在函數中訪問類成員變數時,你應該使用$this->var_name,其中var_name指的是類中被聲明的變數,否則對一個函數來說,它只能是局部變數。 我們先定義一個Input()的函數,用來給實例中的對象賦以初值:

function Input ( $Name, $Sex, $Id, $Englis, $Maths)

{

$this->str_Name=$Name;

$this->str_Sex =$Sex;

$this->int_Id =$Id;

$this->int_Englis=$English;

$this->int_Maths=$Maths;

}

現在我們再定義一個叫「ShowInfo()」的函數,用於列印學生的基本情況:

function ShowInfo() 定義ShowInfo()函數

{

echo (「姓名:$this->str_Name<br>

」);

echo (「性別:$this->str_Sex <br>

」);

echo (「學號:$this->int_Id <br>

」);

echo (「英語成績:$this->int_English <br>

」);

echo (「數學成績:$this->int_Maths <br>

」);

}

而定義好的類則必須使用new關鍵詞來生成對象:

$A_student=new Student;

例如我們要為一個名為$Wing的對象創建實例,並進行賦值,可以使用下面的代碼:

$Wing =new Student; 用new關鍵詞來生成對象

$Wing ->Input (「Wing」,」男」,33,95,87);

分別輸入Wing的姓名、性別、學號、英語成績、數學成績,其中姓名和性別是字元型變數,所以需要用雙引號,其它為數值型變數則不需要。

通過下面這段完整的源代碼,我們就可以很清楚的看到類在PHP是怎麼被運用的:

<?php

class Student

{

var $str_Name;

var $str_Sex;

var $int_Id;

var $int_English;

var $int_maths;

function Input ( $Name, $Sex, $Id, $English, $Maths)

{

$this->str_Name=$Name;

$this->str_Sex =$Sex;

$this->int_Id =$Id;

$this->int_English=$English;

$this->int_Maths=$Maths;

}

function ShowInfo()

{

echo (「姓名:$this->str_Name<br>

」);

echo (「性別:$this->str_Sex <br>

」);

echo (「學號:$this->int_Id <br>

」);

echo (「英語成績:$this->int_English <br>

」);

echo (「數學成績:$this->int_Maths <br>

」);

}

}

$Wing = new Student;

$Wing->Input (「Wing」,」男」,33,95,87);

$Paladin = new Student;

$Paladin->Input (「paladin」,」女」,38,58,59.5);

$Wing->ShowInfo();

$Paladin->ShowInfo();

?>

執行結果應是這樣的:

姓名:Wing

性別:男

學號:33

英語成績:95

數學成績:87

姓名:Paladin

性別:女

學號:38

英語成績:58

數學成績:59.5

PHP現有的版本較以前的版本在對面向對象編程的支持方面有了很大的改善,但支持的還不是很完整,不過現階段PHP對面向對象編程語言提供的支持不但有利於我們設計程序的結構,對於對程序的維護也能提供很大的幫助。

❽ 如何理解面向對象編程

[引] 1.基本概念:
1.1 類與對象的初探
要我說,無論是面向過程的語言也好,面向對象的語言也罷,我首先要給他講的都是類和對象!--------「這個世界是由什麼組成的?」這個問題如果 讓不同的人來回答會得到不同的答案。如果是一個化學家,他也許會告訴你「還用問嘛?這個世界是由分子、原子、離子等等的化學物質組成的」。如果是一個畫家 呢?他也許會告訴你,「這個世界是由不同的顏色所組成的」。……呵呵,眾說紛紜吧!但如果讓一個分類學家來考慮問題就有趣的多了,他會告訴你「這個世界是 由不同類型的物與事所構成的」好!作為面向對象的程序員來說,我們要站在分類學家的角度去考慮問題!是的,這個世界是由動物、植物等組成的。動物又分為單 細胞動物、多細胞動物、哺乳動物等等,哺乳動物又分為人、大象、老虎……就這樣的分下去了!
現在,站在抽象的角度,我們給「類」下個定義吧!我的意思是,站在抽象的角度,你回答我「什麼是人類?」首先讓我們來看看人類所具有的一些特徵,這個 特徵包括屬性(一些參數,數值)以及方法(一些行為,他能幹什麼!)。每個人都有身高、體重、年齡、血型等等一些屬性。人會勞動、人都會直立行走、人都會 用自己的頭腦去創造工具等等這些方法!人之所以能區別於其它類型的動物,是因為每個人都具有人這個群體的屬性與方法。「人類」只是一個抽象的概念,它僅僅 是一個概念,它是不存在的實體!但是所有具備「人類」這個群體的屬性與方法的對象都叫人!這個對象「人」是實際存在的實體!每個人都是人這個群體的一個對 象。老虎為什麼不是人?因為它不具備人這個群體的屬性與方法,老虎不會直立行走,不會使用工具等等!所以說老虎不是人!
由此可見-------類描述了一組有相同特性(屬性)和相同行為(方法)的對象。在程序中,類實際上就是數據類型!例如:整數,小數等等。整數也有 一組特性和行為。面向過程的語言與面相對象的語言的區別就在於,面向過程的語言不允許程序員自己定義數據類型,而只能使用程序中內置的數據類型!而為了模 擬真實世界,為了更好的解決問題,往往我們需要創建解決問題所必需的數據類型!面向對象編程為我們提供了解決方案。

1.2 內置數據類型與函數:
計算機程序在存儲數據時必須跟蹤3個基本屬性為:
1. 信息存儲在何處;
2. 存儲的值是多少;
3. 存儲的信息是什麼類型的;
讓我們來看看編程語言的內置數據類型都有哪些!(呵呵,這個不大好說,因為每門語言都有自己獨特的數據類型,但這畢竟是少數,比如在JAVA中有 byte類型的數據,而在C++中就沒有,希望你能舉一反三!)比如整數」int 」,浮點類型的數據」float」!字元串」String」,以及數組還有結構體等等。然而在寫程序的時候,根據需要我們會創建一個類型的變數或常量,例 如:由於我們需要創建一個整形的變數i為5,我們就可以這樣做,int i = 5;而根據需要我很有可能改變i的值,也就是從新給它賦值,比如讓它等與6,就可以在所需的地方改成i = 6;由此我們知道,在「值」上可以發生變化的量就叫變數。不會發生變化的量就叫做常量了,在C++中用count關鍵字來聲明,而在JAVA中則使用 final關鍵字來聲明。由於不同語言的聲明格式不一樣,這里就不做一一介紹了,詳細的內容清查閱相關書籍!
在這里我們主要討論一下函數,我們可以把函數想像成一個「實現某種特定功能的黑匣子」-------這個功能是由你來設定的,舉個例子來說:現在我問 你「2+3等於多少」?我相信你能很快的回答我等於5。讓我們來分析分析這句話包含什麼信息!首先我要把你的大腦想像成是一個黑匣子,我並不知道也沒有必 要知道你的大腦是如何工作的(也就是怎麼運算的),我關心的只是我傳給你的是什麼信息?你對信息做了哪些處理? 以及你返回給我的是什麼信息?需要提醒你一下的是每個方法都會返回一個信息給調用者的,除了構造函數外(稍候我會作詳細的介紹)。我現在需要把自己當作是 一名程序員,而你呢?當然就是計算機了!計算即可沒有人那麼聰明,它只會按事先約好的特定的格式運行,我想讓它具有如上所述的功能,我就要先定義這個黑匣 子!首先我要告訴這個黑匣子會有兩個整數值給你(這就是所謂的參數,是程序員需要給黑匣子的信息),然後就要定義這個黑匣子內部實現這兩個整數相加的運算 (這就是黑匣子對數據所做的加工,根據需要,你可以做任何的加工。)。最後再標注它返回給我一個同樣是整型的數值(這是黑匣子返回給程序員的信息)。一個 函數就這樣定義完了,讓我們來看看書寫格式:

int addnum(int x,int y){
return x+y;
}

具體的含義是這樣的:

int /*返回值類型*/ addnum /*方法(黑匣子)名稱*/ (int x,int y/*傳入的參數*/){
return x+y; /*內部是想方法(實現相加運算,)並用return返回給調用者結果*/
}

首先請注意上明的「return」語句!return 關鍵字的含義是向調用者返回緊跟在它後面的信息!就像上面一樣,因為我問你,你才會回答我,如果我不問你,你就不用回答我的!在計算機中也一樣,定義好這 個函數在哪裡調用呢?我只能告訴你,哪裡需要就在哪裡調用!當然,你可以根據需要去更改參數、返回值以及內部實現,具體到如何定義如何調用你只好去參考相 關的資料了!在這里我只是給你一個思想!
有時你會遇到這樣的問題,我讓你記住,我的年齡是20歲!從字面上理解,你並沒有給我返回信息!然而事實上,你確實給我返回了信息,信息的內容是「無信息,也就是無返回值類型void」。具體的程序如下:

int myAge = 0;
int a=20;
void remAge(int a){
myAge=a;
}

具體的函數說明如下:

int myAge =0; //定義並初始化我的年齡為0;
int a=20; /*定義變數a等於20*/
void /*返回值類型為無返回值類型*/ remAge /*函數名稱*/(int a /*傳入的參數*/){
myAge=a; //內部實現方法,注意,沒有return返回!!!
}

關於函數的話題還有很多很多,這里就不一一介紹了,我的目的是讓你知道函數是怎麼一會事兒!為下面的討論作鋪墊!

1.3 指針以及引用:
指針及引用是在C++中有的,JAVA中沒有。JAVA中取消了對內存的操作,隨之而來的事也取消了操作符重載的操作。不過在稍候我還是會介紹一些操 作符重載的功能等。引用主要還是用在函數參數的傳遞上。所以我在這里就不做過多的介紹了。他們很實用,有興趣的同學可以參閱C++相關書籍。
1.4 運算符及控制語句:
還是自己看看相關書籍吧,這里就不再熬述了!

2.深入探討面向對象:
2.1「類型」的內部細節:
有了上面的知識,我們現在就可以深入的挖掘類的內部實現了。所有的知識點我都會圍繞著類與對象展開,在此之前,我希望你能夠確信對以上所介紹的基本內容已完全掌握了!
是的,面向對象的編程語言最大的特色就是可以編寫自己所需的數據類型,以更好的解決問題。我想我必須要幫你搞清楚「類,對象,屬性,方法它們之間的關 系」!就像我前面所說的,人這個「類」是什麼也做不了的,因為「人類」只是一個抽象的概念,它不是實實在在的「東西」,而這個「東西」就是所謂的對象。只 有人這個「對象」才能去工作。而類呢?類是對象的描述!對象從類中產生出來!此時,對象具有類所描述的所有的屬性以及方法。-------一定要理解這句 話!!!
也許你已經有些不知所措了,沒關系!好好的回味一下,我再舉個例子!例如電視機,電視機都有工作原理圖,那麼什麼叫電視機呢?只要它能夠實現工作原理圖的 所有功能的物體,我們都叫它電視機。你想想是不是這么一回事兒?可是,電視機原理圖是不能工作的,也就是這個原理圖不能收看節目,只有電視機這個「實體 ——即所謂的對象」才能收看節目,也就是說,從類生成出對象之後才算得上是真正的有意義!才能開始工作。此時,電視機擁有電視原理圖所描述的所有的屬性及 方法!明白了吧,呵呵!
我先前介紹過,類是屬性與方法的集合。而這些屬性與方法可以被聲明為私有的(private),公共的(public)或是受保護(protected)的,他們描述了對類成員的訪問控制。下面我分別做一下介紹:
1. 公共的(public):把變數聲明為公共類型的之後,那麼就可以通過對象來直接訪問,一切都是暴露無遺的!也就是說,你的信用卡密碼別人也能夠直接得到。
2. 私有的(private):如果把變數聲明為私有的情況就好多了,想要得到我的信用卡密碼,對象必須要調用專用的方法才能夠得到。
3. 受保護的(protected):介紹繼承時再討論。
4. 默認控制訪問符(friendly)://JAVA中有而C++中沒有。
為了實現數據的封裝,提高數據的安全性,我們一般會把類的屬性聲明為私有的,而把類的方法聲明為公共的。這樣,對象能夠直接調用類中定義的所有方法,當對 象想要修改或得到自己的屬性的時候就必須要調用以定義好的專用的方法才能夠實現。你想想,你會把你的信用卡密碼公布出來嘛?呵呵!所以,我們提倡的是: 「對象調方法,方法改屬性」;
2.2通過實例看內存分配:
說了這么多,讓我們來看一個實例吧!比如:現在我們要編寫某家公司員工管理系統,你認為最合適的數據類型是什麼?我認為是員工個人!但是在面向過程的 語言中,這樣做是不允許的,因為它只能使用語言中的內部數據類型!而員工不在這個內部數據類型之內!也許有人會說可以用C語言中的struct,好注意! 畢竟它是類的基礎!如果你以前是一名面C或B的程序員,請你忘掉這些,讓我們一起看看如何用類來實現這一切吧!
某家公司的員工是人類的一個特殊群體,它除了具備人類的所有特性與方法外,它還有額外的特性與方法,比如她有她的工資、信用卡密碼、作息時間等等,這 些特性以及工作內容,工作量等等這些方法。而在計算機中我們該如何定義這個類呢?下面我將寫出它的格式,讓你看看在計算機中它是張什麼樣子的!

/*在此我需要再次聲明的是,我用的是JAVA格式,在語法格式上它與C++大不相同!許多細節以及內部操作都有諸多區別,而在思想上確實大同小異的*/
//employee.java
public class employee{
private String name; //員工姓名
private int age; //員工年齡
private char sex; //員工性別
private float emolument; //員工薪水
private boolean lunch; //員工午餐
//……等等
public void heater(){ //這個方法是用來加工員工的午餐
lunch = true;
}
public void setName(String a){ //這個方法是修改員工的姓名
name= a;
}
public String getName(){ //這個方法是得到員工的姓名
return name;
}
//……等等
}

這樣我們就定義完了我們所需要的數據類型。現在,讓我們來看看它能夠干什麼以及怎麼工作!
我想要做的是,工作室里有一個光桿司令叫「jingwei」,我修改它的名字後對對它進行輸出,看看我是怎麼做的吧!
注意:請仔細觀察對象是如何調用方法的,它使用了「.」操作符!事實上是這樣的,對象調用公共的屬性或方法時就會使用「.」操作符。
然而在C++中,如果定義一個同類型的指針,該指針調用此對象的方法時,就會使用「->」操作符。更詳細的內容清參閱相關書籍了!

//workstation.java
import java.awt.Graphics;
import java.applet.Applet;
public class workstation extends Applet{
private employee jingwei ; //對象的聲明,此時並不分配內存!
public void init(){
jingwei = new employee(); /*此時創建對象會調用構造函數,稍候介紹*/
jingwei.setName(「jw」); //設置我的名字
}
public void paint(Graphics g){
g.drawString("my age is "+jingwei.getName(),10,10);//顯示我的年齡
}
}

輸出結果是:

my name is jw

這串字元串是在輸出窗口的x坐標軸為10 px , y坐標軸為10 px的位置。
我現在要做的是,把上面的程序做個大解剖,讓你能夠看清楚它到底是怎麼一回事兒!(我可不時帶你去看裡面的匯編,呵呵,那個我也不會:)

首先還是來看看我們自定義的數據類型employee,在應用的時候它和int類型的數據沒什麼兩樣,一樣的需要創建變數(對象),只不過前者是咱自 己定義的,而後這是它內置的。Employee這個類中有許多屬性,也有許多方法。而此時,我們不能直接用我們所創建出來的對象調用它的屬性進行修改。因 為它是private受保護類型的!我要想修改我的姓名我就要用對象調用setName()這個方法,而我想得到我的姓名就要調用getName()這個 方法。我們完全是按照航線來行走的,這個航線就是「對象調方法,方法改屬性」
好的,我真的相信你已經明白了這是怎麼一回事兒了!呵呵!仰起航帆,繼續前行!
現在讓我們一起來看看workstation這個類。這是個主類,和C++中的main()函數的味道差不多。其中,在JAVA中,一個文件只允許有而且必須有一個主類,這個主類用public來聲明!他就跟C++中必須要有一個main()函數是一樣的。
讓我們來看看這個類中的第一條語句!private employee jingwei ;這條語句的作用是聲明一個employee的對象jingwei(在C++中就不用聲明了)。我想要和你說的是「聲明」與「定義」之間的區別。聲明只是 告訴計算機將要有這樣的一個變數(對象),在內存中它並不為這個變數(對象)分配內存!而只有在定義的時候才會給這個變數(對象)分配內存。(需要說明一 下的是init()方法是完成初始化操作的,在此處定義對象,為對象分配內存。start()方法用來啟動瀏覽器的主線程,paint()方法來顯示 Apple的界面。這些是Applet程序所需的,至於Application程序就不需要了,當然了,C++中也不需要他們。關於他們的詳細內容清參閱 相關書籍)
緊接著就開始定一個對象了,對jingwei這個對象進行操作才會有實際的意義。千萬不要有這種想法:「試圖對類進行操作!」就像前面我說的,電視機 原理不能看電視一樣!這是毫無意義的!看這條語句jingwei = new employee();它的意思就是定義一個employee類型的對象jingwei。此時,我想告訴你的是:「jingwei這個對想擁有了些什 么」。它擁有了類所描述的所有的屬性及方法。下面我一一給你列出來:

/*所有的employee對象都擁有這些屬性。每創建一個對象就會從新分配一塊內存來存放相應對象的這些屬性。我的意思是每個對象都有自己「獨特」的一份*/
private String name; //員工姓名
private int age; //員工年齡
private char sex; //員工性別
private float emolument; //員工薪水
private boolean lunch; //員工午餐
/*所有的employee對象都擁有這些方法。但在內存中只有一份*/
public void heater(){ //這個方法是用來加工員工的午餐
lunch = true;
}
public void setName(String a){ //這個方法是修改員工的姓名
name= a;
}
public String getName(){ //這個方法是得到員工的姓名
return name;
}
/*但是,實際上在創建jingwei這個對象時計算機只給這個對象的所有的屬性分配了內存,而並沒有給方法分配內存。方法只有一個,是屬於所有的對象的,所以無論創建了多少個對象,計算機只會為一個方法分配一塊內存。*/
我想我還是舉個例子吧,不然你非暈倒不可。呵呵!
看我這條語句「private boolean lunch;」公司不管午餐,每個員工都需要帶飯。我們現在這樣想,公司的空間是所有的內存容量,你的辦公桌就是計算機中的內存中的一部分(每個員工都有 一份,是在創建對象時分配的)。你把午飯帶到了公司,放在了你的辦公桌上。「午飯」占據了你的辦公桌的一角(佔了你自己「對象」的一塊內存容量)。這份午 飯只屬於你自己,同樣別人的也只屬於她自己!所以每個員工(對象)都需要一快空間(內存)來存放自己的午餐(屬性)。在計算機中也是這樣的,每創建一個對 象,就會在內存中從新分配一塊內存來放「午餐——lunch」這個屬性(對象所擁有的所有的屬性)。
計算機只會為對象的屬性分配內存。因為每個對象的都不一樣!就像你往公司帶的午飯和我往公司帶的午飯不一樣是一個道理!但方法就不同了。早晨帶的飯中 午就涼了,你需要用微波爐來加熱。微波爐可不用你帶,公司就有(只佔公司的一塊空間),它放在了午餐桌上。你想想,微波爐屬於誰的?它屬於所有員工的!因 為每個員工都可以用它。而不必每個員工都帶一份。由此可見,每個員工(對象)都有一份午飯(屬性),但所有的員工(對象)只一個微波爐(方法)。所有的員 工(對象)都可以通過這個微波爐(方法)來改變自己午餐(屬性)的冷熱狀態。殊途同歸!在計算機中也就是這樣,方法只有一份,供所有的對象使用!而屬性是 每個對象一份,因為每個對象的都不一樣。別和我說你還不明白,不然我會撞牆的,呵呵:)

2.3深入探討函數:

2.3.1構造函數、默認構造函數、 預設構造函數

對於上面的實例,它已經能完成絕大部分工作了,但它還是不完善的,還有許許多多的細節等到我們去完善!也許有的同學已經注意到了,當我創建完 「jingwei」這個對象時,這個對象的所有的屬性都是空的,也就是說:這個對象的姓名是未定的、年齡是未定的、性別是未定的、薪水是未定的、午餐也是 未定的。而我們想把這些屬性都添加上去,就還要用對象調用相應的方法,去一個個修改!天啊,這簡直是太麻煩了!有沒有什麼好方法能夠在我們創建對象的同時 就完成了對屬性賦值的操作呢?哦不,應該說是對屬性的初始化呢?當然沒問題了,這就需要所謂的構造函數!
構造函數是類中最特殊的函數,它與析構函數的功能正好相反!
從特徵上來說:1.它是編程語言中唯一沒有返回值類型的函數。
2.它的名稱與類的名稱必須要完全相同。
3.它必須被聲明為公共(public)的類型
4,可以對構造函數進行重載。
5.它在創建對象是自動被調用。
從功能上來說:1.它是對類中的屬性進行初始化。
其實,對於上面的程序來說我們沒有自己定義構造函數。但是,在這種情況下,系統會自動為我們定義一個「默認構造函數」。他會把數值變數自動賦值為0, 把布爾行變數賦值為false等等(但在C++中,默認構造函數不初始化其成員)。如果程序員定義了構造函數,那麼系統就不會再為你的程序添加一個缺默認 造函數了。(在這里,我們提倡的是自己定義構造函數,而不是用系統的默認構造函數)
還是看個實例吧!這樣比較清楚一些!

//employee.java

public class employee{

private String name; //員工姓名

private int age; //員工年齡

private char sex; //員工性別

private float emolument; //員工薪水

private boolean lunch; //員工午餐

//……等等

public employee(){ //這個就是「默認」構造函數

name = 「jw」; //設置員工姓名

age = 20; //設置員工年齡

sex = 「M」; //設置員工性別

emolument = 100; //設置員工薪水

lunch = false; //設置員工午餐

}

public void heater(){ //這個方法是用來加工員工的午餐

lunch = true;

}

//……等等

};

這樣,在我們創建「jingwei」這個對象的同時,它的所有的屬性也被初始化了!顯然,這大大的提高了工作效率,但是,它還是不符合要求。想想看, 如果我們現在創建這個類型的第二個對象的時候會發生什麼事情?告訴你,除了對象的「名」(這個名稱不在是對象屬性中的名稱,而是對象本身的名稱)不一樣 外,其所有的「屬性值」都一樣!比如:現在我們創建第二個對象flashmagic,然而我會發現這個對象的所有的屬性和jingwei這個對象的所有的 屬性完全相同。而我們只能在用對象的方法去改變著寫屬性了!很顯然,這種方法不大好!我們需要一種方法在創建對象的時候為對象的屬性賦予「我們想要的 值」。
相信你也看到了,默認構造函數就顯得無能為力了。我們需要的是帶參數的構造函數,在創建對象時,我們把參數傳給構造函數,這樣就能完成了上述的功能!口說無憑,還是來看個實例吧:

//employee.java

public class employee{

private String name; //員工姓名

private int age; //員工年齡

private char sex; //員工性別

private float emolument; //員工薪水

private boolean lunch; //員工午餐

//……等等

public employee(String n,int a,char s,float e,boolean l){ //看這個構造函數

name = n; //設置員工姓名

age = a; //設置員工年齡

sex = s; //設置員工性別

emolument = e; //設置員工薪水

lunch =l; //設置員工午餐

}

public void heater(){ //這個方法是用來加工員工的午餐

lunch = true;

}

//……等等

};

這樣一來,在創建對象的同時我們就可以給他賦予我們想要的值,很顯然,這可就方便多了。哦,對了!還沒有告訴你怎麼創建呢!哈哈,往前翻幾頁你會看到這句話:
jingwei = new employee();這是創建一個對象,而我們把它改成
jingwei = new employee("jingwei",20,'M',100,false);這樣一來,所有的工作都完成了,呵呵!(在創建對象的同時賦予了我們想要的「初值」)

2.3.2重載構造函數:
我還是先把概念給你吧,讓你有個認識,隨後我們在進行論述。
在JAVA中:
1. 函數重載是一個類中聲明了多個同名的方法,但有不同的參數個數和參數類型。
2. 函數重構是指在子類中聲明與父類同名的方法,從而覆蓋了父類的方法。重構解決了子類與父類的差異問題。(在討論到繼承時我會詳細說明)
在C++中:
1. 數重載的概念一樣。
2. 重構的概念可就不一樣了,C++中功能更為龐大的虛函數。更詳細內容這里就不錯過多介紹了!
其實關於重載的概念你並不陌生,在編程中相信你也接觸過。呵呵!讓我們來舉個操作符重載的例子你就會明白了,(JAVA中不支持這個功能)我們定義三個整數變數:

int i1=2, i2=3,i3=0;
i3 = i1 + i2;

此時i3=5;加號實現了兩個數相加的運算功能。然而我們現在要定義三個字元串變數:

String str1=」jing」, str2=」wei」,str3=」」;
str3 = str1 + str2;

此時str3 = 「jingwei」;加號實現了兩個字元串相加的運算功能。同樣是加號,既可以把兩個整型的變數加在一起,也可以把兩個字元串類型的變數加在一起。同一個 操作符實現了不同的功能------這就是所謂的操作符重載(嘿嘿,我說你一定見過吧:)!不就好像是漢語中的一詞多意一樣!我需要說明一下的是,C++ 中的操作符重載可沒有這么簡單。比如,我們可以對兩個自定義類型的對象進行相加的運算,進行賦值的運算。這樣書寫簡潔明了,而且非常實用。當然,關於操作 符重載的話題太多了,有興趣再看看書吧!
我們把操作符的話題在轉到函數上來,我們一直強調的是「對象調方法」------對象其實調的是方法的「名稱」。而我們現在要對方法進想重載,也就是 定義多個相同名稱的函數,這樣計算機在調用的時候不會混淆嘛?我想應該不會的,呵呵,因為僅僅是函數名稱相同,而我們在調用函數時會把參數傳遞給他的。既 是沒有參數也是一種參數傳遞參數的信息(信息為無參數)!然而由於參數類型、參數數量、返回值類型不同我們就可以對相同名稱的函數進行區分�

閱讀全文

與用什麼故事解釋面向對象編程相關的資料

熱點內容
如何給網站掛黑鏈 瀏覽:282
360斷網急救箱網路異常修復不了 瀏覽:889
身份證驗證的js文件 瀏覽:994
什麼人經常換微信名字 瀏覽:707
網站源碼挖掘 瀏覽:944
荔枝fm和app哪個播放量好 瀏覽:535
樂秀音頻在哪個文件里 瀏覽:486
以數據說話什麼意思 瀏覽:319
java中對象 瀏覽:794
酷狗網路機頂盒如何設置 瀏覽:408
threejs添加文字 瀏覽:436
微信春節理財通 瀏覽:948
qq主題模塊應用教程 瀏覽:993
javaweb項目打包 瀏覽:59
qq主題是哪個文件夾里 瀏覽:642
超越狂暴升級txt書包 瀏覽:263
cad復制不能粘貼到新建文件 瀏覽:565
linux網路socket編程 瀏覽:926
戰爭雷霆客戶端在哪個文件里 瀏覽:847
如何授權點淘app讀取步數 瀏覽:671

友情鏈接