日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > > 充電吧
[導(dǎo)讀]一、面向?qū)ο笈c面向過程編程的區(qū)別我們以一個實際例子來說明這兩者的區(qū)別 , 例如:寫一個計算器的軟件。面向過程程序員思考方式:[1]定義變量保存用戶的輸入的數(shù)據(jù)[2]實現(xiàn)一個加法函數(shù),完成數(shù)據(jù)的加法[3

一、面向?qū)ο笈c面向過程編程的區(qū)別

我們以一個實際例子來說明這兩者的區(qū)別 , 例如:寫一個計算器的軟件。

面向過程程序員思考方式:

[1]定義變量保存用戶的輸入的數(shù)據(jù)

[2]實現(xiàn)一個加法函數(shù),完成數(shù)據(jù)的加法

[3]實現(xiàn)一個減法函數(shù),完成數(shù)據(jù)的減法

[4]實現(xiàn)一個乘法函數(shù),完成數(shù)據(jù)的乘法

.....

面向?qū)ο蟪绦騿T思考方式:

[1]計算器是一個對象

[2]這個對象應(yīng)該有保存數(shù)據(jù)的變量

[2]這個對象應(yīng)該有完成數(shù)據(jù)計算的方法(函數(shù))

....

可以看的出來,好像這兩個哥們思考方式幾乎沒啥區(qū)別,只不過面向?qū)ο蟮某绦騿T從整體出發(fā),把實現(xiàn)計算器的保存數(shù)據(jù)的變量和計算數(shù)據(jù)的方法封裝在一個對象里面。

我們都是搞C語言的,C語言是一種典型的面向過程語言。在這里想問一個問題:如何用C語言描述面向?qū)ο蟪绦騿T的思考的計算器呢?

嗯,你一定會想到用C語言中的結(jié)構(gòu)體來實現(xiàn),封裝的結(jié)構(gòu)體如下:

typedef struct

{

int data1;

int data2;

int (*calc_add)(int,int);

int (*calc_sub)(int,int);

int (*calc_mul)(int,int);

...

}calc_t;

定義一個計算器類型的變量

calc_t calc;

可以看的出來,編程語言本身并沒有面向?qū)ο蠛兔嫦蜻^程之分,只是程序員的思考方式不一樣罷了。

好了,我們接著思考:如果我要開發(fā)一個手機(jī)軟件,這個手機(jī)軟件軟件中要包含打電話功能、計算器功能、播放音樂功能,這些又該如何實現(xiàn)呢?

面向過程序員,思考方式:

[1]定義變量保存用戶的輸入的數(shù)據(jù)

[2]實現(xiàn)一個加法函數(shù),完成數(shù)據(jù)的加法

[3]實現(xiàn)一個減法函數(shù),完成數(shù)據(jù)的減法

[4]實現(xiàn)一個乘法函數(shù),完成數(shù)據(jù)的乘法

[5]實現(xiàn)一個打電話功能函數(shù)

[6]實現(xiàn)一個播放音樂功能函數(shù)

.....

面向?qū)ο蟪绦騿T,思考方式:

[1]計算器是一個對象,包含一些數(shù)據(jù)和方法

[2]打電話是一個對象,包含一些數(shù)據(jù)和方法

[3]播放音樂是一個對象,包含一些數(shù)據(jù)和方法

...

面向?qū)ο蟪绦騿T這時想到,自己以前寫過一個計算器對象,寫過一個打電話對象,寫過一個播放器對象,他們之間是獨立的,于是高富帥的干活方式出現(xiàn)了。啥也不用干,"ctrl +c" 和 "ctrl + v"把活干完了,然后去喝茶了。

面向過程程序員也不傻,看到面向?qū)ο蟪绦騿T的干活方式,立馬自己也"ctrl + c" 和 "ctrl + v"把自己以前編寫的代碼從n個文件的n行代碼中尋找,找到之后發(fā)現(xiàn)自己的視力從+2.5下降到-2.5。不管咋地,咱就是這么任性,已經(jīng)把代碼拷貝過來,接下來就編譯完,交給老大就可以去喝茶了。編譯器瘋了,變量名沒有定義、變量名沖突,函數(shù)名沖突....,最后的結(jié)果是n行代碼編譯器無情的報了"n+1"行錯誤。

故事看到這,我們可以看出,面向?qū)ο缶幊痰奶攸c:

[1]萬事萬物都看成對象,對象包含數(shù)據(jù)和操作數(shù)據(jù)的方式,是一個獨立的個體

