面向對象編程,我的思想[下]

.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([color=Brown]String n,int a,char s,float e,boolean l[/color]

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++中的操作符重載可沒有這麼簡單。比如,我們可以對兩個自定義類型的對象進行相加的運算,進行賦值的運算。這樣書寫簡潔明瞭,而且非常實用。當然,關於操作符重載的話題太多了,有興趣再看看書吧!

我們把操作符的話題在轉到函數上來,我們一直強調的是“對象調方法”------對象其實調的是方法的“名稱”。而我們現在要對方法進想重載,也就是定義多個相同名稱的函數,這樣計算機在調用的時候不會混淆嘛?我想應該不會的,呵呵,因爲僅僅是函數名稱相同,而我們在調用函數時會把參數傳遞給他的。既是沒有參數也是一種參數傳遞參數的信息(信息爲無參數)!然而由於參數類型、參數數量、返回值類型不同我們就可以對相同名稱的函數進行區分了!目的只有一個,用簡便的方法實現更多的功能。還是舉個例子吧,重載構造函數!

public class employee{

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

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

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

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

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

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

}
[/color]
 

public employee(){   [color=Orange]//請注意這個函數沒有參數

       name = “jw”;

       age = 20;

       sex = ’W’;

       emolument = 99;

       lunch = true

}[/color]

//……等等

};

 
看,在一個類中有兩個名稱相同的函數,可我們在使用的時候系統如何知道我們調用的是那個版本的函數呢?呵呵,我剛剛說過了,可以通過函數的參數類型、參數數量、返回值類型來確定。現在我們接着試驗,我們創建兩個對象其中的一個調用帶參數的構造函數,第二個對象調用缺省值的構造函數。我們來看看結果:

jingwei = new employee("jingwei",20,'M',100,false);/*創建這個對象的時候調用的是帶參數的構造函數*/

flashmagic = new employee();//創建這個對象是調用的是卻省值的構造函數

而得到的結果呢?讓我們一起來看一看!

Jingwei這個對象中:                    flashmagic這個對象中:

name        jingwei                     name           jw

age          20                         age            20

sex          M                         sex             W

emolument   100                        emolument       99

lunch        false                       lunch           true

看,雖然是兩個名稱完全相同的函數,但完成了不同的工作內容。呵呵!關於函數重載我們就料到這裏吧,我相信你已經有個大印象了,而更詳細的內容仍需要你的努力!

重載普通的函數與重載構造函數大同小異,不過他多了一個this指針!this一般是對當前對象的引用。這麼說吧,如果涉及到兩個以上的對象時就會使用this指針。每個成員函數都有一個this指針,它是一個隱藏的參數,this指針只向調用它的對象!我說過方法只有一份,而對象都有自己的屬性,當對象調用方法來先是屬性的時候,他怎麼來判斷調用的時不是自己的屬性呢?這就需要this指針來大顯神威了。

關於拷貝構造函數、內聯函數、虛函數、模版等歐就不做過多的討論了,因爲JAVA中好像沒有這些了。不過我需要提醒你一下的是,在C++中,類內定義的函數自動轉換爲內聯函數,而這好像與我前面提到的思想有衝突。因爲內聯函數的目的是減少函數調用的開銷!呵呵!我也沒繞出來呢!還請哪爲大蝦指點一二!謝!

2.3.3 初始化與賦值

這裏我卻要提醒你一下的是,初始化與賦值是完全不同的兩個概念。創建一個類的時候會調用這個類的構造函數對對象的屬性進行初始化。而如果以後再把這個對象賦給其他同類型的對象時可就沒那麼簡單了。在JAVA中直接賦值就行了,因爲JAVA中取消了指針,不存在指針的深拷貝與前拷貝問題。而在C++中就需要拷貝構造函數以及操作符重載了。因爲JAVA中不牽扯這些東西,所以偶就不做過多介紹了。詳情請參閱相關書籍吧!

2.3.4析構函數:

JAVA中不再支持指針了,所以你感覺不到它的重要性,因爲系統會自動爲你釋放內存。而在C++中一切都是手動的。在構造函數中new了一個指針,在析夠函數中就要delete這個指針。

2.3.5靜態:

現在我們再來看一看“靜態”是咋一回事兒!

