面向?qū)ο笃鋵?shí)是現(xiàn)實(shí)世界模型的自然延伸?,F(xiàn)實(shí)世界中任何實(shí)體都可以看做是對(duì)象。對(duì)象之間通過消息相互作用。另外,現(xiàn)實(shí)世界中任何實(shí)體都可歸屬于某類事物,任何對(duì)象都是某一類事物的實(shí)例。如果說傳統(tǒng)的過程式編程語言是以過程為中心、以算法為驅(qū)動(dòng)的話,面向?qū)ο蟮木幊陶Z言則是以對(duì)象為中心,以消息為驅(qū)動(dòng)。用公式表示,過程式編程語言為:程序=算法+數(shù)據(jù);面向?qū)ο缶幊陶Z言為:程序=對(duì)象+消息。
所有面向?qū)ο缶幊陶Z言都支持3個(gè)概念,即封裝、多態(tài)性和繼承,Java也不例外?,F(xiàn)實(shí)世界中的對(duì)象均有屬性和行為,映射到計(jì)算機(jī)程序上,屬性則表示對(duì)象的數(shù)據(jù),行為表示對(duì)象的方法(其作用是處理數(shù)據(jù)或同外界交互)。所謂封裝,就是用一個(gè)自主式框架把對(duì)象的數(shù)據(jù)和方法連在一起形成一個(gè)整體。可以說,對(duì)象是支持封裝的手段,是封裝的基本單位。Java語言的封裝性較強(qiáng),因?yàn)镴ava無全程變量,無主函數(shù),在Java中絕大部分成員是對(duì)象,只有簡單的數(shù)字類型、字符類型和布爾類型除外。而對(duì)于這些類型,Java也提供了相應(yīng)的對(duì)象類型以便與其他對(duì)象交互操作。
“這個(gè)世界是由什么組成的?”這個(gè)問題如果讓不同的人來回答會(huì)得到不同的答案。如果是一個(gè)化學(xué)家,他也許會(huì)告訴你:“還用問嗎?這個(gè)世界是由分子、原子、離子等化學(xué)物質(zhì)組成的”。如果是一個(gè)畫家,他也許會(huì)告訴你:“這個(gè)世界是由不同的顏色所組成的”。但如果讓一個(gè)分類學(xué)家來考慮問題就有趣多了,他會(huì)告訴你:“這個(gè)世界是由不同類型的物與事所構(gòu)成的”。好!作為面向?qū)ο蟮某绦騿T,我們要從分類學(xué)家的角度去考慮問題!是的,這個(gè)世界是由動(dòng)物、植物等組成的。動(dòng)物又分為單細(xì)胞動(dòng)物、多細(xì)胞動(dòng)物、哺乳動(dòng)物等,哺乳動(dòng)物又分為人、大象、老虎……就這樣分下去了!
現(xiàn)在,從抽象的角度,我們給“類”下個(gè)定義吧!我的意思是,從抽象的角度,你回答我“什么是人類?”首先讓我們來看看人類所具有的一些特征,這個(gè)特征包括屬性(一些參數(shù)、數(shù)值)及方法(一些行為,他能干什么)。每個(gè)人都有身高、體重、年齡、血型等一些屬性。還有人會(huì)勞動(dòng)、人都會(huì)直立行走、人都會(huì)用自己的頭腦去創(chuàng)造工具等方法。人之所以能區(qū)別于其他類型的動(dòng)物,是因?yàn)槊總€(gè)人都具有人這個(gè)群體的屬性與方法。“人類”只是一個(gè)抽象的概念,它僅僅是一個(gè)概念,它是不存在的實(shí)體。但是所有具備“人類”這個(gè)群體的屬性與方法的對(duì)象都叫人。這個(gè)對(duì)象“人”是實(shí)際存在的實(shí)體。每個(gè)人都是人這個(gè)群體的一個(gè)對(duì)象。老虎為什么不是人?因?yàn)樗痪邆淙诉@個(gè)群體的屬性與方法,老虎不會(huì)直立行走,不會(huì)使用工具等,所以說老虎不是人。
由此可見,類描述了一組有相同特性(屬性)和相同行為(方法)的對(duì)象。在程序中,類實(shí)際上就是數(shù)據(jù)類型,例如,整數(shù)、小數(shù)等。整數(shù)也有一組特性和行為。面向過程的語言與面向?qū)ο蟮恼Z言的區(qū)別就在于,面向過程的語言不允許程序員自己定義數(shù)據(jù)類型,而只能使用程序中內(nèi)置的數(shù)據(jù)類型。而為了模擬真實(shí)世界,為了更好地解決問題,我們需往往要?jiǎng)?chuàng)建解決問題所必需的數(shù)據(jù)類型。
面向?qū)ο缶幊虨槲覀兲峁┝私鉀Q方案。以下的考題來自真實(shí)的筆試資料,希望讀者先不要看答案,自我解答后再與答案加以比對(duì),找出自己的不足。
11.1 面向?qū)ο蟮幕靖拍?/p>
面試?yán)}1:對(duì)象與實(shí)例有什么區(qū)別?
解析:在Java的內(nèi)存分配中,對(duì)象和實(shí)例是不同的,前者分配在內(nèi)存堆里,后者分配在堆棧里,至于為什么要這樣分,參考一下其他的資料。對(duì)象是不變的東西,它是對(duì)客觀事物的抽象,實(shí)例是對(duì)操作對(duì)象的引用,你不能直接操作對(duì)象。
答案:對(duì)象和實(shí)例從宏觀的角度看,區(qū)別是:對(duì)象是同類事物的一種抽象表現(xiàn)形式,而實(shí)例是對(duì)象的具體化,一個(gè)對(duì)象可以實(shí)例化很多實(shí)例,對(duì)象就是一個(gè)模型,實(shí)例是照著這個(gè)模型生產(chǎn)的最終產(chǎn)品。實(shí)際上就是這樣,一個(gè)對(duì)象可以實(shí)例化N個(gè)實(shí)例。就像根據(jù)一個(gè)模型可以制造多個(gè)實(shí)際的產(chǎn)品一樣。
從內(nèi)存分配的角度來看,對(duì)象是保存在堆中的,而實(shí)例是存儲(chǔ)在棧中的,實(shí)例其實(shí)只是對(duì)象的一個(gè)引用,也就是指向?qū)ο蟮闹羔槨?/p>
面試?yán)}2:Java中所有的類都繼承了java.lang.Object類,而在C++中沒有像java.lang.Object這樣的類,這是為什么呢?都是面向?qū)ο?,Java這樣做有什么好處呢?
解析:Java采用的是單根結(jié)構(gòu),所有的類都繼承了java.lang.Object類。對(duì)于Java這種純面向?qū)ο蟮恼Z言來說,這種設(shè)計(jì)具有很好的靈活性,比如對(duì)垃圾收集來說很有利,所有的類都具有java.lang.Object類具有的方法等。C++沒有更多這樣的方法,大概是為了向后兼容。向C兼容,滿足它設(shè)計(jì)上最大的靈活性。
答案:C++的特點(diǎn)是指針,一個(gè)指針可以指向任何的對(duì)象、結(jié)構(gòu)、基本類型、函數(shù)。
Java沒有指針類型,所以Java用Object基礎(chǔ)類的共同特征來實(shí)現(xiàn)所有對(duì)象類型之間的轉(zhuǎn)換。
面試?yán)}3:聲明與定義之間的區(qū)別是什么?在Java里聲明和定義能否分開?
解析:
聲明:一種把一個(gè)名稱引入或者重新引入到某個(gè)作用域的構(gòu)造。
定義:它也是一種聲明,但該聲明必須給出被聲明實(shí)體的細(xì)節(jié)。
對(duì)于變量而言,這里的細(xì)節(jié)是指:為被聲明實(shí)體保留存儲(chǔ)空間。
對(duì)于class類型和函數(shù)定義而言,指的是包含有一對(duì)花括號(hào)內(nèi)容的聲明。
對(duì)于外部變量而言,指的是前面沒有關(guān)鍵字extern或者在聲明時(shí)就進(jìn)行初始化。
變量的聲明有以下兩種情況。
一種是需要建立存儲(chǔ)空間的。例如,int a在聲明的時(shí)候就已經(jīng)建立了存儲(chǔ)空間。
另一種是不需要建立存儲(chǔ)空間的,例如,extern int a。其中,變量a是在別的文件中定義的。前者是“定義性聲明(defining declaration)”,或者稱為“定義(definition)”,而后者是“引用性聲明(referencing declaration)”。從廣義的角度來講,聲明中包含著定義,但是并非所有的聲明都是定義,例如int a,它既是聲明,同時(shí)又是定義。然而對(duì)于extern a來講,它只是聲明不是定義。在一般的情況下我們常常這樣敘述,把建立空間的聲明稱為“定義”,而把不需要建立存儲(chǔ)空間的聲明稱為“聲明”。很明顯在這里指的聲明的范圍是比較窄的,也就是說非定義性質(zhì)的聲明。
答案:
變量的定義和聲明的區(qū)別在于是否分配內(nèi)存,如果分配內(nèi)存就是定義,否則就是聲明。
類中的變量只是聲明而不是定義,因?yàn)樗皇穷惵暶鞯囊徊糠?。不同于變量的定義,類的定義是一種新的類型的定義,只有實(shí)例化后才會(huì)分配內(nèi)存。所以類成員變量只是聲明而不是定義。
在Java中,利用Interface,也可以將聲明和實(shí)現(xiàn)分開。如下所示。
//MyInterface.java
public interface MyInterface
{
void method();
}
//MyImpl.java
public class implements MyInterface
{
public void method()
{
//……
}
}
面試?yán)}4:Which is incorrect about the class?(關(guān)于類的描述下面哪個(gè)是錯(cuò)誤的?)[金山公司2005年面試題]
A.A class is a blueprint to objects.
B.We use the keyword class to create a class construct.
C.Once a class is declared, the class name becomes a type name and can be used to declare variables.
D.The class is same as the struct, and there are no different betweenclass and struct.
解析:這道題的考點(diǎn)是類的概念。
答案:D
面試?yán)}5:Which is incorrect about the OOP?(下面關(guān)于面向?qū)ο蠹夹g(shù)的敘述哪個(gè)是錯(cuò)誤的?)[金山公司2005年面試題]
A.The central idea of OOP is to build programs using software objects.
B.The OOP focuses mainly on the step-by-step procedure as procedure-oriented programing.
C.The OOP offers many advantages: simplicity,modularity,modifiability,extensibility, and so on.
D.The key concept of object orientation is the attachment of procedure to data.
解析:OOP的概念面試?yán)}。面向?qū)ο蠛兔嫦蜻^程不能混為一談。
答案:B,D