[2]編寫程序之前,先通過封裝的方法設(shè)計出對象應(yīng)該包含的內(nèi)容

[3]整個軟件系統(tǒng)由對象構(gòu)成,就像這個人類世界一樣,有n個人構(gòu)成,每個人扮演者不同的角色

[4]代碼的復(fù)用性好,更便于維護(hù)

好了,就說這么多了,想要真正理解,必須自己在實際的項目中慢慢體會,才能真正理解面向?qū)ο蠛兔嫦蜻^程的不同。

二 Java面向?qū)ο笾庋b

我們知道,在面向?qū)ο蟮木幊趟枷胫?,一個軟件系統(tǒng)由n個對象構(gòu)成。而對象需要先設(shè)計,就像前面我們用C語言的結(jié)構(gòu)體來描述計算器一樣。

typedef struct

{

int data1;

int data2;

int (*calc_add)(int,int);

int (*calc_sub)(int,int);

int (*calc_mul)(int,int);

...

}calc_t;

在Java 中,用可以用類來描述一個對象的特點:

class Calc{

int data1;

int data2;

int calc_add(){

return data1 + data2;

}

int calc_sub(){

return data1 - data2;

}

....

};

在C語言中的結(jié)構(gòu)體內(nèi)部是沒法直接編寫函數(shù)的,在Java的中是可以直接編寫函數(shù)的,可以看出Java的類封裝性更強(qiáng)。

問題1 : Java的類和C語言的結(jié)構(gòu)體是一樣的嗎?

回答 : 相似,都是程序員設(shè)計出來的類型。

問題2: Java的類和對象有什么聯(lián)系呢?

回答: 相當(dāng)于C語言的結(jié)構(gòu)體類型和結(jié)構(gòu)體變量。

好了,接下來我們給出Java中標(biāo)準(zhǔn)的類定義方法:

接下來我們就來實戰(zhàn)一下吧,設(shè)計一個描述人的類:


編譯出現(xiàn)的錯誤如下:

修改完后,接著編譯,出現(xiàn)的錯誤如下:

問題:在Java中如何給引用類型變量初始化呢?

回答: 讓引用類型變量保存一個可用內(nèi)存空間首地址就可以了。

類名 引用類型變量名;

引用類型變量名 = new 類名() 或 引用類型變量名 = new 類名(參數(shù)列表);

例如:

people = new Person();

好了,知道錯誤后,我們接著修改代碼如下:

編譯沒有錯誤,輸出如下結(jié)果:

嗯,還是有哥們寫錯,它的寫法如下:

嗯,我們應(yīng)該定義一個構(gòu)造器,這樣我們在創(chuàng)建對象后就可以自動給對象的成員變量進(jìn)行初始化了,修改代碼如下:

問題:如果創(chuàng)建一個對象時,我不想給構(gòu)造器傳遞參數(shù),我該怎么做呢?

回答:在類中在定義一個無參數(shù)的構(gòu)造器。

修改代碼如下:

三 Java中的訪問修飾符public和private

還是通過列子說明吧!

嗯,明白了,private 修飾的成員變量和成員方法只能在類中訪問,在別的類中是不能通過對象來訪問的。public 修飾的成員變量和成員方法除了在類中可以直接訪問,在其他類中也可以通過對象來訪問。

現(xiàn)在問題來了,具體什么時候用private修飾,什么時候用public修飾成員變量和成員方法呢?

大牛們這樣回答你,類的成員變量都應(yīng)該設(shè)為private,類的成員方法如果只是類內(nèi)部使用則設(shè)為private,如果給外部使用則設(shè)為public。

試著思考這樣一個問題:如果我們把成員變量設(shè)為public,這樣在任何一個類中都可以隨意訪問。有一天編寫類的人將成員變量名更改了,此時在別的類中使用過此類的成員變量的代碼都需要修改。如果成員變量設(shè)為private,此時在別的類中是無法直接訪問的,所以你做了修改是不會影響到別人的。

注意:我們封裝的目的就是想隱藏一些細(xì)節(jié),向外界提供統(tǒng)一的接口。

現(xiàn)在來了一個新的問題,把成員變量設(shè)為私有的,別的類中如何訪問呢?嗯,聰明的你應(yīng)該可以想到,通過類的公有方法,在公有方法中訪問類的私有成員。于是乎代碼修改成如下:

三 Java 中的this

1、表示對當(dāng)前對象的引用!