把一個變量或函數聲明爲靜態的需要“static”這個關鍵字。聲明靜態的目的是“爲某個類的所有對象的某個屬性或方法分配單一的存儲空間”。靜態的數據是屬於類的,不屬於任何的對象。靜態的數據在聲明的時候系統就爲他分配了內存空間,而不用等到創建對象時。舉個例子來幫你更好的理解它吧。

還是接着上面的例子。還記得剛剛我說過的員工能用微波爐熱飯的事情吧。現在我們要找一個手套,畢竟想把熱好的飯從微波爐裏拿出來直接下手是不行的。我把手套定義成一個布爾型的變量,它有乾淨和髒兩種狀態。想想看手套是屬於誰的?所有對象?不對!因爲只有方法才能屬於所有的對象。它是屬於類的,它像微波爐那個方法一樣,在內存中只有一份,所有的對象通過方法都能夠修改它。而下一次修改是基於上一次修改的基礎之上的!我的意思是:一個員工把手套弄髒了,下一個員工在使用的時候它還是髒的。而這個員工把手套洗乾淨之後,別人再用的時候它就是乾淨的了!就這麼點事兒,明白了吧

關於靜態函數我想就沒什麼可多說的了。給我的感覺就是,它也是屬於類的,在定義的時候就分配的內存。調用是可以使用類名直接調用。其他的和普通成員函數沒什麼不同的了不過這裏需要說明的一點是:在JAVA中,靜態的成員函數只能修改靜態的屬性,而靜態的屬性可以被所有的成員函數修改。不過在C++中就沒這麼多事兒了!

2.4繼承

繼承很好理解,它的最大好處就是“代碼重用”,大大提高了工作效率。舉個例子你就明白了。世界上先有的黑白電視機,它有自己的工作原理。然而人們在他的基礎之上開發出了彩色電視機。彩色電視機繼承了黑白電視機的所有的特性與方法!因爲它既能顯示彩色圖像也能顯示黑白圖像。然而它與黑白電視機又有許多區別,在工作原理上。彩色電視及多了矩陣色電路,把彩色信號分離出三種顏色(RGB),他就能顯示彩色的圖像了。而黑白電視機沒有這塊電路,即使它收到了彩色信號也顯示不了彩色圖像。彩色電視機是從黑白電視機中派生出來的。所以,黑白電視機是父類,彩色電視既是子類,彩色電視繼承了黑白電視機所有的特性與方法。看看再計算機中它是什麼樣子的吧:

//BWtv.java               父類的定義

public class BWtv{

       private int a;

       public BWtv(){

              a=1;

       }

       public changeBWtv(int i){

              a=i;

}

}

//Ctv.java                子類的定義

class Ctv exntends BWtv{        //注意關鍵字“extends”

       private int b;

       public Ctv(){

              b=2;

       }

       public changetCv(int x){

              b = x;

       }

}

有了上面的定義,我們來看看他們都有什麼數據。

BWtv的數據包括                         Ctv的數據包括

 private int a                               private int a

                                                                        private int b

 public changeBWtv();                       public changeBWtv()

                                                                        public changeCtv();

