官术网_书友最值得收藏!

3.1 從數據開始

語言程序是進行數據處理的。有什么樣的數據以及對數據進行什么樣的處理,決定了程序怎么寫,與此同時對選擇什么樣的語言進行開發也提出了要求。

3.1.1 類的角色

本章是承前啟后的一章。本章的意圖是給讀者一個漸進的臺階,先蜻蜓點水、泛泛而論面向對象,了解一些名詞術語和基礎知識,盡管可能不求甚解。然后再進入面向對象的世界里使用洪荒之力。這樣避免讀者直接接觸面向對象復雜的語法而頭昏腦脹。經驗表明這種情況很常見。

關于類,學過前面兩章,我們知道它是Java程序的外殼。在這個殼里面定義一個或多個方法,其中有一個main方法(對Java applications而言),程序執行從main方法開始,也在main方法結束,執行期間可能調用其他方法。

好的,我們再看一看這個熟悉的結構:

 

class Concrete Name{ // Concrete Name是椰子殼

  public static void main(String[] args){ //椰汁

    //write your code //椰汁

  }

}

一個問題是:類僅僅是個程序代碼的外殼嗎?像椰子殼?人們喝的是外殼包藏著的甜蜜的椰汁,那個生硬的外殼是個沒價值的東西?

并非如此。我們不久將發現:類中可以封裝豐富的內容,它代表著一類事物。我們的程序中可以有不止一個類,類和類之間相互關聯著,就像現實世界中諸多的事物相互關聯著一樣。

3.1.2 事物數據化

今日世界已經進入信息化時代。各行各業都在使用計算機管理各種數據信息。在電子商務系統中,商品信息描述為如表3-1所列的數據。

表3-1 商品信息表

在學校的教務管理系統中,你會看到如表3-2所列的數據。

表3-2 教師信息表

在圖書管理系統中,書籍信息數據以表3-3形式存儲。

表3-3 圖書信息表

這樣的例子數不勝數。

這些表中存儲的是各種類型的數據,它們表示了不同的事物,即商品、教師和圖書。表的每一列表示事物的一個屬性,例如圖書的書號、編者、定價等。這些不同列既可能是數值型的,可能是日期型的,可能是字符串的,也可能是其他的類型。

表中的一行數據表示具體的一種商品如一雙Li-Ning牌運動鞋、一名教師如欒小晨、一本書如《計算機網絡》。

為了區別于那些基本類型的數據,我們把這些代表某種事物的“復雜”數據稱為對象。

對象數據大量出現在程序中,當然是計算機應用領域拓展到事物管理階段的結果。

為什么面向對象的語言如Simula-67和Smalltalk在20世紀60年代即推出,但是面向對象語言和面向對象成為主流軟件開發工具和開發方法卻是在90年代。在60年代軟件危機出現時,面向過程的結構化語言應運而生,其中最具代表性的語言包括Pascal、C語言等。其后在80年代和90年代,計算機的微型化和網絡化使之從束之高閣到走入尋常百姓家,計算機應用迅速普及,應用領域也迅速拓展。大量的事務管理數據處理需求導致軟件規模迅速膨脹,要求語言安全、高效、易于維護軟件。這使得一批新的面向對象語言登堂入室,被廣大學習者和開發者青睞,其中的典型語言包括Java、C++等。

拓展知識

Smalltalk被公認為歷史上第二個面向對象的程序設計語言和第一個真正的集成開發環境 (IDE)。由Alan Kay,Dan Ingalls,Ted Kaehler,Adele Goldberg等于20世紀70年代初在Xerox PARC開發。Smalltalk對其他眾多的程序設計語言的產生起到了極大的推動作用,主要有Objective-C,Actor,Java 和Ruby等。90年代的許多軟件開發思想得利于Smalltalk,例如設計模式、極限編程和重構等。

3.1.3 對象的特殊性

對象不同于基本類型數據,它們有什么特殊性呢?

首先我們發現,對象沒有現成的類型可用,需要自己動手定義。就是說,數據都有個類型,1、2、3是整型數,int用于定義整型變量;“a”“b”“c”是字符型數,char用于定義字符型變量;“true”“false”是布爾型數,布爾型變量用boolean定義。張三、李四這兩個對象是什么類型的,怎么定義他們的類型?

這就回到了本章開頭的問題,類名不是簡單的沒有意義的“椰子殼”,它意味著很多。我們需要用class來定義一個類,這個類就是類型。假如張三、李四的類型是學生,那就需要定義學生類Student。在類中需要說明這類事物有哪些屬性,屬性可以列舉許多,在系統中根據需要進行選擇。

 

class Student{    //對象的類

……        //對象的屬性

……         //對象的行為

}

對象的特殊性還在于,不同的對象對應不同的操作(處理),比如說學生可能會注冊、選課,正如數值有加減乘除取余操作?;绢愋偷牟僮?,在Java語言中用算符完成。而對象的操作需要自己定義。定義哪些操作?在哪里定義?這些都是必須做的事。

圖3-1 基本類型與對象

關于對象有另一個問題:既然萬事萬物皆為對象,1、2、3、'a'、'b'、'c'不是事物?它們不是對象?

這是個值得思考的問題。事實上,確實有的語言例如Ruby把一切數據都作為對象看待, 1、2、3、'a'、'b'、'c'在Ruby中也是對象。但是,Java不是這樣。Java中有了基本類型int、char、float、double等,用它們定義那些基本類型的數據。Java似乎把基本類型數據排斥在萬事萬物之外了,分類示意如圖3-1所示。Java和Ruby在這一點孰是孰非,讀者將來可以給出判斷。

總之,Java把那些復雜的事物數據,稱為對象。