2、表示用類的成員變量,而非函數(shù)參數(shù),注意在函數(shù)參數(shù)和成員變量同名是進(jìn)行區(qū)分!其實這是第一種用法的特例,比較常用,所以那出來強(qiáng)調(diào)一下!

3、用于在構(gòu)造方法中引用滿足指定參數(shù)類型的構(gòu)造器(其實也就是構(gòu)造方法)。但是這里必須非常注意:只能引用一個構(gòu)造方法且必須位于開始。

注意:

this不能用在static方法中!所以甚至有人給static方法的定義就是:沒有this的方法!雖然夸張,但是卻充分說明this不能在static方法中使用!

四 Java 中的static

關(guān)于"static"這個關(guān)鍵字大家并不陌生,在C語言中static的用途如下:

(1)static 修飾一個局部變量,表示這個局部變量的值具有繼承性,在函數(shù)調(diào)用結(jié)束的時候,static修飾的局部變量空間

(2)static 修飾一個全局變量或函數(shù)時,表示限制全局變量和函數(shù)的作用范圍,此時全局變量或函數(shù)只能在本文件中使用。

在Java中,"static"關(guān)鍵字和C語言的用法差別很大,下面我們就一起來看看在Java中,什么時候應(yīng)該使用"static"關(guān)鍵字呢?

1.用static 修飾類的成員變量

大牛名言:如果你想讓同一個類的所有對象共享同一個變量,那么這個類的成員變量應(yīng)該使用"static"關(guān)鍵字修飾。

解讀大牛名言如下

(1)static修飾的成員變量屬于類的變量,所有對象共享。也就是說當(dāng)一個類加載到內(nèi)存中之后,static修飾的成員變量空間就已經(jīng)分配好了。接下來通過這個類創(chuàng)建的所有對象都共享static修飾的成員變量。

(2)static修飾的成員變量,不需要創(chuàng)建對象來訪問,由于它屬于類,所以可以通過 "類名.成員變量名"來訪問。

2.用static修飾類的成員方法(靜態(tài)成員方法)

大牛名言:如果你不想通過創(chuàng)建對象來訪問成員函數(shù),那么這個類的成員函數(shù)應(yīng)該用"static"關(guān)鍵字來修飾。

解讀大牛名言如下

類中非靜態(tài)成員方法在訪問的時候,必須先創(chuàng)建對象,然后通過對象來訪問成員方法。創(chuàng)建對象必定會有內(nèi)存開銷,有些時候我們在Java中編寫的一些普通的算法函數(shù),它不需要訪問類的非靜態(tài)的成員變量和函數(shù),只是自己內(nèi)部完成一些計算,這樣的函數(shù)很明顯和對象沒有聯(lián)系,此時應(yīng)該將這個函數(shù)用"staic"關(guān)鍵字修飾,讓它變成靜態(tài)成員方法。這樣訪問它的時候,就不需要創(chuàng)建對象了,只需要通過"類名.成員函數(shù)名"來訪問就可以了。

其實這樣的例子有很多,例如:main函數(shù) , System.arraycopy,Arrays.copyOf等。

思考:如何在靜態(tài)成員方法中,訪問非靜態(tài)成員變量和函數(shù)?

四 Java 中的static靜態(tài)塊和非靜態(tài)塊

(1)static{}(即static塊),會在類被加載的時候執(zhí)行且僅會被執(zhí)行一次,一般用來初始化靜態(tài)變量和調(diào)用靜態(tài)方法。

(2){}(非靜態(tài)塊)每個對象生成時都會被執(zhí)行一次,它可以初始化類的成員變量。非靜態(tài)初始化塊代碼會在構(gòu)造函數(shù)調(diào)用前先執(zhí)行。

五 Java 中的包機(jī)制

所謂包,就是把不同特征的類隔離起來,即使這些彼此隔離的包中包含同名的類也無所謂。在一個大的軟件系統(tǒng)中,有很多種類的對象,要想描述這些不同種類的對象就必須設(shè)計不同的類來完成。一般都是將這些類進(jìn)行分類,由不同的人去完成不同的類。這樣可能會產(chǎn)生A定義的類名和B定義的類重名,此時如果將A和B定義的類拷貝到同一個目錄下,必定會產(chǎn)生覆蓋,于是乎Java中就提出了包的機(jī)制來解決這種命名沖突的問題。

簡單總結(jié)包的用途:

1) 將功能相近的類放在同一個包中,可以方便查找與使用。