你看,子類擁有父類的所有的方法及屬性。注意關鍵字”extends”,它的意思是繼承。在C++中使用的是“:”操作符。意思是一樣的。但是這裏有許多問題,首先是訪問權限的問題,子類的對象擁有父類的所有的屬性和方法這句話。對嘛?肯定是對的!(不過JAVA的書中可不是這麼說的,他說只繼承非private類型的屬性及方法,我覺得它這句話有錯誤!)可是,子類的對象不能直接訪問父類的私有屬性或方法,它只能通過父類的公有成員函數來訪問。而此時,如果你修改了父類的屬性的值。那就真的修改了。我的意思是:父類的私有屬性的值會隨着子類對象調用父類的公有方法進行對相應屬性的修改而發生變化!(這裏面存在一個域的問題,所有的修改都是在子類中進行的,修改的是子類繼承的父類的屬性在子類這個域中,此時父類以拷貝到子類中了。)。程序中定義的父類的屬性不會發生任何變化在父類的域中),)

       其次是構造函數,在創建一個子類對象時首先要調用的是父類的構造函數,然後再調用子類的構造函數,畢竟,子類的構造函數不包括父類的屬性的初始化功能!從這一點來說我的觀點又是正確的子類的對象擁有父類的所有的屬性和方法”)當然了,析夠函數的調用順序正好相反!

       現在讓我們來談談protected這個關鍵字吧,它的意思是:對對象來說,聲明爲protected的變量是私有的,而對子類父類來說,聲明爲protected的變量是公共的。

       現在又出現了這樣的一個問題,如果我們在子類中也定義了一個int 類型的變量a,那我們在創建子類的對象的時候調用的是子類定義的還是父類定義的呢?這就涉及到數據的隱藏的問題了,我可以告訴你肯定是調用的子類的變量a。因爲,子類把父類的這個同名變量給隱藏了。而如果是方法呢?這就涉及到重構的問題了,在上面我提到過“函數重構是指在子類中聲明與父類同名的方法,從而覆蓋了父類的方法。重構解決了子類與父類的差異問題。”這裏必須要聲明一下的是,在JAVA中,子類出現了對父類屬性的隱藏和父類方法的覆蓋後,在子類中,子類對象僅能調用子類本身的屬性和方法。要調用父類的屬性和方法必須要實用super這個關鍵子。而在C++中就不這樣了。因爲它有虛函數

虛擬函數在C++中非常好玩的事。我們可以把需要改寫的函數聲明爲虛函數,用virtual這個關鍵字來聲明。這樣。假如如果我們CwinApp這麼一個基類,它裏面定義了一個成員(虛)函數爲InitInstance()和另一個爲(虛)函數InitApplication()。如果我從CWinApp派生一個子類爲CMyWinApp並修改了InitInstance()這個成員函數。我們並沒有修改InitApplication()這個成員函數。現在我們創建CMyWinApp這個類的函數theApp,我們並創建一個指針*pApp指向這個對象theApp。此時:

pApp->InitInstance()     //指針調用的是子類CMyWinApp的虛方法

pApp->InitApplication()  //指針調用的時父類CwinApp的虛方法

因爲子類並沒有修改父類的方法,所以調用的是父類的虛方法。這就牽扯到虛你表的問題。礙與本篇文章的定位,這裏就不討論了!

關於父類與子類的對象的類型轉換問題是這樣的,子類對象轉換爲父類對象時,不會出現錯誤。因爲子類包含父類的所有的屬性及方法,而父類向子類轉換時就難說了,呵呵。這還會牽扯到虛擬表的問題,也不討論了!

       JAVA中不再支持多重繼承,也就是一個類從兩個以上的類中繼承而來,但它卻多了接口的概念“interface”。這裏就不做過多介紹了!

       關於抽象基類也沒什麼難的!他的一個大概念就是:做爲許多類的父類,不定義對象,只做派生用!

我能做得也只有這些了,如果你能明白以上的六七成,那就是對我最大的回報了,呵呵!就像剛剛開始我說的,我只是給你一個大概的思想,至於內部的實現細節,仍需要你的繼續努力。關於編程語言的內容還有許多許多,實屬小生個人能力有限而不能全盤照顧到。不過作爲一個初學者的你來說,這些東西都是基本的。需要我提醒你一點的是,不要指望在第一、二遍的時候看懂什麼!加油:)

- 作者: fywl 2004年11月4日, 星期四 18:21  回覆(1) |  引用(0)

ASP對於一個更新資料SQL語句的看法
在這裏先舉一個例子,比如有2個表 tb_stus , tb_achs ,表結構如下:

               tb_stus                         |                    tb_achs
------------------------------------------------------------------------------------------------------
stu_name  |  stu_check                 |      stu_name       |      stu_nums
------------------------------------------------------------------------------------------------------
Loveyuki    |  Pass                         |      Loveyuki         |      61

很明顯, tb_stus 是一個學生數據表, tb_achs 是一個學生成績表,那麼我們現在需要根據 tb_achs 中的 stu_nums 分數來更新 tb_stus 中的 stu_check 的值, 具體更新細節大家都明白,呵呵 及格與不及格嗎!

我想大家一般開始想到的方法是:

