版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第6章類的繼承6.1繼承的基本概念
6.2抽象類
6.3Object類
6.4final關鍵字
6.5接口(interface)
6.6對象的多態(tài)性
6.7匿名內部類
6.1繼承的基本概念
現(xiàn)在假設有一個Person類,其中有name與age兩個屬性,而另外一個Student類,需要有name、age、school三個屬性,如圖6-1所示。從圖6-1中可以看出,Person中已經存在有name和age兩個屬性,所以不希望在Student類中再重新聲明這兩個屬性,這時就需要考慮將Person類中的內容繼續(xù)保留到Student類中。這就引出了類的繼承的概念。圖6-1Student類與Person類圖6-2Person與Student的繼承關系此處希望Student類能夠將Person類的內容繼承下來后繼續(xù)使用,如圖6-2所示。程序說明:
(1)第1~5行聲明一個名為Person的類,其中有name與age兩個屬性。
(2)第6~9行聲明一個名為Student的類,并繼承自Person類。
(3)第14行聲明并實例化一個Student類的對象。
(4)第16、18、20行分別用Student類的對象調用程序中的name、age、school屬性。
由上面的程序可以看出,在Student類中雖然并未定義name與age屬性,但在程序外部依然可以調用name或age,這是因為Student類直接繼承自Person類。也就是說,Student類直接繼承了Person類中的屬性,所以Student類的對象才可以訪問到父類中的成員,如圖6-3所示。圖6-3Person與Student類的繼承圖在Java中只允許單繼承,而不允許多重繼承。也就是說,一個子類只能有一個父類,但是Java中卻允許多層繼承。
多重繼承示意圖如圖6-4所示。多重繼承語法如下:
由上面程序可以看出,類C同時繼承了類A與類B,也就是說,類C同時繼承了兩個父類,這在Java中是不允許的。圖6-4多重繼承圖6-5多層繼承示意圖6.1.1子類對象的實例化過程
既然子類可以繼承直接父類中的方法與屬性,那父類中的構造方法呢?
【例6-2】TestPersonStudentDemo1.java。程序說明:
(1)第1~10行聲明一個Person類,此類中有一無參構造方法。
(2)第11~19行聲明一個Student類,此類繼承自Person類,此類中也有一個無參構造方法。
(3)第24行聲明并實例化一個Student類的對象s。
從程序的輸出結果可以看出,雖然程序第24行實例化的是子類的對象,但是程序先去調用父類中的無參構造方法,之后再調用子類本身的構造方法。所以由此可以得出結論,子類對象在實例化時會默認先去調用父類中的無參構造方法,之后再調用本類中的相應構造方法。實際上在本例中,在子類構造方法的第一行默認隱含了一個“super()”語句,上面的程序改寫成下面的形式也是可以的:在子類繼承父類的時候經常會有下面的問題產生,例如:
【例6-3】TestPersonStudentDemo2.java。由編譯結果可以發(fā)現(xiàn),系統(tǒng)提供的出錯信息是因為無法找到Person類,所以造成了編譯錯誤,這是為什么呢?讀者可以發(fā)現(xiàn),在類Person中提供了一個有兩個參數(shù)的構造方法,而并沒有明確寫出無參構造方法。在本書前面已提到過,如果程序中指定了構造方法,則默認構造方法不會再生成,本例即是如此。由于第24行實例化子類對象時找不到父類中的無參構造方法,所以程序出現(xiàn)了錯誤,而只要在Person類中增加一個什么都不做的構造方法,這一問題就可以解決了。
【例6-4】TestPersonStudentDemo3.java。6.1.2super關鍵字的使用
在前面的程序中曾經提到過super的使用,那么super到底是什么呢?從TestPersonStudentDemo1后面的更改程序中可以看出,super關鍵字出現(xiàn)在子類中,而且去調用了父類中的構造方法,所以super的主要功能是完成子類調用父類中的內容,也就是調用父類中的屬性或方法。將程序TestPersonStudentDemo3.java作相應的修改就形成了TestPersonStudentDemo4.java。
【例6-5】TestPersonStudentDemo4.java。
(3)第16~20行聲明一個子類的構造方法,此方法用super("張三",25)調用父類中有兩個參數(shù)的構造方法。
(4)第26行聲明并實例化一個Student類的對象s。
(5)第28行為Student對象s中的school賦值為“北京”。
讀者可以發(fā)現(xiàn),本例與例6-4的程序基本上是一樣的,唯一的不同是在子類的構造方法中明確指明了調用的是父類中有兩個參數(shù)的構造方法,所以程序在編譯時不再去找父類中的無參構造方法。用super調用父類中的構造方法,只能放在程序的第一行。
super關鍵字不僅可以調用父類中的構造方法,也可以調用父類中的屬性或方法,調用格式如下:
super.父類中的屬性;
super.父類中的方法();
【例6-6】TestPersonStudentDemo5.java。程序說明:
(1)第1~13行聲明一個名為Person的類,并聲明name與age兩個屬性、一個返回String類型的talk()方法,以及一個無參構造方法。
(2)第14~28行聲明一個名為Student的類,此類直接繼承自Person類。
(3)第21、22行通過super屬性的方式調用父類中的name與age屬性,并分別賦值。
(4)第24行調用父類中的talk()方法并打印信息。
從上面的程序中可以看出,子類Student可以通過super調用父類中的屬性或方法。在本例中如果程序第21、22、24行換成this調用也是可以的,那為什么還要用super呢?6.1.3節(jié)將給出答案。6.1.3限制子類的訪問
有時父類并不希望子類可以訪問自己類中的全部屬性或方法,需要將一些屬性與方法隱藏起來,不讓子類去使用,所以在聲明屬性或方法時往往加上“private”關鍵字,表示私有。
【例6-7】TestPersonStudentDemo6.java。對于例6-7,讀者可能會有這樣的結論:只要父類中的屬性被“private”聲明,那么子類就再也無法訪問到它了。實際上并不是這樣的,在父類中加入了private關鍵字修飾,其目的只是相當于對子類隱藏了此屬性,子類無法去顯式地調用這些屬性,但是可以隱式地去調用。下面的例子修改自例6-7。
【例6-8】TestPersonStudentDemo7.java。6.1.4復寫
“復寫”的概念與“重載”相似,它們均是Java“多態(tài)”的技術之一。所謂“重載”,指方法名稱相同,卻可在不同的場合做不同的事。當一個子類繼承一父類,而子類中的方法與父類中的方法的名稱、參數(shù)個數(shù)、類型都完全一致時,就稱子類中的這個方法復寫了父類中的方法。同理,如果子類中重復定義了父類中已有的屬性,則稱此子類中的屬性復寫了父類中的屬性。方法的復寫格式如下:程序說明:
(1)第1~9行聲明一個名為Person的類,其中聲明了name與age兩個屬性以及一個talk()方法。
(2)第11~25行聲明一個名為Student的類,此類繼承自Person類,也就繼承了name與age屬性,同時聲明了一個與父類中同名的talk()方法,也可以說此時Student類中的talk()方法復寫了Person類中的talk()方法。
(3)第30行實例化一個子類對象,并同時調用子類構造方法為屬性賦初值。
(4)第32行用子類對象調用talk()方法,但此時調用的是子類中的talk()方法。由輸出結果可以看出,在子類中復寫了父類中的talk()方法,所以子類對象在調用talk()方法時,實際上調用的是子類中被復寫好了的方法。另外可以看出,子類的talk()方法與父類的talk()方法在聲明權限時都聲明為public,也就是說這兩個方法的訪問權限都是一樣的。
子類復寫父類中的方法時,被子類復寫的方法不能擁有比父類更嚴格的訪問權限(關于訪問權限的概念,后面會有更詳細介紹)。例如:程序說明:
(1)第1~9行聲明一個Person類,其中聲明了name與age兩個屬性,以及一個talk()方法。
(2)第10~25行聲明一個Student類,此類繼承自Person,也就繼承了name與age屬性,同時聲明了一個與父類中同名的talk()方法,也可以說此時Student類中的talk()方法復寫了Person類中的talk()方法,在第23行通過super.talk()方式調用父類中的talk()方法。
(3)第30行實例化一個子類對象,并同時調用子類構造方法為屬性賦初值。
(4)第32行用子類對象調用talk()方法,但此時調用的是子類中的talk()方法。由上面程序可以看出,在子類中可以通過super()方法調用父類中被子類復寫的方法。
關于this與super關鍵字的使用,對于一些初學者來說可能容易混淆。表6-1對this與super的差別進行了比較。表6-1this與super的比較案例1繼承案例
【案例描述】
編寫一個people類,該類的名字是age、hand和leg,訪問權限是友好的int型成員變量,可以輸出age、hand和leg三個變量值的protectedvoidshowPeopleMess()方法。編寫一個Student類,該類是People類的子類。Student類中聲明一個名字是number、訪問權限是友好的int型成員變量。Student類中定義一個輸出number的值的voidtellNumber()方法,以及計算兩個整數(shù)的和的intadd(intx,inty)方法。編寫一個UniverStudent類,該類是Student的子類。
【代碼與注釋】 6.2抽象類
通過繼承,可以從原有的類派生出新的類。原有的類稱為基類或父類,而新的類則稱為派生類或子類。通過這種機制派生出的新的類不僅可以保留原有的類的功能,而且還可以擁有更多功能。除了上述機制之外,Java也可以創(chuàng)建一種類專門用做父類,這種類稱為“抽象類”。抽象類的作用有點類似“模版”,其目的是要設計者依據(jù)它的格式來修改并創(chuàng)建新的類。但是并不能直接由抽象類創(chuàng)建對象,只能通過抽象類派生出新的類,再由它來創(chuàng)建對象。
抽象類的定義規(guī)則如下:
(1)抽象類和抽象方法都必須用abstract關鍵字來修飾。
(2)抽象類不能被實例化,也就是不能用new關鍵字去產生對象。
(3)抽象方法只需聲明,而不需實現(xiàn)。
(4)含有抽象方法的類必須被聲明為抽象類,抽象類的子類必須復寫所有的抽象方法后才能被實例化,否則這個子類還是一個抽象類。
抽象類的定義格式如下:在抽象類定義的語法中,方法的定義可分為兩種:一種是一般的方法,它和前面介紹過的方法一樣;另一種是“抽象方法”,它是以abstract關鍵字為開頭的方法,此方法只聲明了返回值的數(shù)據(jù)類型、方法名稱與所需的參數(shù),沒有定義方法體。
【例6-11】TestAbstractDemo1.java。
(2)第9~23行聲明一個Student類,此類繼承自Person類,而且此類不為抽象類,所以需要復寫Person類中的抽象方法talk()。
(3)第24~38行聲明一個Worker類,此類繼承自Person類,而且此類不為抽象類,所以需要復寫Person類中的抽象方法talk()。
(4)第43、44行分別實例化Student類與Worker類的對象,并調用各自的構造方法初始化類屬性。
(5)第45、46行分別調用各自類中被復寫的talk()方法。
可以發(fā)現(xiàn),兩個子類Student、Worker都分別按各自的要求復寫了talk()方法。上面的程序可由圖6-6表示。圖6-6抽象類的繼承關系與一般類相同,在抽象類中,也可以擁有構造方法,但是這些構造方法必須在子類中被調用。例如: 6.3Object類
Java中有一個比較特殊的類—Object類,它是所有類的父類。如果一個類沒有使用extends關鍵字明確標識繼承另外一個類,那么這個類就默認繼承Object類。因此,Object類是Java類層中的最高層類,是所有類的超類。換句話說,Java中任何一個類都是它的子類。由于所有的類都是由Object類衍生出來的,所以Object類中的方法適用于所有類。
例如:由JDK的幫助文檔可知,在Object類的方法中有一個toString()方法。
此方法是在打印對象時被調用的。下面有兩個例子,一個未復寫toString()方法,另一個復寫了toString()方法,讀者可比較兩者的區(qū)別。
【例6-12】TestToStringDemo1.java。程序說明:
(1)第1~5行聲明一個名為Person的類,并明確指出繼承自Object類。
(2)第10行聲明并實例化一個Person類的對象p。
(3)第11行打印對象。
從上面的程序中可以看出,在打印對象p時實際上打印出的是一些無序的字符串。下面的例子復寫了Object類中的toString()方法。
【例6-13】TestToStringDemo2.java。 6.4final關鍵字
在Java中聲明類、屬性和方法時,可使用關鍵字final來修飾。
(1)?final標記的類不能被繼承。
(2)?final標記的方法不能被子類復寫。
(3)?final標記的變量(成員變量或局部變量)即為常量,只能賦值一次。
【例6-14】TestFinalDemo1.java。
6.5接口(interface)
接口(interface)是Java所提供的另一種重要技術,它的結構和抽象類非常相似,也具有數(shù)據(jù)成員與抽象方法,但它與抽象類又有以下兩點不同:
(1)接口中的數(shù)據(jù)成員必須初始化,且數(shù)據(jù)成員均為常量。
(2)接口中的方法必須全部聲明為abstract。也就是說,接口不能像抽象類一樣保有一般的方法,而必須全部是“抽象方法”。
接口定義的語法如下:接口與一般類一樣,本身也具有數(shù)據(jù)成員與方法,但數(shù)據(jù)成員一定要賦初值,且此值不能再更改,方法也必須是“抽象方法”。也正因為方法必須是抽象方法,而沒有一般的方法,所以接口定義的語法中,抽象方法聲明的關鍵字abstract是可以省略的。相同的情況也發(fā)生在數(shù)據(jù)成員身上,因數(shù)據(jù)成員必須賦初值,且此值不能再被更改,所以聲明數(shù)據(jù)成員的關鍵字final也可省略。事實上,只要記得以下兩點即可:
(1)接口中的“抽象方法”只要做聲明即可,而不用定義其處理方式。
(2)數(shù)據(jù)成員必須賦初值。在Java中接口是用于實現(xiàn)多繼承的一種機制,也是Java設計中最重要的一個環(huán)節(jié),每個由接口實現(xiàn)的類必須在類內部復寫接口中的抽象方法,且可自由地使用接口中的常量。
既然接口中只有抽象方法,那么它只要聲明而不用定義處理方式,于是自然可以聯(lián)想到接口也沒有辦法像一般類一樣,再用它來創(chuàng)建對象。利用接口打造新的類的過程稱為接口的實現(xiàn)(implementation)。
接口實現(xiàn)的語法如下:輸出結果:
學生->姓名:張三,年齡:25,職業(yè):學生!
程序說明:
(1)第1~8行聲明一個Person接口,在其中聲明了三個常量name、age、occupation,并分別賦值。
(2)第10~17行聲明一個Student類,此類實現(xiàn)Person接口,并復寫Person中的talk()方法。
(3)第22行實例化一個Student的對象s,并在第23行調用talk()方法,打印信息。接口是Java實現(xiàn)多繼承的一種機制,一個類只能繼承一個父類,但如果需要一個類繼承多個抽象方法,則明顯無法實現(xiàn),所以就出現(xiàn)了接口的概念。一個類只可以繼承一個父類,卻可以實現(xiàn)多個接口。接口與一般類一樣,均可通過擴展技術來派生出新的接口。原來的接口稱為基本接口或父接口,派生出的接口稱為派生接口或子接口。通過這種機制,派生接口不僅可以保留父接口的成員,同時也可加入新的成員以滿足實際需要。同樣地,接口的擴展(或繼承)也是通過關鍵字extends來實現(xiàn)的。有趣的是,一個接口可以繼承多個接口,這點與類的繼承有所不同。接口擴展的語法如下:程序說明:
(1)第1~5行聲明一個接口A,并聲明一個常量i和一個抽象方法sayI()。
(2)第6~10行聲明一個接口E,并聲明一個常量x和一個抽象方法sayE()。
(3)第12~16行聲明一個接口B,此接口同時繼承A、E接口,同時聲明一個常量j和一個抽象方法sayJ()。
(4)第19~32行聲明一個類C,此類實現(xiàn)了B接口,所以此類中要復寫接口A、B、E中的全部抽象方法。
由上述程序可以看出,與類的繼承不同的是,一個接口可以同時繼承多個接口,也就是同時繼承了多個接口的抽象方法與常量。案例2接口案例
【案例描述】
定義接口Sound,該接口有voidmakeSound()方法;定義一個SoundMachine類,該類有一個voidplay(Soundsound)方法,即該方法的參數(shù)是接口類型。編寫幾個實現(xiàn)Sound接口的類。
【代碼與注釋】
6.6對象的多態(tài)性
什么叫多態(tài)性呢?重載的最終效果就是調用同一個方法名稱,卻可以根據(jù)傳入?yún)?shù)的不同而得到不同的處理結果,這其實就是多態(tài)性的一種體現(xiàn)。
下面用一個例子為讀者簡單介紹一下多態(tài)的概念。
【例6-19】
TestJavaDemo1.java。程序說明:
(1)第1~11行聲明一個Person類,此類中有fun1()、fun2()兩個方法。
(2)第13~24行聲明一個Student類,此類繼承自Person類,并復寫了fun1()方法。
(3)第30行聲明一個Person類(父類)的對象,之后由子類對象去實例化此對象。
(4)第32行由父類對象調用fun1()方法。
從程序的輸出結果可以看出,p是父類的對象,但調用fun1()方法時并沒有調用其本身的fun1()方法,而是調用了子類中被復寫了的fun1()方法。之所以會產生這樣的結果,最根本的原因就是父類對象并非由其本身的類實例化,而是通過子類實例化,這就是所謂的對象的多態(tài)性,即子類實例化對象可以轉換為父類實例化對象。
在這里要著重講解兩個概念,希望讀者加以重視。
(1)向上轉型。在上面TestJavaDemo1.java中,父類對象通過子類對象去實例化,實際上就是對象的向上轉型。向上轉型是不需要進行強制類型轉換的,但是向上轉型會丟失精度。
(2)向下轉型。與向上轉型對應的一個概念就是“向下轉型”。所謂向下轉型,也就是說父類的對象可以轉換為子類對象。但是需要注意的是,這時必須進行強制的類型轉換。讀者可能覺得上面的兩個概念有些難以理解,下面舉例來幫助讀者理解:有個小孩在馬路上看見了一輛跑車,他指著跑車說那是汽車。相信讀者都認為這句話沒有錯,跑車的確符合汽車的標準,所以把跑車說成汽車并沒有錯誤,只是不準確而已。不管是小轎車也好,貨車也好,其實都是汽車,這在現(xiàn)實生活中是說得通的,在這里讀者可以將這些小轎車、貨車都想象成汽車的子類,它們都擴展了汽車的功能,都具備了汽車的功能,所以它們都可以叫做汽車,那么這種概念就稱為向上轉型。相反地,假如說把所有的汽車都當成跑車,那結果肯定是不正確的,因為汽車有很多種,必須明確指明是哪輛跑車才可以,需要加一些限制,這時就必須明確指明是哪輛車,所以需要進行強制說明。上面的解釋可以概括成如下兩句話:
(1)向上轉型可以自動完成。
(2)向下轉型必須進行強制類型轉換。
并非全部父類對象都可以強制轉換為子類對象。
【例6-20】
TestJavaDemo2.java。由上述程序可以看出,程序第32行Person對象p是由Person類本身實例化的,在第34行將Person對象p強制轉換為子類對象,這樣寫在語法上是沒有任何錯誤的,但是在運行時會發(fā)現(xiàn)出了異常,這是為什么呢?為什么父類不可以向子類轉換呢?其實這并不難理解,父類用其本身類實例化自己的對象,但它并不知道誰是自己的子類,那肯定在轉換的時候會出現(xiàn)錯誤,那么這個錯誤該如何糾正呢?只需要將第32行的代碼修改成如下形式即可:
Personp=newStudent();
這時相當于由子類去實例化父類對象,也就是說,這時父類知道有這么一個子類,所以下面進行轉換時就不會有問題了。6.6.1instanceof關鍵字的使用
可以用instanceof判斷一個類是否實現(xiàn)了某個接口,也可以用它來判斷一個實例對象是否屬于一個類。instanceof的語法格式如下:
對象instanceof類(或接口)
instanceof的返回值是布爾型的,或為真(true),或為假(false)。
【例6-21】
TestJavaDemo3.java。程序說明:
(1)第32行聲明一個父類對象p,并通過其子類實例化此對象。
(2)第32行用instanceof關鍵字判斷p對象是否是Student的實例。此例中,因為p是通過Student類實例化的,所以此條件滿足。
(3)第35~36行將p對象強制轉換為Student類的對象,并調用fun1()方法。調用此方法時,實際上調用的是被子類復寫了的fun1()方法。6.6.2復寫Object類中的equals方法
前面已經介紹過Object是所有類的父類,其中的toString()方法是需要被復寫的,如果讀者去查JDK手冊,會發(fā)現(xiàn)在Object類中有一個equals方法,此方法用于比較對象是否相等,而且此方法必須被復寫。為什么要復寫該方法呢?請看下面的例子,下面的例子沒有復寫equals()方法。
【例6-22】TestOverEquals.java。由上面的程序可以看出,兩個對象的內容完全相等,但為什么比較的結果不相等呢?因為p1與p2的內容分別在不同的內存空間,指向了不同的內存地址,所以在用equals比較時,實際上是調用了Object類中的equals方法。但此方法并不好用,所以在開發(fā)中往往需要復寫equals方法。
【例6-23】TestOverEquals2.java。輸出結果:
是同一個人!
程序說明:
(1)第1~34行聲明一個Person類,并在類中復寫了Object類的equals方法。
(2)第15行聲明一個Person對象p1,并用this實例化。此時,this就相當于當前調用此方法的對象,也就是第42行的t_p1對象。
(3)第17行判斷傳進去的實例對象o是否屬于Person類的實例化對象,如果是則進行轉型,否則返回false。
(4)第22行分別比較兩個對象的內容是否相等,如果不相等,則返回false。
(5)第42行通過t_p1調用equals方法,并將t_p2對象的實例傳到equals方法之中,比較兩個對象是否相等。
6.6.3接口對象的實例化
接口是無法直接實例化的,因為接口中沒有構造方法,但是可以根據(jù)對象多態(tài)性的概念,通過接口的子類對其進行實例化。
【例6-24】TestInterfaceObject。輸出結果:
Studentfun1()
程序說明:
(1)第1~4行聲明一個Person接口,此接口中只有一個抽象方法fun1()。
(2)第5~11行聲明一個Student類,此類實現(xiàn)Person接口,并復寫fun1()方法。
(3)第16行聲明一個Person接口的對象p,并通過其子類Student類去實例化此對象。
(4)第17行調用fun1()方法,此時調用的是子類中復寫了的fun1()方法。從上面的程序中可以看出,接口是可以被實例化的,但是不能被直接實例化,只能通過其子類進行實例化。在這里將Person聲明為
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 美發(fā)店污水管道鋪設協(xié)議
- 2024年電視劇臨時角色雇傭協(xié)議
- 家庭SPA別墅施工合同
- 養(yǎng)殖場公關經理合同范本
- 市政項目攪拌車租賃協(xié)議
- 2025年度商鋪租賃與商業(yè)設施共享合同3篇
- 2025版公司股東投資風險告知及責任承擔合同3篇
- 籃球館照明電照施工合同
- 用水量監(jiān)測協(xié)議
- 2024年版設備購買租賃合同
- 杏樹主要病蟲害及其防治方法
- 醫(yī)學檢驗技術專業(yè)《臨床實驗室管理》課程標準
- ACL導管維護三步曲臨床應用
- 《計算智能》課件
- 短視頻運營獲客短視頻如何打造
- 中學名著導讀課程設計
- 典范英語2a練習冊
- 汽車二級維護操作技術課件
- 建筑與市政施工現(xiàn)場安全衛(wèi)生與職業(yè)健康通用規(guī)范培訓課件
- 《食品安全知識》課件
- 婚禮籌備日程表完整版(表格版)
評論
0/150
提交評論