2) 由于在不同包中可以存在同名類,所以使用包在一定程度上可以避免命名沖突。

3) 在Java中, 包也限定了訪問權(quán)限,擁有包訪問權(quán)限的類才能訪問某個包中的類

1. Java中的包的創(chuàng)建

package 包名;

注意:包名的命名方式 (全部小寫,以公司或項目組織的順序倒寫,中間以.分隔,如: com.farsight.www.cyg)

我估計大家看到這里還是糊涂,我們還是以例子來說明:

以包的方式,編譯我們的java代碼:

javac -d . TestPackage.java

最終生成的效果如下:
2. Java中的使用指定包下面的類

每次都這樣寫,遲早都要 崩潰的,有沒有更簡單的方法呢?

使用import語句引入包中的類

由于采用使用長名引用包中的類的方法比較繁瑣,所以Java提供了import語句來引入包中的類。

import語句的基本語法格式如下: import 包名1 [ .包名2 ...].類名 | *;

當(dāng)存在多個包名時,各個包名之間使用“.”分隔,同時包名與類名之間也使用“.”分隔。

*:表示包中所有的類。

例如,引入com.wgh包中的Circ類的代碼如下:

import com.wgh.Circ;

如果 com.wgh包中包含多個類,也可以使用以下語句引入該包下的全部類。

import com.wgh.*;

嗯,還有另一種寫法,如下所示:

六 Java 中常用的環(huán)境變量

CLASSPATH

1. 在java的編譯環(huán)境中使用

它的作用與import、package關(guān)鍵字有關(guān)。當(dāng)你寫下import java.util.*時,編譯器面對import關(guān)鍵字時,就知道你要引入java.util這個package中的類;但是編譯器如何知道你把這個package放在哪里了呢?所以你首先得告訴編譯器這個package的所在位置;如何告訴它呢?就是設(shè)置CLASSPATH啦 !

當(dāng)你自己開發(fā)一個package時,然后想要用這個package中的類;自然,你也得把這個package所在的目錄設(shè)置到CLASSPATH中去!CLASSPATH的設(shè)定,對JAVA的初學(xué)者而言是一件棘手的事。所以Sun讓JAVA2的JDK更聰明一些。你會發(fā)現(xiàn),在你安裝之后,即使完全沒有設(shè)定CLASSPATH,你仍然能夠編譯基本的JAVA程序,并且加以執(zhí)行。

例如:我把CLASSPATH值設(shè)為D:,此時我編譯我的java程序,效果如下:

有人肯定在想,以前我們使用"System、Arrays,String"等類時,既沒有設(shè)置CLASSPATH,也沒有用"import"進(jìn)行導(dǎo)包,為什么可以編譯通過呢?

從上面的編譯過程可以看出,javac在編譯java源文件的時候,有兩個搜索路徑:

(1)CLASSPATH指定的路徑

(2)默認(rèn)的搜索路徑 "安裝目錄Javajdkjrelib"下的xxx.jar包。例如:jrelibrt.jar文件中就有常用的java類,如:System,String等。

問題:jar包是什么呢?

回答:jar包是將我們的包進(jìn)行壓縮后的文件

2. 在java的運(yùn)行環(huán)境中使用

當(dāng)我們通過java 運(yùn)行一個類時,默認(rèn)是從當(dāng)前目錄下尋找這個類,然后將這個類加載到內(nèi)存中,如果這個類在運(yùn)行的時候,需要"import"導(dǎo)入的類,在從當(dāng)前目錄下開始尋找"import"指定的路徑下類,然后將他們加載到內(nèi)存。

注意:如果設(shè)置了CLASSPATH環(huán)境變量,則java虛擬機(jī)從CLASSPATH指定的路徑下搜索需要的類加入到內(nèi)存。

好了,我們已經(jīng)知道了CLASSPATH環(huán)境變量用途,到目前為止,我們沒有配置CLASSPATH環(huán)境變量,我們?nèi)匀豢梢跃幾g和運(yùn)行java程序。有人可能會認(rèn)為,學(xué)這個沒啥用,不配置也可以用呀。其實不然,如果我們不使用java環(huán)境自帶的類進(jìn)行開發(fā),而是用別人提供的類進(jìn)行開發(fā),這個時候CLASSPATH就派上用場了,你必須將你需要類的路徑設(shè)置在CLASSPATH環(huán)境變量中。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護(hù)是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機(jī)驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機(jī)驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