程序代碼:
sql="select stu_name,stu_nums from tb_achs"
rs.open sql,conn,1,1
do while not rs.eof
  if rs("stu_nums")>=60 then
     conn.execute ("update tb_stus set stu_check='Pass' Where stu_name='"&rs("stu_name")&"'")
  else
    conn.execute ("update tb_stus set stu_check='Unpass' Where stu_name='"&rs("stu_name")&"'")
  end if
  rs.movenext
loop


這種方法,簡單明瞭,代碼結構十分清晰,但是對於效率問題的考慮十分不足,如果 tb_achs 表中有10萬數據,那麼就進行了10萬次的 update 數據操作,現在我們可以用數組來進行批量操作,可以很大的提高效率,代碼如下:

程序代碼:
dim stu_name_pass,stu_name_unpass,tempname
sql="select stu_name,stu_nums from tb_achs where stu_nums>=60"
rs.open sql,conn,1,1
do while not rs.eof
         stu_name_pass=stu_name_pass&tempname&"'"&rs("stu_name")&"'"
         tempname=","
         rs.movenext
loop
conn.execute("update stu_stus set stu_check='Unpass'")
conn.execute("update stu_stus set stu_check='Pass' Where stu_name in ("&stu_name&")")

- 作者: fywl 2004年11月4日, 星期四 18:14  回覆(0) |  引用(0)

虛線表格的簡單製作方法
閒來無事,胡亂逛一逛,竟然發現了自己2年前寫的一個教程!呵呵,當時還小賺了 20 個大元!:D

http://www.yesky.com/20020228/218852.shtml 

不過遺憾的是圖片看不到了,在這裏,我再發表一次,呵呵

按此在新窗口打開圖片

   大家看到上面的虛線表格有什麼想法呢?是不是也想在自己的網頁上使用一下?好吧,我現在就告訴大家虛線表格一種最簡單的方法!總過程也就是三四步左右!呵呵!

首先要製作一個[img=20,20]attachments/month_0402/tphw_xxbg005.gif[/img]樣子的圖形:,我們以在PhotoShop製作爲例!打開Photoshop新建一個文件長寬各位6象素,背景爲白色!如下圖:
按此在新窗口打開圖片

  然後把圖象用Ctrl+=放大N倍(到底多少倍,你自己看什麼時候合適,一般都放到最大!),然後用畫筆工具畫出圖形,如下圖所示:
按此在新窗口打開圖片

至於製作的具體方法,十分簡單在此不再羅嗦!

    作好之後就可以再DreamWeaver中製作虛線表格了!首先:我們插入一個3行3列的表格,設邊框,邊距都爲0,間距設爲1,背景設爲剛纔製作的圖象!如下圖所示:
按此在新窗口打開圖片

   然後把每個單元格的背景色都設爲頁面的背景色,這樣一個虛線表格就作好了,在此基礎上大家充分發揮自己的想象力,把網頁製作的更好更酷!

- 作者: fywl 2004年11月4日, 星期四 18:11  回覆(0) |  引用(0)

