第11章 面向?qū)ο?/p>

11.1 面向?qū)ο蟮幕靖拍?/p>

Java程序員面試寶典 作者:歐立奇、朱梅、段韜 編著


  面向?qū)ο笃鋵嵤乾F(xiàn)實世界模型的自然延伸?,F(xiàn)實世界中任何實體都可以看做是對象。對象之間通過消息相互作用。另外,現(xiàn)實世界中任何實體都可歸屬于某類事物,任何對象都是某一類事物的實例。如果說傳統(tǒng)的過程式編程語言是以過程為中心、以算法為驅(qū)動的話,面向?qū)ο蟮木幊陶Z言則是以對象為中心,以消息為驅(qū)動。用公式表示,過程式編程語言為:程序=算法+數(shù)據(jù);面向?qū)ο缶幊陶Z言為:程序=對象+消息。

  所有面向?qū)ο缶幊陶Z言都支持3個概念,即封裝、多態(tài)性和繼承,Java也不例外?,F(xiàn)實世界中的對象均有屬性和行為,映射到計算機程序上,屬性則表示對象的數(shù)據(jù),行為表示對象的方法(其作用是處理數(shù)據(jù)或同外界交互)。所謂封裝,就是用一個自主式框架把對象的數(shù)據(jù)和方法連在一起形成一個整體??梢哉f,對象是支持封裝的手段,是封裝的基本單位。Java語言的封裝性較強,因為Java無全程變量,無主函數(shù),在Java中絕大部分成員是對象,只有簡單的數(shù)字類型、字符類型和布爾類型除外。而對于這些類型,Java也提供了相應的對象類型以便與其他對象交互操作。

  “這個世界是由什么組成的?”這個問題如果讓不同的人來回答會得到不同的答案。如果是一個化學家,他也許會告訴你:“還用問嗎?這個世界是由分子、原子、離子等化學物質(zhì)組成的”。如果是一個畫家,他也許會告訴你:“這個世界是由不同的顏色所組成的”。但如果讓一個分類學家來考慮問題就有趣多了,他會告訴你:“這個世界是由不同類型的物與事所構(gòu)成的”。好!作為面向?qū)ο蟮某绦騿T,我們要從分類學家的角度去考慮問題!是的,這個世界是由動物、植物等組成的。動物又分為單細胞動物、多細胞動物、哺乳動物等,哺乳動物又分為人、大象、老虎……就這樣分下去了!

  現(xiàn)在,從抽象的角度,我們給“類”下個定義吧!我的意思是,從抽象的角度,你回答我“什么是人類?”首先讓我們來看看人類所具有的一些特征,這個特征包括屬性(一些參數(shù)、數(shù)值)及方法(一些行為,他能干什么)。每個人都有身高、體重、年齡、血型等一些屬性。還有人會勞動、人都會直立行走、人都會用自己的頭腦去創(chuàng)造工具等方法。人之所以能區(qū)別于其他類型的動物,是因為每個人都具有人這個群體的屬性與方法。“人類”只是一個抽象的概念,它僅僅是一個概念,它是不存在的實體。但是所有具備“人類”這個群體的屬性與方法的對象都叫人。這個對象“人”是實際存在的實體。每個人都是人這個群體的一個對象。老虎為什么不是人?因為它不具備人這個群體的屬性與方法,老虎不會直立行走,不會使用工具等,所以說老虎不是人。

  由此可見,類描述了一組有相同特性(屬性)和相同行為(方法)的對象。在程序中,類實際上就是數(shù)據(jù)類型,例如,整數(shù)、小數(shù)等。整數(shù)也有一組特性和行為。面向過程的語言與面向?qū)ο蟮恼Z言的區(qū)別就在于,面向過程的語言不允許程序員自己定義數(shù)據(jù)類型,而只能使用程序中內(nèi)置的數(shù)據(jù)類型。而為了模擬真實世界,為了更好地解決問題,我們需往往要創(chuàng)建解決問題所必需的數(shù)據(jù)類型。

  面向?qū)ο缶幊虨槲覀兲峁┝私鉀Q方案。以下的考題來自真實的筆試資料,希望讀者先不要看答案,自我解答后再與答案加以比對,找出自己的不足。

  11.1 面向?qū)ο蟮幕靖拍?/p>

  面試例題1:對象與實例有什么區(qū)別?

  解析:在Java的內(nèi)存分配中,對象和實例是不同的,前者分配在內(nèi)存堆里,后者分配在堆棧里,至于為什么要這樣分,參考一下其他的資料。對象是不變的東西,它是對客觀事物的抽象,實例是對操作對象的引用,你不能直接操作對象。

  答案:對象和實例從宏觀的角度看,區(qū)別是:對象是同類事物的一種抽象表現(xiàn)形式,而實例是對象的具體化,一個對象可以實例化很多實例,對象就是一個模型,實例是照著這個模型生產(chǎn)的最終產(chǎn)品。實際上就是這樣,一個對象可以實例化N個實例。就像根據(jù)一個模型可以制造多個實際的產(chǎn)品一樣。

  從內(nèi)存分配的角度來看,對象是保存在堆中的,而實例是存儲在棧中的,實例其實只是對象的一個引用,也就是指向?qū)ο蟮闹羔槨?/p>

  面試例題2:Java中所有的類都繼承了java.lang.Object類,而在C++中沒有像java.lang.Object這樣的類,這是為什么呢?都是面向?qū)ο?,Java這樣做有什么好處呢?

  解析:Java采用的是單根結(jié)構(gòu),所有的類都繼承了java.lang.Object類。對于Java這種純面向?qū)ο蟮恼Z言來說,這種設(shè)計具有很好的靈活性,比如對垃圾收集來說很有利,所有的類都具有java.lang.Object類具有的方法等。C++沒有更多這樣的方法,大概是為了向后兼容。向C兼容,滿足它設(shè)計上最大的靈活性。

  答案:C++的特點是指針,一個指針可以指向任何的對象、結(jié)構(gòu)、基本類型、函數(shù)。

  Java沒有指針類型,所以Java用Object基礎(chǔ)類的共同特征來實現(xiàn)所有對象類型之間的轉(zhuǎn)換。

  面試例題3:聲明與定義之間的區(qū)別是什么?在Java里聲明和定義能否分開?

  解析:

  聲明:一種把一個名稱引入或者重新引入到某個作用域的構(gòu)造。

  定義:它也是一種聲明,但該聲明必須給出被聲明實體的細節(jié)。

  對于變量而言,這里的細節(jié)是指:為被聲明實體保留存儲空間。

  對于class類型和函數(shù)定義而言,指的是包含有一對花括號內(nèi)容的聲明。

  對于外部變量而言,指的是前面沒有關(guān)鍵字extern或者在聲明時就進行初始化。

  變量的聲明有以下兩種情況。

  一種是需要建立存儲空間的。例如,int a在聲明的時候就已經(jīng)建立了存儲空間。

  另一種是不需要建立存儲空間的,例如,extern int a。其中,變量a是在別的文件中定義的。前者是“定義性聲明(defining declaration)”,或者稱為“定義(definition)”,而后者是“引用性聲明(referencing declaration)”。從廣義的角度來講,聲明中包含著定義,但是并非所有的聲明都是定義,例如int a,它既是聲明,同時又是定義。然而對于extern a來講,它只是聲明不是定義。在一般的情況下我們常常這樣敘述,把建立空間的聲明稱為“定義”,而把不需要建立存儲空間的聲明稱為“聲明”。很明顯在這里指的聲明的范圍是比較窄的,也就是說非定義性質(zhì)的聲明。

  答案:

  變量的定義和聲明的區(qū)別在于是否分配內(nèi)存,如果分配內(nèi)存就是定義,否則就是聲明。

  類中的變量只是聲明而不是定義,因為它只是類聲明的一部分。不同于變量的定義,類的定義是一種新的類型的定義,只有實例化后才會分配內(nèi)存。所以類成員變量只是聲明而不是定義。

  在Java中,利用Interface,也可以將聲明和實現(xiàn)分開。如下所示。

  //MyInterface.java  

  public   interface   MyInterface 

  {  

  void   method();  

  }  

  //MyImpl.java  

  public   class   implements   MyInterface 

  {  

  public   void   method()

  {  

  //……

  }  

  }  

  面試例題4:Which is incorrect about the class?(關(guān)于類的描述下面哪個是錯誤的?)[金山公司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.

  解析:這道題的考點是類的概念。

  答案:D

  面試例題5:Which is incorrect about the OOP?(下面關(guān)于面向?qū)ο蠹夹g(shù)的敘述哪個是錯誤的?)[金山公司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的概念面試例題。面向?qū)ο蠛兔嫦蜻^程不能混為一談。

  答案:B,D


上一章目錄下一章

Copyright ? 讀書網(wǎng) m.ranfinancial.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號 鄂公網(wǎng)安備 42010302001612號