這里已經不可避免地提到了類,我們馬上把目光移向它。

3.1.4 對象分類

俗話說,物以類聚。在對象數量很多的情況下,需要對其分類。表3-1~表3-3,表示的是不同的事物類型,因為每個表的屬性名與其他表不同。對象為什么要分類?

想象一下:在一個大型電子商務網站,網站單日銷售額可達幾十億甚至幾百億元,銷售的商品數量特別大,這意味著需要管理的數據可能是海量的。那么,海量的商品信息如何保存呢?需要考慮的問題主要有兩個:首先是對商品分類,然后是確定商品的屬性信息。某網站顯示其商品種類的方式如圖3-2所示。

圖3-2 某電商網站商品分類

客戶在網上購物的時候,首先確定買哪類商品,首先需要在分類列表中選擇一個類別,例如要買筆記本計算機,就選擇計算機、辦公類。然后再按照價格、屏幕尺寸、處理器種類等商品屬性進行選擇,如圖3-3所示。

對象分類是為了管理方便。分類存儲,分類顯示,按屬性進行查詢和顯示,用戶選擇操作簡單快捷。正如在超市里,琳瑯滿目的商品如果不分區分類地擺放在貨架上,大家去超市購物勢必像大海撈針一樣費力,如果那樣,誰還愿意逛超市?誰還能輕松購物呢?

對象分類的依據是它們的屬性。一類事物與其他類事物不同,是由于不同事物類有著不同的屬性。

對象什么樣,誰來說明?用類來說明,類就是類型。例如int規定了它定義的變量的大小,一個類規定了它定義的對象具有哪些屬性以及可以進行哪些操作,因此說類就是類型。一個類是一些對象的代表,用這個類定義的對象則是類的具體實例。

圖3-3 按商品屬性選擇

現實生活中的對象分類是我們習以為常的。在Java程序中的類設計與此相對應。類設計首要的任務就是關注它具有哪些屬性。

3.1.5 對象處理

對象處理

程序是要處理數據的。問題本身決定了進行什么處理。比如教師提交的學生成績,按要求應該把平時成績和期末考試成績按比例折算出總成績,還要把分數按照公式折合成績點(Grade Point Average,GPA),然后按績點從高到低排序,作為評獎學金或保送研究生的依據。

對象的數據處理,也是根據程序的任務,以及要解決的問題的需要,確定定義哪些方法(method)。對象的處理方法也和屬性一樣,往往是對象獨有的。例如平面幾何圖形類對象有計算面積和周長的需求,可能需要定義area()和perimeter()方法。但是對于立體類對象,往往需要計算體積,那就需要定義volume()方法了。

再比如,在學校的管理系統中,學生類Student對象,可能要定義注冊、交學費、選課等方法,而教師則有提交教學材料、提交成績等方法。

不同類的對象也會用相同的操作,參見例3.1可知。但是,重點關注的應該是不同的操作。

看下面的例子,可以關注一下類中定義的屬性和方法有哪些?概要了解類定義和對象定義的關系。語法細則在此不必深究。

【例3.1】定義圓、矩形和三角形類,觀察邊長相等情況下哪種圖形的面積最大。

【分析】試圖用這個例子說明,一個程序可以定義多個類,類中可以定義數據和方法,用方法可以處理數據。對代碼做到理解要旨,不求甚解即可。要比較周長為18的3個圖形的面積,假設圓的半徑為18 /(2×3.14)=2.866、矩形的寬(width)和高(height)分別為5和4、三角形三邊均為6。

【代碼】

 

class Circle

{

  double x, y, r;//圓的位置坐標、半徑

  Circle(double x1,double y1,double r1) //構造方法,為對象屬性x,y,r賦初值的

  {

    x = x1;

    y = y1;

    r = r1;

  }

  double area() //計算圓面積方法

  {

    return 3.14*r*r;

  }

}

class Rectangle

{

  double width, height;//矩形長、寬

  Rectangle(double a, double b)

  {

    width = a;

    height = b;

  }

  double area() //計算矩形面積方法

  {

    return width*height;

  }

}

class Triangle

{

  double a, b, c;//三角形三條邊

  Triangle(double a1,double b1,double c1)

  {

    a = a1;

    b = b1;

    c = c1;

  }

  double area() //計算三角形面積方法

  {

    double s = (a + b + c)/2;

    //用海倫公式求三角形面積,sqrt()是計算平方根的方法

    return Math.sqrt(s*(s-a)*(s-b)*(s-c));

  }

}

public class Example3_1

{

  public static void main(String[] para)

  {

    Circle c = new Circle(100,50,2.866);//定義一個圓類對象

    Rectangle rect = new Rectangle(5,4);//定義一個矩形對象

    Triangle tr = new Triangle(6,6,6);//定義一個三角形對象

    System.out.println("The area of the circle is: "+c.area());

    System.out.println("The area of the rectangle is: "+rect.area());

    System.out.println("The area of the triangle is: "+tr.area());

  }

}

程序運行結果如圖3-4所示。

圖3-4 例3.1程序運行結果

主站蜘蛛池模板: 新乐市| 武城县| 灵川县| 河曲县| 湖口县| 康乐县| 楚雄市| 万盛区| 西华县| 永丰县| 贺州市| 浪卡子县| 南皮县| 嵩明县| 黄冈市| 启东市| 伊金霍洛旗| 藁城市| 东平县| 石阡县| 宜都市| 弥勒县| 彰武县| 班玛县| 北票市| 莱芜市| 贡嘎县| 九江市| 江油市| 阿巴嘎旗| 仁寿县| 个旧市| 安顺市| 楚雄市| 石屏县| 剑川县| 武宁县| 丰都县| 南丹县| 新野县| 仙桃市|