黑客的花前月下
黑客的花前月下
引子:
   時間:2001年5月8號晚
   地點:IRC聊天室
   情況:大屏幕在飛快的刷新着,有100多人在參加着討論
 
 “國家是我們的國家,人民是我們的人民,我們不喊誰喊?我們不幹誰幹?”
 “但中國紅客的行動不合理,也不合法。美國人很霸道,在談判時也不講理,在與別國發現爭端時,更是非常的蠻橫,但一個理智的人,會不會頭腦發昏去街道上抓住一個美國人打一頓,出出氣?”
  。。。。。
  看着這無聊的爭執,讓我愈覺得無聊了。尤其是剛接到的消息,一個在這次攻擊美國的行動,頗有建樹的兄弟,下午剛被警察給請去喝茶了,我的鬱悶真是到了極點。找了幾臺裝有TFN2K服務端的肉雞,做了一個大大的“大炮”,寫好這個IRC的IP,輸入攻擊的指令,不到一分鐘,  就在沒有人能體會到她的呼吸了,因爲她暫時的“睡”着了。    

   正文:
   做一個黑客,需要你投入無限的時間、精力與金錢。在某一天晚上,我猛的發現,自己除了失去這些,女朋友也一併失去了。
   
   中美黑客大戰結束後,許多朋友從網上消失了, 我想,他們如果不是累了,就是和我一樣,受到了國家安全局的警告。安全局,一個多麼讓人好奇的地方,有的人也許一輩子都不會接觸一下,但當他們主動和你接觸的時候,你就會發現,他們無所不在,如你的影子一樣,在緊緊的跟着你。我,只是一個平凡的人普通的人,在接到警告後的第二天,我就乖乖地離開了網絡了,恢復到了我現實中的身份:一個普通的大學生,性格隨和,文文靜靜。每日裏揹着個黑色的書包,裏面放上幾本書和一個大水瓶,去認真的上課,安靜的上自習。
   習慣了網絡的寧靜,怎麼也適應不了宿舍的熱鬧,爲此在一箇中午,在別人都在睡覺的時候,我揹着書包,一個人來到了安靜的教學樓裏;教學樓裏靜悄悄的,一個人也沒有,一種奇怪的感覺抓着我,我在一樓沒停,二樓也沒停,一直走到了4樓,並在4樓的過道里慢慢的走着,當我看到420的時候,我覺得我該在這裏上自習,沒什麼原因,只是一種衝動
   在我推開門的一瞬間,我驚訝的發現這教學樓裏還是有人的,這個教室裏就坐了個女孩,一個一點也不醜的女孩子,我當時的驚訝不亞在一個嚴密的系統裏發現一個弱智的了漏洞,在我的潛意識裏這所學校和侏羅紀公園一樣,只有恐龍沒有美女的,但今天我的確看到了一個美女。
   我強迫自己平靜的走進去,並找了一個位子坐了下來。我聽見了自己的心跳,咚咚。。
我在心裏一遍一遍的問着自己,這是不是緣分,爲什麼麼那麼多的教室我不去,我偏偏來到了這個教室,如果這不是緣分,這一切是不是也太巧了?。。。。。。。 一個小時過去了,我什麼也沒看會。
   這個女孩太美了,我的心動了。
   第二天中午,吃完飯後,我懷着一顆小鹿一樣激動的心來推開了420教室的門,在推開門的那一瞬間,我是多麼的期待能看見那個熟悉的身影,又是多麼的害怕什麼也沒有。一切OK,那個女孩竟然也來這個教室上自習了。一箇中午過去了,我又是什麼也沒看,只是激動的不的了,猜測着女孩的心思(後來才知道人家是在我沒去之前,已經在那個教室堅持上了一個月的自習了,只是沒有因爲我的到來而改變習慣而已,這說明了我是如何的普通)
   一個禮拜裏, 我如忠實的信徒一樣,天天中午來這個教室,陪着那個身影自習,雖然我們還是沒說過一句話,但每次我們目光接觸的時候,她那微微笑的面容已經給了我很多的安慰和想象(美好的事物總給人以幻想和希望的).
