版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1.Java里抽象類和接口的區(qū)別在\o"java"Java語言中,abstractclass和\o"接口"interface是支持\o"抽象類"抽象類定義的兩種機制。正是由于這兩種機制的存在,才賦予了Java強大的面向?qū)ο竽芰Αbstractclass和interface之間在對于抽象類定義的支持方面具有很大的相似性,甚至可以相互替換,因此很多開發(fā)者在進行抽象類定義時對于abstractclass和interface的選擇顯得比較隨意。其實,兩者之間還是有很大的區(qū)別的,對于它們的選擇甚至反映出對于問題領(lǐng)域本質(zhì)的理解、對于設(shè)計意圖的理解是否正確、合理。本文將對它們之間的區(qū)別進行一番剖析,試圖給開發(fā)者提供一個在二者之間進行選擇的依據(jù)。
理解抽象類
abstractclass和interface在Java語言中都是用來進行抽象類(本文中的抽象類并非從abstractclass翻譯而來,它表示的是一個抽象體,而abstractclass為Java語言中用于定義抽象類的一種方法,請讀者注意區(qū)分)定義的,那么什么是抽象類,使用抽象類能為我們帶來什么好處呢?
在面向?qū)ο蟮母拍钪校覀冎浪械膶ο蠖际峭ㄟ^類來描繪的,但是反過來卻不是這樣。并不是所有的類都是用來描繪對象的,如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類。抽象類往往用來表征我們在對問題領(lǐng)域進行分析、設(shè)計中得出的抽象概念,是對一系列看上去不同,但是本質(zhì)上相同的具體概念的抽象。比如:如果我們進行一個圖形編輯軟件的開發(fā),就會發(fā)現(xiàn)問題領(lǐng)域存在著圓、三角形這樣一些具體概念,它們是不同的,但是它們又都屬于形狀這樣一個概念,形狀這個概念在問題領(lǐng)域是不存在的,它就是一個抽象概念。正是因為抽象的概念在問題領(lǐng)域沒有對應(yīng)的具體概念,所以用以表征抽象概念的抽象類是不能夠?qū)嵗摹?/p>
在面向?qū)ο箢I(lǐng)域,抽象類主要用來進行類型隱藏。我們可以構(gòu)造出一個固定的一組行為的抽象描述,但是這組行為卻能夠有任意個可能的具體實現(xiàn)方式。這個抽象描述就是抽象類,而這一組任意個可能的具體實現(xiàn)則表現(xiàn)為所有可能的派生類。模塊可以操作一個抽象體。由于模塊依賴于一個固定的抽象體,因此它可以是不允許修改的;同時,通過從這個抽象體派生,也可擴展此模塊的行為功能。熟悉OCP的讀者一定知道,為了能夠?qū)崿F(xiàn)面向?qū)ο笤O(shè)計的一個最核心的原則OCP(Open-ClosedPrinciple),抽象類是其中的關(guān)鍵所在。
從語法定義層面看abstractclass和interface
在語法層面,Java語言對于abstractclass和interface給出了不同的定義方式,下面以定義一個名為Demo的抽象類為例來說明這種不同。
使用abstractclass的方式定義Demo抽象類的方式如下:abstractclassDemo{
abstractvoidmethod1();
abstractvoidmethod2();
…
}
使用interface的方式定義Demo抽象類的方式如下:interfaceDemo{
voidmethod1();
voidmethod2();
…
}
在abstractclass方式中,Demo可以有自己的數(shù)據(jù)成員,也可以有非abstract的成員方法,而在interface方式的實現(xiàn)中,Demo只能夠有靜態(tài)的不能被修改的數(shù)據(jù)成員(也就是必須是staticfinal的,不過在interface中一般不定義數(shù)據(jù)成員),所有的成員方法都是abstract的。從某種意義上說,interface是一種特殊形式的abstractclass。
從編程的角度來看,abstractclass和interface都可以用來實現(xiàn)"designbycontract"的思想。但是在具體的使用上面還是有一些區(qū)別的。
首先,abstractclass在Java語言中表示的是一種繼承關(guān)系,一個類只能使用一次繼承關(guān)系(因為Java不支持多繼承--轉(zhuǎn)注)。但是,一個類卻可以實現(xiàn)多個interface。也許,這是Java語言的設(shè)計者在考慮Java對于多重繼承的支持方面的一種折中考慮吧。
其次,在abstractclass的定義中,我們可以賦予方法的默認(rèn)行為。但是在interface的定義中,方法卻不能擁有默認(rèn)行為,為了繞過這個限制,必須使用委托,但是這會增加一些復(fù)雜性,有時會造成很大的麻煩。
在抽象類中不能定義默認(rèn)行為還存在另一個比較嚴(yán)重的問題,那就是可能會造成維護上的麻煩。因為如果后來想修改類的界面(一般通過abstractclass或者interface來表示)以適應(yīng)新的情況(比如,添加新的方法或者給已用的方法中添加新的參數(shù))時,就會非常的麻煩,可能要花費很多的時間(對于派生類很多的情況,尤為如此)。但是如果界面是通過abstractclass來實現(xiàn)的,那么可能就只需要修改定義在abstractclass中的默認(rèn)行為就可以了。
同樣,如果不能在抽象類中定義默認(rèn)行為,就會導(dǎo)致同樣的方法實現(xiàn)出現(xiàn)在該抽象類的每一個派生類中,違反了"onerule,oneplace"原則,造成代碼重復(fù),同樣不利于以后的維護。因此,在abstractclass和interface間進行選擇時要非常的小心。
從設(shè)計理念層面看abstractclass和interface
上面主要從語法定義和編程的角度論述了abstractclass和interface的區(qū)別,這些層面的區(qū)別是比較低層次的、非本質(zhì)的。本小節(jié)將從另一個層面:abstractclass和interface所反映出的設(shè)計理念,來分析一下二者的區(qū)別。作者認(rèn)為,從這個層面進行分析才能理解二者概念的本質(zhì)所在。
前面已經(jīng)提到過,abstractclass在Java語言中體現(xiàn)了一種繼承關(guān)系,要想使得繼承關(guān)系合理,父類和派生類之間必須存在"is-a"關(guān)系,即父類和派生類在概念本質(zhì)上應(yīng)該是相同的。對于interface來說則不然,并不要求interface的實現(xiàn)者和interface定義在概念本質(zhì)上是一致的,僅僅是實現(xiàn)了interface定義的契約而已。為了使論述便于理解,下面將通過一個簡單的實例進行說明。
考慮這樣一個例子,假設(shè)在我們的問題領(lǐng)域中有一個關(guān)于Door的抽象概念,該Door具有執(zhí)行兩個動作open和close,此時我們可以通過abstractclass或者interface來定義一個表示該抽象概念的類型,定義方式分別如下所示:
使用abstractclass方式定義Door:abstractclassDoor{
abstractvoidopen();
abstractvoidclose();
}
使用interface方式定義Door:interfaceDoor{
voidopen();
voidclose();
}
其他具體的Door類型可以extends使用abstractclass方式定義的Door或者implements使用interface方式定義的Door??雌饋砗孟袷褂胊bstractclass和interface沒有大的區(qū)別。
如果現(xiàn)在要求Door還要具有報警的功能。我們該如何設(shè)計針對該例子的類結(jié)構(gòu)呢(在本例中,主要是為了展示abstractclass和interface反映在設(shè)計理念上的區(qū)別,其他方面無關(guān)的問題都做了簡化或者忽略)?下面將羅列出可能的解決方案,并從設(shè)計理念層面對這些不同的方案進行分析。
解決方案一:
簡單的在Door的定義中增加一個alarm方法,如下:abstractclassDoor{
abstractvoidopen();
abstractvoidclose();
abstractvoidalarm();
}
或者interfaceDoor{
voidopen();
voidclose();
voidalarm();
}
那么具有報警功能的AlarmDoor的定義方式如下:classAlarmDoorextendsDoor{
voidopen(){…}
voidclose(){…}
voidalarm(){…}
}
或者classAlarmDoorimplementsDoor{
voidopen(){…}
voidclose(){…}
voidalarm(){…}
}
這種方法違反了面向?qū)ο笤O(shè)計中的一個核心原則ISP(InterfaceSegregationPrinciple),在Door的定義中把Door概念本身固有的行為方法和另外一個概念"報警器"的行為方法混在了一起。這樣引起的一個問題是那些僅僅依賴于Door這個概念的模塊會因為"報警器"這個概念的改變(比如:修改alarm方法的參數(shù))而改變,反之依然。
解決方案二:
既然open、close和alarm屬于兩個不同的概念,根據(jù)ISP原則應(yīng)該把它們分別定義在代表這兩個概念的抽象類中。定義方式有:這兩個概念都使用abstractclass方式定義;兩個概念都使用interface方式定義;一個概念使用abstractclass方式定義,另一個概念使用interface方式定義。
顯然,由于Java語言不支持多重繼承,所以兩個概念都使用abstractclass方式定義是不可行的。后面兩種方式都是可行的,但是對于它們的選擇卻反映出對于問題領(lǐng)域中的概念本質(zhì)的理解、對于設(shè)計意圖的反映是否正確、合理。我們一一來分析、說明。
如果兩個概念都使用interface方式來定義,那么就反映出兩個問題:1、我們可能沒有理解清楚問題領(lǐng)域,AlarmDoor在概念本質(zhì)上到底是Door還是報警器?2、如果我們對于問題領(lǐng)域的理解沒有問題,比如:我們通過對于問題領(lǐng)域的分析發(fā)現(xiàn)AlarmDoor在概念本質(zhì)上和Door是一致的,那么我們在實現(xiàn)時就沒有能夠正確的揭示我們的設(shè)計意圖,因為在這兩個概念的定義上(均使用interface方式定義)反映不出上述含義。
如果我們對于問題領(lǐng)域的理解是:AlarmDoor在概念本質(zhì)上是Door,同時它有具有報警的功能。我們該如何來設(shè)計、實現(xiàn)來明確的反映出我們的意思呢?前面已經(jīng)說過,abstractclass在Java語言中表示一種繼承關(guān)系,而繼承關(guān)系在本質(zhì)上是"is-a"關(guān)系。所以對于Door這個概念,我們應(yīng)該使用abstarctclass方式來定義。另外,AlarmDoor又具有報警功能,說明它又能夠完成報警概念中定義的行為,所以報警概念可以通過interface方式定義。如下所示:abstractclassDoor{
abstractvoidopen();
abstractvoidclose();
}
interfaceAlarm{
voidalarm();
}
classAlarmDoorextendsDoorimplementsAlarm{
voidopen(){…}
voidclose(){…}
voidalarm(){…}
}
這種實現(xiàn)方式基本上能夠明確的反映出我們對于問題領(lǐng)域的理解,正確的揭示我們的設(shè)計意圖。其實abstractclass表示的是"is-a"關(guān)系,interface表示的是"like-a"關(guān)系,大家在選擇時可以作為一個依據(jù),當(dāng)然這是建立在對問題領(lǐng)域的理解上的,比如:如果我們認(rèn)為AlarmDoor在概念本質(zhì)上是報警器,同時又具有Door的功能,那么上述的定義方式就要反過來了。
小結(jié)
1.abstractclass在Java語言中表示的是一種繼承關(guān)系,一個類只能使用一次繼承關(guān)系。但是,一個類卻可以實現(xiàn)多個interface。
2.在abstractclass中可以有自己的數(shù)據(jù)成員,也可以有非abstarct的成員方法,而在interface中,只能夠有靜態(tài)的不能被修改的數(shù)據(jù)成員(也就是必須是staticfinal的,不過在interface中一般不定義數(shù)據(jù)成員),所有的成員方法都是abstract的。
3.abstractclass和interface所反映出的設(shè)計理念不同。其實abstractclass表示的是"is-a"關(guān)系,interface表示的是"like-a"關(guān)系。
4.實現(xiàn)抽象類和接口的類必須實現(xiàn)其中的所有方法。抽象類中可以有非抽象方法。接口中則不能有實現(xiàn)方法。
5.接口中定義的變量默認(rèn)是publicstaticfinal型,且必須給其初值,所以實現(xiàn)類中不能重新定義,也不能改變其值。
6.抽象類中的變量默認(rèn)是friendly型,其值可以在子類中重新定義,也可以重新賦值。
7.接口中的方法默認(rèn)都是public,abstract類型的。
結(jié)論
abstractclass和interface是Java語言中的兩種定義抽象類的方式,它們之間有很大的相似性。但是對于它們的選擇卻又往往反映出對于問題領(lǐng)域中的概念本質(zhì)的理解、對于設(shè)計意圖的反映是否正確、合理,因為它們表現(xiàn)了概念間的不同的關(guān)系(雖然都能夠?qū)崿F(xiàn)需求的功能)。這其實也是語言的一種的慣用法,希望讀者朋友能夠細(xì)細(xì)體會。1、Java接口和Java抽象類最大的一個區(qū)別,就在于Java抽象類可以提供某些方法的部分實現(xiàn),而Java接口不可以,這大概就是Java抽象類唯一的優(yōu)點吧,但這個優(yōu)點非常有用。
如果向一個抽象類里加入一個新的具體方法時,那么它所有的子類都一下子都得到了這個新方法,而Java接口做不到這一點,如果向一個Java接口里加入一個新方法,所有實現(xiàn)這個接口的類就無法成功通過編譯了,因為你必須讓每一個類都再實現(xiàn)這個方法才行,這顯然是Java接口的缺點。2、一個抽象類的實現(xiàn)只能由這個抽象類的子類給出,也就是說,這個實現(xiàn)處在抽象類所定義出的繼承的等級結(jié)構(gòu)中,而由于Java語言的單繼承性,所以抽象類作為類型定義工具的效能大打折扣。
在這一點上,Java接口的優(yōu)勢就出來了,任何一個實現(xiàn)了一個Java接口所規(guī)定的方法的類都可以具有這個接口的類型,而一個類可以實現(xiàn)任意多個Java接口,從而這個類就有了多種類型。3、從第2點不難看出,Java接口是定義混合類型的理想工具,混合類表明一個類不僅僅具有某個主類型的行為,而且具有其他的次要行為。4、結(jié)合1、2點中抽象類和Java接口的各自優(yōu)勢,具精典的設(shè)計模式就出來了:聲明類型的工作仍然由Java接口承擔(dān),但是同時給出一個Java抽象類,且實現(xiàn)了這個接口,而其他同屬于這個抽象類型的具體類可以選擇實現(xiàn)這個Java接口,也可以選擇繼承這個抽象類,也就是說在層次結(jié)構(gòu)中,Java接口在最上面,然后緊跟著抽象類,哈,這下兩個的最大優(yōu)點都能發(fā)揮到極至了。這個模式就是“缺省適配模式”。
在Java語言API中用了這種模式,而且全都遵循一定的命名規(guī)范:Abstract+接口名。Java接口和Java抽象類的存在就是為了用于具體類的實現(xiàn)和繼承的,如果你準(zhǔn)備寫一個具體類去繼承另一個具體類的話,那你的設(shè)計就有很大問題了。Java抽象類就是為了繼承而存在的,它的抽象方法就是為了強制子類必須去實現(xiàn)的。使用Java接口和抽象Java類進行變量的類型聲明、參數(shù)是類型聲明、方法的返還類型說明,以及數(shù)據(jù)類型的轉(zhuǎn)換等。而不要用具體Java類進行變量的類型聲明、參數(shù)是類型聲明、方法的返還類型說明,以及數(shù)據(jù)類型的轉(zhuǎn)換等。1、Java接口和Java抽象類最大的一個區(qū)別,就在于Java抽象類可以提供某些方法的部分實現(xiàn),而Java接口不可以,這大概就是Java抽象類唯一的優(yōu)點吧,但這個優(yōu)點非常有用。
如果向一個抽象類里加入一個新的具體方法時,那么它所有的子類都一下子都得到了這個新方法,而Java接口做不到這一點,如果向一個Java接口里加入一個新方法,所有實現(xiàn)這個接口的類就無法成功通過編譯了,因為你必須讓每一個類都再實現(xiàn)這個方法才行,這顯然是Java接口的缺點。2、一個抽象類的實現(xiàn)只能由這個抽象類的子類給出,也就是說,這個實現(xiàn)處在抽象類所定義出的繼承的等級結(jié)構(gòu)中,而由于Java語言的單繼承性,所以抽象類作為類型定義工具的效能大打折扣。
在這一點上,Java接口的優(yōu)勢就出來了,任何一個實現(xiàn)了一個Java接口所規(guī)定的方法的類都可以具有這個接口的類型,而一個類可以實現(xiàn)任意多個Java接口,從而這個類就有了多種類型。3、從第2點不難看出,Java接口是定義混合類型的理想工具,混合類表明一個類不僅僅具有某個主類型的行為,而且具有其他的次要行為。4、結(jié)合1、2點中抽象類和Java接口的各自優(yōu)勢,具精典的設(shè)計模式就出來了:聲明類型的工作仍然由Java接口承擔(dān),但是同時給出一個Java抽象類,且實現(xiàn)了這個接口,而其他同屬于這個抽象類型的具體類可以選擇實現(xiàn)這個Java接口,也可以選擇繼承這個抽象類,也就是說在層次結(jié)構(gòu)中,Java接口在最上面,然后緊跟著抽象類,哈,這下兩個的最大優(yōu)點都能發(fā)揮到極至了。這個模式就是“缺省適配模式”。
在Java語言API中用了這種模式,而且全都遵循一定的命名規(guī)范:Abstract+接口名。Java接口和Java抽象類的存在就是為了用于具體類的實現(xiàn)和繼承的,如果你準(zhǔn)備寫一個具體類去繼承另一個具體類的話,那你的設(shè)計就有很大問題了。Java抽象類就是為了繼承而存在的,它的抽象方法就是為了強制子類必須去實現(xiàn)的。使用Java接口和抽象Java類進行變量的類型聲明、參數(shù)是類型聲明、方法的返還類型說明,以及數(shù)據(jù)類型的轉(zhuǎn)換等。而不要用具體Java類進行變量的類型聲明、參數(shù)是類型聲明、方法的返還類型說明,以及數(shù)據(jù)類型的轉(zhuǎn)換等。如果功能與對象自身密切相關(guān),則在超類中使用抽象的基類方法.
如果該功能只是對象的輔助行為,則可使用接口.
如果該功能可被全局性地使用到其他無關(guān)的對象,則可使用接口.2.Java有哪些基本數(shù)據(jù)類型Java語言提供了八種基本類型:六種數(shù)字類型(四個整數(shù)型,兩個浮點型) 字節(jié)型byte8位(1字節(jié)) 短整型short16位(2字節(jié)) 整型int32位(4字節(jié)) 長整型long64位(8字節(jié)) 單精度float32位(4字節(jié)) 雙精度double64位(8字節(jié))一種字符類型 字符型char8位還有一種布爾型 布爾型:boolean8位可存儲"True"和"false"3.Java中方法的重載與重寫的區(qū)別重寫Overriding是父類與子類之間多態(tài)性的一種表現(xiàn),重載Overloading是一個類中多態(tài)性的一種表現(xiàn)。重寫就是再寫一遍,重載就是再多一個。
重寫:父類里有,子類再照貓畫虎寫一個。
重載:自己類里面有,覺得不夠再寫一個。重載和重寫,這是兩個新概念,是兩個令我們?nèi)菀谆煜母拍睢?/p>
方法重載(overloadingmethod)是在一個類里面,方法名字相同,而參數(shù)不同。返回類型呢?可以相同也可以不同。
方法重寫(overidingmethod)子類不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要采用方法的重寫。方法重寫又稱方法覆蓋。
方法重載是讓類以統(tǒng)一的方式處理不同類型數(shù)據(jù)的一種手段。Java的方法重載,就是在類中可以創(chuàng)建多個方法,它們具有相同的名字,但具有不同的參數(shù)和不同的定義。調(diào)用方法時通過傳遞給它們的不同個數(shù)和類型的參數(shù)來決定具體使用哪個方法,這就是多態(tài)性。
方法重寫:在Java中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時子類并不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要采用方法的重寫。方法重寫又稱方法覆蓋。若子類中的方法與父類中的某一方法具有相同的方法名、返回類型和參數(shù)表,則新方法將覆蓋原有的方法。如需父類中原有的方法,可使用super關(guān)鍵字,該關(guān)鍵字引用了當(dāng)前類的父類
重寫方法的規(guī)則:
參數(shù)列表必須完全與被重寫的方法的相同,否則不能稱其為重寫而是重載.
返回的類型必須一直與被重寫的方法的返回類型相同,否則不能稱其為重寫而是重載.
訪問修飾符的限制一定要大于被重寫方法的訪問修飾符(public>protected>default>private)
重寫方法一定不能拋出新的檢查異?;蛘弑缺恢貙懛椒ㄉ昝鞲訉挿旱臋z查型異常.例如,
父類的一個方法申明了一個檢查異常IOException,在重寫這個方法是就不能拋出Exception,只能拋出IOException的子類異常,可以拋出非檢查異常.
重載的規(guī)則:
必須具有不同的參數(shù)列表;
可以有不同的返回類型,只要參數(shù)列表不同就可以了;
可以有不同的訪問修飾符;
可以拋出不同的異常;
注意,Java的方法重載要求同名的方法必須有不同的參數(shù)表,僅有返回類型不同是不足以區(qū)分兩個重載的方法。重寫方法只能存在于具有繼承關(guān)系中,重寫方法只能重寫父類非私有的方法。
下面分別舉一個例子來說明方法重載:
publicclassTestOverLoad{
publicstaticvoidmain(String[]args){
Testtest=newTest();
test.print(null);
}
}
classTest{
publicvoidprint(Stringsome){
System.out.println("Stringversionprint");
}
publicvoidprint(Objectsome){
System.out.println("Objectversionprint");
}
}
該程序輸出的結(jié)果是Stringversionprint。這個題目明顯是考察方法重載的,重載使得java的類可以有具有多個相同方法名的方法。編譯器可以通過方法的參數(shù)的類型和個數(shù)來區(qū)分他們。4.解析Java中Strings=newString(“abc”);創(chuàng)建了幾個String對象?知道在java中除了8中基本類型外,其他的都是類對象以及其引用。所以"xyz"在java中它是一個String對象.對于string類對象來說他的對象值是不能修改的,也就是具有不變性。
看:
String
s="Hello";
s="Java";
String
s1="Hello";
String
s2=newString("Hello");
s所引用的string對象不是被修改了嗎?之前所說的不變性,去那里了???
你別著急,讓我告訴你說發(fā)生了什么事情:
在jvm的工作過程中,會創(chuàng)建一片的內(nèi)存空間專門存入string對象。我們把這片內(nèi)存空間叫做string池。
String
s="Hello";當(dāng)jvm看到"Hello",在string池創(chuàng)建string對象存儲它,并將他的引用返回給s。
s="Java",當(dāng)jvm看到"Java",在string池創(chuàng)建新的string對象存儲它,再把新建的string對象的引用返回給s。而原先的"Hello"仍然在string池內(nèi)。沒有消失,他是不能被修改的。
所以我們僅僅是改變了s的引用,而沒有改變他所引用的對象,因為string對象的值是不能被修改的。
String
s1="Hello";jvm首先在string池內(nèi)里面看找不找到字符串"Hello",找到,返回他的引用給s1,否則,創(chuàng)建新的string對象,放到string池里。這里由于s="Hello"了,對象已經(jīng)被引用,所以依據(jù)規(guī)則s和s1都是引用同一個對象。所以s==s1將返回true。(==,對于非基本類型,是比較兩引用是否引用內(nèi)存中的同一個對象)
String
s2=String("Hello");jvm首先在string池內(nèi)里面看找不找到字符串"Hello",找到,不做任何事情,否則,創(chuàng)建新的string對象,放到string池里面。由于遇到了new,還會在內(nèi)存上(不是string池里面)創(chuàng)建string對象存儲"Hello",并將內(nèi)存上的(不是string池內(nèi)的)string對象返回給s2。所以s==s2將返回false,不是引用同一個對象。
好現(xiàn)在我們看題目:
String
s=new
String("xyz");
首先在string池內(nèi)找,找到?不創(chuàng)建string對象,否則創(chuàng)建,這樣就一個string對象
遇到new運算符號了,在內(nèi)存上創(chuàng)建string對象,并將其返回給s,又一個對象
所以總共是2個對象
Strings=newString(“abc”);創(chuàng)建了幾個String對象?答案是2個。為什么?下面講
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 合格的企業(yè)合同 管理
- 通信工程專業(yè)合同條款
- 《蜜蜂導(dǎo)學(xué)案》課件
- 2025年衡陽貨運從業(yè)資格證考試試題及答案
- 2025年廣東從業(yè)資格證貨運題庫答案
- 公園建筑施工合同
- 精密儀器煙囪安裝合同模板
- 大數(shù)據(jù)項目招投標(biāo)要點
- 超市廁所改造施工合同范本
- 高速公路照明安全管理辦法
- 雍琦版-《法律邏輯學(xué)》課后習(xí)題答案(共78頁)
- 咸水沽污水廠生物池清淤施工組織方案
- 二甘醇二苯甲酸酯(DEDB)
- 數(shù)字化變電站的IEC61850建模
- 管道閉水試驗記錄表自動計算軟件
- 學(xué)校綜合督導(dǎo)匯報ppt課件
- 人流咨詢話術(shù)
- 鐵路建設(shè)征地拆遷補償標(biāo)準(zhǔn)(附表)
- 農(nóng)村祠堂上梁說辭
- GB31644-2018食品安全國家標(biāo)準(zhǔn)復(fù)合調(diào)味料
- 建筑施工現(xiàn)場安全檢查的程序及要點
評論
0/150
提交評論