如果我是聖人的話,也許我會永遠的活在這種精神的享受裏,遺憾的是我不是,我只是一個普通的人,一個有着情慾有着愛慾有着擁有欲的普通人。我不知道怎麼向女孩表白,我除了用苦惱折磨自己已經別無法子了。
   有天天晚上熄燈後我把我的苦惱告訴了宿舍的兄弟們,宿舍一下子炸鍋了,誰也想不到這年代的大學裏竟然還有這樣純潔的男生,不過他們在驚訝之餘就是不遺餘力的出謀劃策,有的告訴我,應該直接點,拿出大男人的陽剛之氣,直接對那女孩子表白,套用一個成功的例子就是直接問那女孩:你看咱兩配不? 有的則告訴我應該含蓄點,先利用借筆問時間什麼的,和女孩子搭上話,然後在慢慢發展;有的則告訴我給女孩子寫紙條,邀請女孩一起吃飯或者看電影。。。。。聽的時候我熱血沸騰,信心百倍,第二天真的到了教室和女孩子相對的時候,我才發現那些全TMD是瞎扯淡,沒一個適用我。
   不在沉默中爆發,就在沉默中滅亡,就在我走到女孩的身邊,豁出去了準備和女孩子搭話的時候,那個女孩子回頭問我,同學你是大幾的,我隨口說了聲大一的,由於激動,我又問了句很愚蠢的問題,你吃飯了嗎?(那時候已經是中午1點了,早過了吃飯的時間了)她笑了笑,說吃過了,並說了句,我還以爲你是大四的準備考研呢,看你天天中午來這上自習,一句很巧妙的話讓一下子解除了我的尷尬(和聰明人做事就是舒服,所以找老婆的時候一定要找個聰明的)。我們就那樣很容易的搭上話了。
   也許是性格相近,也許真的是有緣,我們談的很開心很投機,她顯得很快樂。在下午上課的鈴聲要敲響的時候,她對我說到:告訴你一件事,今天是她的生日。我忙說過好啊,晚上請我吃飯哦,她笑問到,我過生日,該你請我吃飯的。老實的我想了想,說是的,我該請你吃飯的。我接着很傻的告訴女孩,我的身邊現在只有20元,就用那20元請她吃飯吧(夠傻,追女孩子有20塊錢請女孩子吃飯的嗎?所以我說了就後悔),也許我的真實,也許是傻瓜有傻福,我事後才知道我的真實竟然真正的感動了那女孩子。我哪天晚上花10塊錢請女孩吃了一碗牛肉麪,然後去滑旱冰,從下午6點到晚上9點,我牽着女孩的手,在裏面慢慢的滑着,當時的感覺當時的音樂和情景,每每想來,總讓我如在夢裏,快樂無比。
   當大壩一旦衝開,河水就會一發不可節制,就如我和她的關係,當我們哪天搭上話後,我們的關係就如那決堤的河水一樣,一發不可收拾。
   以後有次,當我們在安靜的地方擁抱的時候,我問她哪天爲什麼會和我說話,她說到,因爲你給我的感覺很老實。我說你怎麼知道?她說到換成別的男生,早就主動找藉口和我搭話了,我這麼美的一個美女(嘻嘻),但你沒有;她接着告訴我,你那次說的用20塊錢請我吃飯,我真的感動了,我不在乎那頓飯,我在乎的是那份真正的心。(傻瓜有傻福)
   
   很早的時候,先哲們就告訴我們,許多東西在擁有的時候,你並不能感覺到它的珍惜,只有在失去的時候,你纔會後悔莫急。正如我對我和她之間的那份感情。
   
   隨着網絡上管制的放鬆,也隨着自己編程水平的不斷提高,黑客的種子在我的心裏慢慢的發芽着,讓我的心癢簌簌的,有種躍躍欲試一試身手的慾望。有一次我實在忍不住了,在學校的機房裏試了一個自己編的軟件,很輕鬆的連到了某辦公室的服務器上,還沒高興夠,就被老師抓住了,給送到了系裏。系裏的黨委書記很認真的對我說到:如果不想要學位證了,就去黑學校的網絡。咱系裏,因這沒學位證甚至被開除的,也不只一個了。
   我在恨的咬牙時,就去網吧開始了往昔的生活。發現半年沒去,網絡已經發生了很大的變化。經歷了中美“黑客”大戰,大家好象都變的成熟了。他們不在熱中於去換別人的頁面,而變的更加的實際。
   有的兄弟在去黑別人的網站論壇,不在是爲了炫耀,而是爲了利潤,他們入侵併得到別人的程序,然後去賣錢,;有的兄弟把興趣放在了電話卡上,破了一個又一個的電話卡,然後象電信局的老總一樣,想打多少電話就打多少電話,一分錢也不用掏自己的腰包;有的專門去破解收費的成人網站的密碼,然後把那些片子搞的滿網都是。。。。。這些只是那些不大讓人喜歡的黑客,甚至是受法律管制的黑客,還有一些兄弟,則真的做到了無怨無悔,他們潛入到地下去,入侵了一個又一個的服務器,不聲明不炫耀,只是默默的安裝上SNIFF程序,去竊取那些對祖國所需要的資料。沒人給他們發工資,他們的網費也是自己掏的,他們不是爲了用那資料賣錢,他們真的想得到那些祖國所需要的資料,並送給祖國,他們纔是紅客的精髓(他們的出路也許最終會被國家招安的,國家那天不想着外國和臺灣的資料)。
   我是個普通的人,我也是個愛國的人,在和我的兄弟聯繫上後,一個雄偉的目標在我的心中燃燒了:我要在網絡上建立一個強大的帝國,這個帝國裏有大量電話卡的密碼,有大量成人網站的破解密碼,也同樣有潛入到敵後的SNIFF所發回的資料。
   爲了這個雄偉的目標,在那天裏偶爾一接觸網絡,就變的不可收拾,爲了能免費的上網,我乾脆兼職做了網吧的管理,任何沒課的時間裏我都泡在網絡裏。網絡會讓人變的反應遲鈍,我不在陪我的女朋友了她天天中午去自習,不在陪她天氣好的時候裏去散散步,我心中有的只是網絡,只有那個雄偉的夢。
 
   網絡無歲月,我不知道我過了多久那樣的生活,直到有一天在成功的給個網站裝上了SNIFF後,我靠在椅子上想放鬆一下的時候,才感覺到,我好久沒陪她一起吃飯了,並發現了哪天就是她的生日(命運之神在幫助我,讓我在她的生日哪天成功的進入了那臺服務器,並記起了她的生日)
   我給她打了個電話,她沒在,一種不祥的感覺涌上我的心頭,我持續的打着電話,直到晚上的吃飯的時候,我才找到了她。通話的感覺,是那樣的陌生。我結結吧吧的告訴她,今天是她的生日,想請她一起吃頓飯,給她講講我最近的事,她沉默了一會,答應了,並告訴我去我們第一次吃飯的地方,我有種興奮的感覺,命運還是偏愛我的/
   吃飯的時間到了,我買了一塊不大的生日蛋糕,兩人的蛋糕不需要太大;買了幾件她喜歡的小禮物,興奮的提着,去我們曾經常常一起吃飯的老地方。路上,我一遍一遍的反思着,告訴着自己,自己做的太過分了,自己要控制上網的時間,要多抽些時間維護我們的感情。
   當我推開那間小單間的門,我發現除了她,還有一個男生,一個比我帥多了的男生。我鎮靜了下自己的心情,然後打招呼,我看到了桌上的蛋糕,是她最喜歡吃的那種,我的心緊了緊。我說點菜吧,我拿起菜鋪遞給她,讓她做主,她沒點,直接轉給那個男生,讓那個男生先點。我傻傻的說到,今天是你的生日,應該你先點的,她說到誰點都一樣。那個男生很快的點了幾道菜,我看着那幾道菜,我更傻了,那都是她最喜歡吃的菜。我沒什麼可點,只能點了一到湯,一道不是主食的湯。
   那頓飯吃的是那麼的乏味,爲了製造氣氛,我盡力的說着,我發現常是我一個人的表演,許多話基本沒人響應。我的心在流淚。
   
   其實那頓飯壓根就不算飯,因爲吃不到10分鐘,那個男生就對她說到,時間差不多了,和老師約好見面的時間要到了。她看了看錶,說聲是啊,時間好快,然後就正對着我說聲對不起,她有事要先走了,我傻傻的,無話可說。
房間裏靜悄悄的,因爲只有一個發呆的男生,陪着一盒沒有打開的生日蛋糕。。。
   看着老闆送來的,還冒着熱氣的湯,我感覺到了陣陣的心疼。
   過了好久,我才用打着哆嗦的手,笨拙的解開蛋糕盒上的線帶,插上22根鮮紅的小蠟燭,用火柴一根根的點着;我輕輕的唱着生日快樂,祝你生日快樂。。。歌還沒唱完,我的淚已經忍不住的流下來,;紅色的蠟燭也在流淚,不知道它是爲了誰,流的淚竟然是血般的紅。歌聲中帶着淚,最後變成了無語的哽咽
   不知道哪天晚上,我是怎麼樣的走回去的, 我只知道當我醒來的時候,我在宿舍,時間已經是第三天的下午了。我被宿舍的兄弟搖醒,叫我晚上喝酒去,因爲明天是元旦是節日,按老規矩晚上是該喝酒渡過的;我坐了起來,頭疼的厲害。
    我洗了把臉,換了件衣服,和宿舍的兄弟們相跟着往外走,走在半路上,有個兄弟問,老大,不叫上嫂子一起去? 我遲疑了一下,對他們說,我去給她打個電話,你們先去點菜提酒,他們說聲早點來,來晚了一秒一杯酒,我說沒問題,就走到了個電話廳邊。
   電話打通了,她沒在(如我所想如我所擔心的),我猶豫了一下,輕輕的問那個接電話的女生,她去那了?那個女孩說到:我不知道,她是和她男朋友一起出去的.我感覺頭腦嗡了一下,那個女孩接着問,你是誰?要不要她回來了給你電話? 我說不了,我只是沒事打給她問個好,對了,今天節日,祝你節日快樂,那個女孩說到: "謝謝,你也一樣",好的,再見.我掛了電話,一個人慢慢的回到了我們喝酒的地方。他們已經在那等了,問嫂子怎麼沒來?我強笑着說到,她沒在宿舍,不知道去那了。有個兄弟說到,你的注意點少上上網,多抽點時間陪陪嫂子,她是個好人,失去她你會後悔一輩子的。我拿起一瓶酒說聲,好兄弟,謝謝你,我記住你這話了,咱幹,一仰脖子一瓶酒一下就完了,在放下瓶子的時候,我說到喝的太急了,嗆了一下,然後很自然的用手擦去了眼角的淚。
 

- 作者: fywl 2004年11月4日, 星期四 17:59  回覆(0) |  引用(0)

面向對象編程,我的思想[上]
前言:

整理這份資料的目的是爲了幫助我的同學能夠更直觀的理解面向對象的編程。讓後來者能夠少走一些彎路,但其中不免有許多漏洞及錯誤,也還請前輩提出寶貴的更改意見,畢竟交流會讓我們不斷的進步。

技術是日新月異的,他不會等待你的成長。技術要拿出來於別人交流,自己學是自己主觀意識上的理解,有對有錯!交流會讓進步變得更快。我認爲如果計算機的體系結構不發生革命性的變化,我們現在所應用的程序語言也就百變不離奇蹤了!學編程學的是什麼?思想!精通一門編程語言(最好是面向對象的語言)後再去搞其他的編程語言,你會發現過程是如此的行雲流水!爲什麼?你已經把編程的思想掌握了,再去學其他的,無非是學習一種新的語法格式了。

我在這裏並不是和你討論怎麼去用C++或JAVA,也不是和你討論怎麼去學他們,我要和你討論的是怎麼去理解面向對象。其中主要會涉及到“類、對象、繼承、屬性、方法、靜態、重載、隱藏、重構、聲明、定義、初始化、賦值等”其中有許多相關技術我只會一代而過,讓你有一種到此一遊的意味我就達到目的了,而更詳細的技術內幕,就請參考其他相關書籍而深入研究吧!因爲我只是在和你探討如何去更好的理解面向對象!

如何去提高效率?重複使用資源,把別人的東西拿來就用。這是很不錯的主意!而對於你來說,最大的資源就是信心以及積極性!好,打起精神來,讓我們一同到面向對象的編程中去尋幽訪勝吧!

:文章中所有程序實例我都使用JAVA寫的,當然在C++中也就大同小異了了,不同的地方我會指出!

:文章中的正文文字用黑色,說明文字用粗體藍色,強調文字用粗體橙色,批改文字用粗體紅色!

正文:

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 name 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”這個屬性(對象所擁有的所有的屬性)。計算機只會爲對象的屬性分配內存。因爲每個對象的都不一樣!就像你往公司帶的午飯和我往公司帶的午飯不一樣是一個道理!但方法就不同了。早晨帶的飯中午就涼了,你需要用微波爐來加熱。微波爐可不用你帶,公司就有(只佔公司的一塊空間),它放在了午餐桌上。你想想,微波爐屬於誰的?它屬於所有員工的!因爲每個員工都可以用它。而不必每個員工都帶一份。由此可見,每個員工(對象)都有一份午飯(屬性),但所有的員工(對象)只一個微波爐(方法)。所有的員工(對象)都可以通過這個微波爐(方法)來改變自己午餐(屬性)的冷熱狀態。殊途同歸!在計算機中也就是這樣,方法只有一份,供所有的對象使用!而屬性是每個對象一份,因爲每個對象的都不一樣。別和我說你還不明白,不然我會撞牆的,呵呵:)
 
){ //看這個構造函數

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

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

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

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

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

}
發佈了75 篇原創文章 · 獲贊 0 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章