




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第5章 消息、繼承與多態(tài),5.1 消息 5.2 訪問(wèn)控制 5.3 多態(tài)機(jī)制 5.4 繼承機(jī)制 5.5 抽象類、接口與包,5.1 消 息在面向?qū)ο蠹夹g(shù)中,對(duì)象與對(duì)象之間并不是彼此孤立的,它們之間存在著聯(lián)系,對(duì)象之間的聯(lián)系是通過(guò)消息來(lái)傳遞的。在面向?qū)ο蟮某绦蛑?,消息就是?shù)據(jù)成員及成員方法的引用。5.1.1 消息的概念在日常生活中,人與人之間要進(jìn)行交流。某人可以向別人提供服務(wù),例如,他可以開汽車、教學(xué)生學(xué)習(xí)等;同時(shí)他也需要?jiǎng)e人為他提供服務(wù),例如,他要吃飯但不可能自己去種地,要穿衣不可能自己去織布,他必須請(qǐng)求別人的幫助;同樣,他什么時(shí)間講課,也必須得到他人的請(qǐng)求或命令?!罢?qǐng)求”或“命令”便是人與人進(jìn)行
2、交流的手段。,在面向?qū)ο蟮南到y(tǒng)中,把“請(qǐng)求”或“命令”抽象成“消息”,對(duì)象之間的聯(lián)系是通過(guò)消息傳遞來(lái)實(shí)現(xiàn)的。當(dāng)系統(tǒng)中的其他對(duì)象請(qǐng)求這個(gè)對(duì)象執(zhí)行某個(gè)服務(wù)時(shí),它就響應(yīng)這個(gè)請(qǐng)求,完成指定的服務(wù)。通常,我們把發(fā)送消息的對(duì)象稱為發(fā)送者,把接收消息的對(duì)象稱為接收者。對(duì)象間的聯(lián)系,只能通過(guò)消息傳遞來(lái)進(jìn)行。對(duì)象也只有在收到消息時(shí)才被激活,去完成消息要求的功能。,消息就是向?qū)ο蟀l(fā)出服務(wù)請(qǐng)求,是對(duì)數(shù)據(jù)成員和成員方法的引用。因此,它應(yīng)該含有這些信息:提供服務(wù)的對(duì)象標(biāo)識(shí)對(duì)象名、服務(wù)標(biāo)識(shí)方法名、輸入信息實(shí)際參數(shù)、回答信息返回值或操作結(jié)果。消息具有三個(gè)性質(zhì):(1) 同一對(duì)象可接收不同形式的多個(gè)消息,產(chǎn)生不同的響應(yīng)。(2)
3、 相同形式的消息可以發(fā)送給不同的對(duì)象,各對(duì)象所做出的響應(yīng)可以是截然不同的。(3) 消息的發(fā)送可以不考慮具體的接收者,對(duì)象可以響應(yīng)消息,也可以對(duì)消息不予理會(huì),對(duì)消息的響應(yīng)并不是必須的。,5.1.2 公有消息和私有消息在面向?qū)ο笙到y(tǒng)中,消息分為兩類:公有消息和私有消息。當(dāng)有一批消息同屬于一個(gè)對(duì)象時(shí),由外界對(duì)象直接發(fā)送給這個(gè)對(duì)象的消息稱為公有消息;對(duì)象發(fā)送給自己的消息稱為私有消息。私有消息對(duì)外是不開放的,外界不必了解它。外界對(duì)象只能向此對(duì)象發(fā)送公有消息,而不能發(fā)送私有消息,私有消息是由對(duì)象自身發(fā)送的。,5.1.3 特定于對(duì)象的消息特定于對(duì)象的消息是指將所有能支持此對(duì)象可接收消息的方法集中在一起,形成
4、一個(gè)大消息,稱為特定于對(duì)象的消息。這些消息讓對(duì)象執(zhí)行這個(gè)方法而不管它可能做什么及怎么做。特定于對(duì)象的消息可分為以下三種類型:(1) 可以返回對(duì)象內(nèi)部狀態(tài)的消息。(2) 可以改變對(duì)象內(nèi)部狀態(tài)的消息。(3) 可以做一些特定操作,改變系統(tǒng)狀態(tài)的消息。,【示例程序C5_1.java】 不同類型消息的傳遞示例。class Student public String name; public char sex; public int no; public int age; Student(int cno, String cname, char csex, int cage) name=cname; sex
5、=csex; no=cno; age=cage; ,public void showNo()System.out.println(No:+no); public void showName()System.out.println(Name:+name); public void showSex()System.out.println(Sex:+sex); public void showAge()System.out.println(age:+age);class StudentScore private int no; private double score; public void se
6、ndScore(int cno,double cscore), /下面兩條語(yǔ)句是對(duì)象發(fā)送給自身的消息,要求給自己的數(shù)據(jù)成員賦值, /這是一種私有消息,外界是不知道的 no=cno; score=cscore; void printScore()System.out.println(No:+no+ score:+score); public class C5_1 public static void main(String args), int m; /下面兩句發(fā)送new消息給類Student,要求創(chuàng)建st1、st2的對(duì)象 Student st1=new Student(101,zhang li
7、,F,18); Student st2=new Student(102,hong bing,M,17); /發(fā)送new消息給類StudentScore,要求創(chuàng)建sc1、sc2的對(duì)象 StudentScore sc1=new StudentScore(); StudentScore sc2=new StudentScore(); /* 向st1的對(duì)象發(fā)送顯示學(xué)號(hào)、名字、年齡的消息。這些消息都是公有消息。它們形成 了同一對(duì)象可接收不同形式的多個(gè)消息,產(chǎn)生不同的響應(yīng)*/,st1.showNo(); /這是一條消息,消息響應(yīng)的結(jié)果是顯示st1的對(duì)象的學(xué)號(hào) st1.showName(); /顯示對(duì)象姓名
8、的消息 st1.showAge(); /顯示對(duì)象年齡的消息 st1.age=20; /修改對(duì)象的數(shù)據(jù)成員的消息,修改st1對(duì)象的年齡 m=st1.age; /返回對(duì)象的數(shù)據(jù)成員的消息,將返回消息賦給變量m System.out.println(m=+m); /*向st2的對(duì)象發(fā)送兩個(gè)顯示信息的消息,與st1的對(duì)象相同,顯示學(xué)號(hào)及名字。這些消 息都是公有消息,說(shuō)明了相同形式的消息可以送給不同的對(duì)象,各對(duì)象所做出的響應(yīng) 可以是截然不同的*/,st2.showNo(); st2.showName(); /向sc1、sc2的對(duì)象各發(fā)送一個(gè)按學(xué)號(hào)輸入成績(jī)單的消息,這些消息都是公有消息 sc1.sendS
9、core(101,97); sc2.sendScore(102,84); /向sc1、sc2的對(duì)象各發(fā)送一個(gè)打印消息,這些消息都是公有消息 sc1.printScore(); sc2.printScore(); ,該程序的運(yùn)行結(jié)果如下:No:101Name:zhang liage:18m=20No:102Name:hong bingNo:101 score:97.0No:102 score:84.0,5.2 訪 問(wèn) 控 制一個(gè)類總能夠訪問(wèn)自己的數(shù)據(jù)成員和成員方法。但是,其他類是否能訪問(wèn)這個(gè)類的數(shù)據(jù)成員或成員方法,是由該類的訪問(wèn)控制符及該類數(shù)據(jù)成員和成員方法的訪問(wèn)控制符決定的。這就是說(shuō),訪問(wèn)控制
10、符是一組限定類、數(shù)據(jù)成員或成員方法是否可以被其他類訪問(wèn)的修飾符。類的訪問(wèn)控制符只有public一個(gè),缺省訪問(wèn)控制符時(shí)具有“友好訪問(wèn)”的特性。數(shù)據(jù)成員和成員方法的訪問(wèn)控制符有public、private、protected和缺省訪問(wèn)控制符等幾種。類、數(shù)據(jù)成員和成員方法的訪問(wèn)控制符及其作用見表5.1。,表5.1 類、數(shù)據(jù)成員和成員方法的訪問(wèn)控制符及其作用,通過(guò)聲明類的訪問(wèn)控制符可以使整個(gè)程序結(jié)構(gòu)清晰、嚴(yán)謹(jǐn),減少可能產(chǎn)生的類間干擾和錯(cuò)誤。,5.2.1 公共訪問(wèn)控制符publicJava的類是通過(guò)包的概念來(lái)組織的,簡(jiǎn)單地說(shuō),定義在同一個(gè)程序文件中的所有類都屬于同一個(gè)包。處于同一個(gè)包中的類都是可見的,即
11、可以不需任何說(shuō)明而方便地互相訪問(wèn)和引用。而對(duì)于不同包中的類,一般說(shuō)來(lái),它們相互之間是不可見的,當(dāng)然也不可能互相引用。然而,當(dāng)一個(gè)類被聲明為public時(shí),只要在其他包的程序中使用import語(yǔ)句引入這個(gè)public類,就可以訪問(wèn)和引用這個(gè)類,并創(chuàng)建這個(gè)類的對(duì)象,訪問(wèn)這個(gè)類內(nèi)部可見的數(shù)據(jù)成員和引用它的可見的方法。例如,Java類庫(kù)中的許多類都是公共類,我們?cè)诔绦蛑芯褪峭ㄟ^(guò)import語(yǔ)句將其引入的。,當(dāng)一個(gè)類的訪問(wèn)控制符為public時(shí),表明這個(gè)類作為整體對(duì)其他類是可見和可使用的,這個(gè)類就具有了被其他包中的類訪問(wèn)的可能性。但是,處于不同包中的public類作為整體對(duì)其他類是可見的,并不代表該類的
12、所有數(shù)據(jù)成員和成員方法也同時(shí)對(duì)其他類是可見的,這得由這些數(shù)據(jù)成員和成員方法的修飾符來(lái)決定。只有當(dāng)public類的數(shù)據(jù)成員和成員方法的訪問(wèn)控制符也被聲明為public時(shí),這個(gè)類的所有用public修飾的數(shù)據(jù)成員和成員方法才同時(shí)對(duì)其他類也是可見的。在程序設(shè)計(jì)時(shí),如果希望某個(gè)類能作為公共工具供其他的類和程序使用,則應(yīng)該把類本身和類內(nèi)的方法都聲明為public。例如,把Java類庫(kù)中的標(biāo)準(zhǔn)數(shù)學(xué)函數(shù)類math和標(biāo)準(zhǔn)數(shù)學(xué)函數(shù)方法都聲明為public,以供其他的類和程序使用。,需要注意的是,數(shù)據(jù)成員和成員方法的訪問(wèn)控制符被聲明為public時(shí),會(huì)造成安全性和封裝性下降,所以一般應(yīng)盡量少用?!臼纠绦駻.ja
13、va和B.java】 有無(wú)public訪問(wèn)控制符的不同。(1) A.java程序:package c51;public class A double x1; /友好訪問(wèn)的數(shù)據(jù)成員 public double x2; /公共的數(shù)據(jù)成員 public double ar(double x) /公共的成員方法 double s; s=x; return s; ,(2) B.java程序:package c52;import c51.A;public class B public static void main(String args) double s1; A p1=new A(); /創(chuàng)建A類p
14、1的對(duì)象 / p1.x1=7; x1不是公共數(shù)據(jù)成員,不能訪問(wèn) p1.x2=5.2; /訪問(wèn)A類p1的對(duì)象的數(shù)據(jù)成員 s1=p1.ar(8); /訪問(wèn)A類p1的對(duì)象的成員方法 System.out.println(“p1.x2=”+p1.x2+“ s1=”+s1); ,上述兩個(gè)程序文件的位置及其關(guān)系如圖5.1左上窗口所示,其運(yùn)行結(jié)果見圖5.1右下窗口所示。程序說(shuō)明:為了說(shuō)明有無(wú)public訪問(wèn)控制符的不同,我們?cè)赾51包的A.java文件中創(chuàng)建了A類,并定義了一個(gè)沒(méi)有public訪問(wèn)控制符的數(shù)據(jù)成員x1和一個(gè)由public修飾的數(shù)據(jù)成員x2;然后,我們又在c52包的B.java文件中創(chuàng)建B類,
15、在B類中創(chuàng)建A類p1的對(duì)象實(shí)例,并訪問(wèn)該對(duì)象的數(shù)據(jù)成員及成員方法??梢钥闯?,在B類中對(duì)于沒(méi)有public訪問(wèn)控制符的A類p1的對(duì)象的數(shù)據(jù)成員x1是不能訪問(wèn)的,編譯時(shí)會(huì)報(bào)錯(cuò),所以,程序中將其注釋掉了。,圖5.1 程序A.java和B.java的位置圖及運(yùn)行結(jié)果,5.2.2 缺省訪問(wèn)控制符如果一個(gè)類沒(méi)有訪問(wèn)控制符,說(shuō)明它具有缺省的訪問(wèn)控制特性,這種缺省的訪問(wèn)控制特性稱為“友好訪問(wèn)”。友好訪問(wèn)規(guī)定只有在同一個(gè)包中的對(duì)象才能訪問(wèn)和引用這些類,因此,友好訪問(wèn)又稱為包訪問(wèn)性。同樣道理,類內(nèi)的數(shù)據(jù)成員和成員方法如果沒(méi)有訪問(wèn)控制符來(lái)限定,那么它們同樣具有“友好訪問(wèn)”的特性,它們也具有包訪問(wèn)性,可以被同一個(gè)包中
16、的其他類所訪問(wèn)和引用。,【示例程序C5_2.java和ClassArea.java】 缺省訪問(wèn)控制符的程序示例。在ch5包中創(chuàng)建兩個(gè)類:ClassArea類和C5_2類。其中,ClassArea是缺省訪問(wèn)控制符的類,其功能是計(jì)算矩形面積;C5_2是一個(gè)公共類,在這個(gè)類中創(chuàng)建ClassArea類的實(shí)例對(duì)象ss,并訪問(wèn)該對(duì)象的成員方法。,(1) ClassArea.java文件:package ch5;class ClassArea double lon,wid;/數(shù)據(jù)成員的修飾符為缺省 double area(double x,double y)/成員方法的修飾符為缺省 double s; /方
17、法內(nèi)的變量 lon=x; wid=y; s=lon*wid; /求矩形面積 return s; /返回面積值 ,(2) C5_2.java文件:package ch5;public class C5_2 public static void main(String args) double a=2.2,b=3.1,z;/*在類C5_2中創(chuàng)建被訪問(wèn)ClassArea類的ss的對(duì)象,并訪問(wèn)對(duì)象的成員方法。這就是說(shuō),包中類是可見的,可以互相引用*/ ClassArea ss=new ClassArea(); z=ss.area(a,b); /訪問(wèn)ss的對(duì)象的成員方法 System.out.print
18、ln(“z=”+z); ,上述兩個(gè)程序文件的位置及其關(guān)系如圖5.2左上窗口所示,其運(yùn)行結(jié)果見圖5.2右下窗口,是z=6.820000000000001。,圖5.2 程序C5_2.java和ClassArea.java位置圖及運(yùn)行結(jié)果,5.2.3 私有訪問(wèn)控制符private用private修飾的數(shù)據(jù)成員或成員方法只能被該類自身訪問(wèn)和修改,而不能被任何其他類(包括該類的子類)訪問(wèn)和引用。它提供了最高的保護(hù)級(jí)別。當(dāng)其他類希望獲取或修改私有成員時(shí),需要借助于類的方法來(lái)實(shí)現(xiàn)?!臼纠绦駽5_3.java】 同一個(gè)包中,用private修飾的父類的數(shù)據(jù)成員不能被子類的實(shí)例對(duì)象引用,故程序中將該語(yǔ)句變成了
19、注釋語(yǔ)句。,class P1 private int n=9; /私有數(shù)據(jù)成員n int nn; P1( ) /構(gòu)造方法 nn=n+; /可以被該類的對(duì)象自身訪問(wèn)和修改 void ma( ) System.out.println(n=+n); /可以被該類的對(duì)象自身訪問(wèn)public class C5_3 extends P1 /類class C5_3是類P1的子類 public static void main(String args), P1 m1=new P1( ); System.out.println(“m1.nn=”+m1.nn); / System.out.println(“m1.
20、n=”+m1.n); 錯(cuò),不能引用父類的私有成員 m1.ma( ); /可以引用P1類自身的成員方法 該程序的運(yùn)行結(jié)果如下:m1.nn=9 n=10,5.2.4 保護(hù)訪問(wèn)控制符protected用protected修飾的成員變量可以被三種類引用:該類自身,與它在同一個(gè)包中的其他類以及在其他包中的該類的子類。使用protected修飾符的主要作用是允許其他包中的它的子類來(lái)訪問(wèn)父類的特定屬性?!臼纠绦駽41.java和C42.java】 當(dāng)父類的數(shù)據(jù)成員用protected修飾時(shí),其他包的子類引用該數(shù)據(jù)成員的情況。具體情況見程序中的注釋。,(1) C41.java程序:package c51;p
21、ublic class C41 protected double x1; double x2; protected double ar(double x) double s; s=x; return s; ,(2) C42.java程序:package c52;import c51.C41;public class C42 extends C41 public static void main(String args) double s1; C42 p1=new C42(); p1.x1=7; /可以訪問(wèn),屬性x1是protected修飾的 s1=p1.ar(4); /可以訪問(wèn),方法ar()是
22、protected修飾的,/ p1.x2=9; 錯(cuò),不能訪問(wèn),x2沒(méi)有訪問(wèn)控制符,不能被另一包的實(shí)例對(duì)象訪問(wèn) System.out.println(“p1.x1=”+p1.x1+“ s1=”+s1); 程序C41.java和C42.java的位置及其關(guān)系見圖5.3左上窗口所示,其運(yùn)行結(jié)果見圖5.3右下窗口,為p1.x1=7.0 s1=4.0。,圖5.3 程序C41.java和C42.java位置圖及運(yùn)行結(jié)果,5.3 多 態(tài) 機(jī) 制多態(tài)是面向?qū)ο笙到y(tǒng)中的又一重要特性,它描述的是同名方法可以根據(jù)發(fā)送消息的對(duì)象傳送參數(shù)的不同,采取不同的行為方式的特性。面向?qū)ο笙到y(tǒng)中采用多態(tài),大大提高了程序的抽象程度
23、和簡(jiǎn)潔性,更重要的是,它最大限度地降低了類和程序模塊之間的耦合性,提高了類模塊的封閉性,使得它們不需了解對(duì)方的具體細(xì)節(jié),就可以很好地共同工作。這一點(diǎn)對(duì)程序的設(shè)計(jì)、開發(fā)和維護(hù)都有很大的好處。,5.3.1 多態(tài)的概念多態(tài)是指一個(gè)程序中具有相同名字而內(nèi)容不同的方法共存的情況。這些方法同名的原因是它們的最終功能和目的都相同,但是由于在完成同一功能時(shí)可能遇到不同的具體情況,因此需要定義包含不同具體內(nèi)容的方法,來(lái)代表多種具體實(shí)現(xiàn)形式。多態(tài)是面向?qū)ο蟪绦蛟O(shè)計(jì)中的一個(gè)重要特性,其目的是提高程序的抽象度、封閉性和簡(jiǎn)潔性,統(tǒng)一一個(gè)或多個(gè)相關(guān)類對(duì)外的接口。Java中提供了兩種多態(tài)機(jī)制:重載與覆蓋。,5.3.2 重載
24、當(dāng)在同一類中定義了多個(gè)同名而不同內(nèi)容的成員方法時(shí),我們稱這些方法是重載(override)的方法。重載的方法主要通過(guò)形式參數(shù)列表中參數(shù)的個(gè)數(shù)、參數(shù)的數(shù)據(jù)類型和參數(shù)的順序等方面的不同來(lái)區(qū)分。在編譯期間,Java編譯器要檢查每個(gè)方法所用的參數(shù)數(shù)目和類型,然后調(diào)用正確的方法。,【示例程序C5_5.java】 加法運(yùn)算重載的例子。import java.applet.Applet;import java.awt.Graphics;public class C5_5 extends Applet int add(int a, int b) /重載的方法1 return(a+b);double add(d
25、ouble x, double y) /重載的方法2 return(x+y); double add(double x, double y, double z) /重載的方法3 return(x+y+z); ,public void paint(Graphics g) g.drawString(“Sum is:”+add(8.5,2.3),5,10); g.drawString(“Sum is:”+add(21,38),5,30); g.drawString(“Sum is:”+add(8.5,2.3,8.5+2.3),5,50);該程序的運(yùn)行結(jié)果如下:Sum is: 10.8Sum is:
26、59Sum is: 21.6,該類中定義了三個(gè)名為add的方法:第一個(gè)方法是計(jì)算兩個(gè)整數(shù)的和;第二個(gè)方法是計(jì)算兩個(gè)浮點(diǎn)數(shù)的和;第三個(gè)方法是計(jì)算三個(gè)浮點(diǎn)數(shù)的和。編譯器根據(jù)方法被引用時(shí)提供的實(shí)際參數(shù),選擇并執(zhí)行對(duì)應(yīng)的重載方法。,5.3.3 覆蓋由于面向?qū)ο笙到y(tǒng)中的繼承機(jī)制,子類可以繼承父類的方法。但是,子類的某些特征可能與從父類中繼承來(lái)的特征有所不同,為了體現(xiàn)子類的這種個(gè)性,Java允許子類對(duì)父類的同名方法重新進(jìn)行定義,即在子類中可以定義與父類中已定義的方法同名而內(nèi)容不同的方法。這種多態(tài)被稱為覆蓋(overload)。由于覆蓋的同名方法存在于子類對(duì)父類的關(guān)系中,因此只需在方法引用時(shí)指明引用的是父類
27、的方法還是子類的方法,就可以很容易地把它們區(qū)分開來(lái)。具體應(yīng)用請(qǐng)參閱5.4.3節(jié)。,5.4 繼 承 機(jī) 制繼承是面向?qū)ο蟪绦蛟O(shè)計(jì)的又一種重要手段。在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,采用繼承的機(jī)制可以有效地組織程序的結(jié)構(gòu),設(shè)計(jì)系統(tǒng)中的類,明確類間關(guān)系,充分利用已有的類來(lái)完成更復(fù)雜、深入的開發(fā),大大提高程序開發(fā)的效率,降低系統(tǒng)維護(hù)的工作量。,5.4.1 繼承的概念同類事物具有共同性,在同類事物中,每個(gè)事物又具有其特殊性。運(yùn)用抽象的原則舍棄對(duì)象的特殊性,抽取其共同性,則可得到一個(gè)適應(yīng)于一批對(duì)象的類,這便是一般類;而那些具有特殊性的類稱為特殊類。也就是說(shuō),如果類B具有類A的全部屬性和方法,而且又具有自己特有的某些
28、屬性和方法,則把類A稱做一般類,把類B叫做類A的特殊類。例如:考慮輪船和客輪這兩個(gè)類。輪船具有噸位、時(shí)速、吃水線等屬性,并具有行駛、停泊等服務(wù);客輪具有輪船的全部屬性與服務(wù),又有自己的特殊屬性(如載客量)和服務(wù)(如供餐等)。若把輪船看做一般類,則客輪是輪船的特殊類。,在面向?qū)ο蟪绦蛟O(shè)計(jì)中運(yùn)用繼承原則,就是在每個(gè)由一般類和特殊類形成的一般特殊結(jié)構(gòu)中,把一般類的對(duì)象實(shí)例和所有特殊類的對(duì)象實(shí)例都共同具有的屬性和操作一次性地在一般類中進(jìn)行顯式定義,在特殊類中不再重復(fù)地定義一般類中已經(jīng)定義的東西,但是在語(yǔ)義上,特殊類卻自動(dòng)地、隱含地?fù)碛兴囊话泐?以及所有更上層的一般類)中定義的屬性和操作。特殊類的對(duì)象
29、擁有其一般類的全部或部分屬性與方法,稱做特殊類對(duì)一般類的繼承。,繼承所表達(dá)的就是一種對(duì)象類之間的相交關(guān)系,它使得某類對(duì)象可以繼承另外一類對(duì)象的數(shù)據(jù)成員和成員方法。若類B繼承類A,則屬于類B的對(duì)象便具有類A的全部或部分性質(zhì)(數(shù)據(jù)屬性)和功能(操作),我們稱被繼承的類A為基類、父類或超類,而稱繼承類B為A的派生類或子類。父類與子類的層次關(guān)系如圖5.4所示。,圖5.4 父類與子類的層次關(guān)系,繼承避免了對(duì)一般類和特殊類之間共同特征進(jìn)行的重復(fù)描述。同時(shí),通過(guò)繼承可以清晰地表達(dá)每一項(xiàng)共同特征所適應(yīng)的概念范圍在一般類中定義的屬性和操作適用于這個(gè)類本身以及它以下的每一層特殊類的全部對(duì)象。運(yùn)用繼承原則使得系統(tǒng)模
30、型更簡(jiǎn)潔、清晰。,5.4.2 繼承的特征一般來(lái)說(shuō),繼承具有下述特征:(1) 繼承關(guān)系是傳遞的。若類C繼承類B,類B繼承類A,則類C既有從類B那里繼承下來(lái)的屬性與方法,也有從類A那里繼承下來(lái)的屬性與方法,還可以有自己新定義的屬性和方法。繼承來(lái)的屬性和方法盡管是隱式的,但仍是類C的屬性和方法。繼承是在一些比較一般的類的基礎(chǔ)上構(gòu)造、建立和擴(kuò)充新類的最有效的手段。(2) 繼承簡(jiǎn)化了人們對(duì)事物的認(rèn)識(shí)和描述,能清晰地體現(xiàn)相關(guān)類間的層次結(jié)構(gòu)關(guān)系。,(3) 繼承提供了軟件復(fù)用功能。若類B繼承類A,那么建立類B時(shí)只需要再描述與基類(類A)不同的少量特征(數(shù)據(jù)成員和成員方法)即可。這種做法能減小代碼和數(shù)據(jù)的冗余度
31、,大大增加程序的重用性。(4) 繼承通過(guò)增強(qiáng)一致性來(lái)減少模塊間的接口和界面,大大增加了程序的易維護(hù)性。,(5) 提供多重繼承機(jī)制。從理論上來(lái)說(shuō),一個(gè)類可以是多個(gè)一般類的特殊類,它可以從多個(gè)一般類中繼承屬性與方法,這便是多重繼承。Java出于安全性和可靠性的考慮,僅支持單重繼承,而通過(guò)使用接口機(jī)制來(lái)實(shí)現(xiàn)多重繼承。圖5.5所示為一個(gè)單重繼承與多重繼承的例子。在這個(gè)模型中,“本科生”、“研究生”、“脫產(chǎn)研究生”都為單繼承,而“在職研究生” 為多重繼承,因?yàn)樗粌H繼承“學(xué)生”/“研究生”的屬性和行為,還繼承“教師”的屬性和行為。,圖5.5 單重繼承與多重繼承的例子,5.4.3 Java用extends
32、指明繼承關(guān)系在Java程序設(shè)計(jì)中,繼承是通過(guò)extends關(guān)鍵字來(lái)實(shí)現(xiàn)的。在定義類時(shí)使用extends關(guān)鍵字指明新定義類的父類,新定義的類稱為指定父類的子類,這樣就在兩個(gè)類之間建立了繼承關(guān)系。這個(gè)新定義的子類可以從父類那里繼承所有非private的屬性和方法作為自己的成員。實(shí)際上,在定義一個(gè)類而不給出extends關(guān)鍵字及父類名時(shí),默認(rèn)這個(gè)類是系統(tǒng)類object的子類。下面分不同情況來(lái)講解繼承關(guān)系。,1數(shù)據(jù)成員的繼承子類可以繼承父類的所有非私有的數(shù)據(jù)成員?!臼纠绦駽5_6.java】 數(shù)據(jù)成員的繼承。class A1 int x=25; private int z; /不能被子類繼承的私有數(shù)
33、據(jù)成員zclass C5_6 extends A1 /A1是C5_6的父類,C5_6是A1的子類 public static void main(String argS), C5_6 p=new C5_6(); System.out.println(“p.x=”+p.x); /輸出繼承來(lái)的數(shù)據(jù)成員的值 /System.out.println(“p.z=”+p.z); 錯(cuò),不能繼承private修飾的z 該程序的運(yùn)行結(jié)果如下:p.x=25,2數(shù)據(jù)成員的隱藏?cái)?shù)據(jù)成員的隱藏是指在子類中重新定義一個(gè)與父類中已定義的數(shù)據(jù)成員名完全相同的數(shù)據(jù)成員,即子類擁有了兩個(gè)相同名字的數(shù)據(jù)成員,一個(gè)是繼承自父類的,另
34、一個(gè)是自己定義的。當(dāng)子類引用這個(gè)同名的數(shù)據(jù)成員時(shí),默認(rèn)操作是引用它自己定義的數(shù)據(jù)成員,而把從父類那里繼承來(lái)的數(shù)據(jù)成員“隱藏”起來(lái)。當(dāng)子類要引用繼承自父類的同名數(shù)據(jù)成員時(shí),可使用關(guān)鍵字super引導(dǎo),這部分內(nèi)容將在5.4.4節(jié)介紹。,【示例程序C5_7.java】 數(shù)據(jù)成員的隱藏。class A11 int x=8; /父類中定義了數(shù)據(jù)成員xclass C5_7 extends A11 int x=24; /子類中也定義了數(shù)據(jù)成員x public static void main(String argS) int s1,s2; A11 p=new A11( ); /創(chuàng)建父類p的對(duì)象 C5_7 p
35、1=new C5_7( ); /創(chuàng)建子類p1的對(duì)象 s1=p.x;,s2=p1.x; /子類對(duì)象引用自己的數(shù)據(jù)成員,把父類數(shù)據(jù)成員“隱藏”起來(lái) System.out.println(“s1=”+s1); System.out.println(“s2=”+s2); 該程序的運(yùn)行結(jié)果如下:s1=8 s2=24,3成員方法的繼承子類可以繼承父類的非私有成員方法。下面的程序說(shuō)明這一問(wèn)題。【示例程序C5_8.java】 成員方法的繼承。class A2 int x=0,y=1; void Myp() System.out.println(“x=”+x+“ y=”+y); private void Pri
36、ntme() System.out.println(“x=”+x+“ y=”+y); ,public class C5_8 extends A2 public static void main(String arg) int z=3; C5_8 p1=new C5_8(); p1.Myp(); / p1.Printme(); 錯(cuò),不能繼承父類的private方法 該程序的運(yùn)行結(jié)果如下:x=0 y=1,4成員方法的覆蓋子類可以重新定義與父類同名的成員方法,實(shí)現(xiàn)對(duì)父類方法的覆蓋(overload)。方法的覆蓋與數(shù)據(jù)成員的隱藏的不同之處在于:子類隱藏父類的數(shù)據(jù)成員只是使之不可見,父類同名的數(shù)據(jù)成員在
37、子類對(duì)象中仍然占有自己獨(dú)立的內(nèi)存空間;子類方法對(duì)父類同名方法的覆蓋將清除父類方法占用的內(nèi)存,從而使父類方法在子類對(duì)象中不復(fù)存在。,【示例程序C5_9.java】 成員方法的覆蓋。class A3 int x=10; int y=31; public void Printme() System.out.println(“x=”+x+“ y=”+y);public class C5_9 extends A3 int z=35; public void Printme() /子類中定義了與父類同名的成員方法,實(shí)現(xiàn)覆蓋 System.out.println( z=+z); ,public static
38、 void main(String arg) A3 p2=new A3(); /創(chuàng)建父類p2的對(duì)象 C5_9 p1=new C5_9(); /創(chuàng)建子類p1的對(duì)象 p1.Printme(); /子類對(duì)象引用子類方法,覆蓋了父類的同名方法 p2.Printme(); /父類對(duì)象引用父類方法 該程序的運(yùn)行結(jié)果如下:z=35 x=10 y=31,方法的覆蓋中需要注意的是:子類在重新定義父類已有的方法時(shí),應(yīng)保持與父類完全相同的方法名、返回值類型和參數(shù)列表,否則就不是方法的覆蓋,而是子類定義自己特有的方法,與父類的方法無(wú)關(guān)。,5.4.4 this與super1this的使用場(chǎng)合在一些容易混淆的場(chǎng)合,例如,
39、當(dāng)成員方法的形參名與數(shù)據(jù)成員名相同,或者成員方法的局部變量名與數(shù)據(jù)成員名相同時(shí),在方法內(nèi)借助this來(lái)明確表示引用的是類的數(shù)據(jù)成員,而不是形參或局部變量,從而提高程序的可讀性。簡(jiǎn)單地說(shuō),this代表了當(dāng)前對(duì)象的一個(gè)引用,可將其理解為對(duì)象的另一個(gè)名字,通過(guò)這個(gè)名字可以順利地訪問(wèn)對(duì)象,修改對(duì)象的數(shù)據(jù)成員,調(diào)用對(duì)象的方法。歸納起來(lái),this的使用場(chǎng)合有下述三種:,(1) 用來(lái)訪問(wèn)當(dāng)前對(duì)象的數(shù)據(jù)成員,其使用形式如下:this.數(shù)據(jù)成員(2) 用來(lái)訪問(wèn)當(dāng)前對(duì)象的成員方法,其使用形式如下:this.成員方法(參數(shù))(3) 當(dāng)有重載的構(gòu)造方法時(shí),用來(lái)引用同類的其他構(gòu)造方法,其使用形式如下:this(參數(shù))下
40、面通過(guò)例子來(lái)說(shuō)明前兩種用法,關(guān)于第三種用法,將在5.4.5節(jié)介紹。,【示例程序C5_10.java】 this的使用。class A4 int x=0; int y=1; public void Printme() System.out.println(“x=”+x+“ y=”+y); System.out.println(“I am an ”+this.getClass().getName(); /用this來(lái)訪問(wèn)當(dāng)前對(duì)象的成員方法,通過(guò)this表示當(dāng)前對(duì)象,來(lái)打印當(dāng)前對(duì)象的類名。 /其中的getClass()和getName()是系統(tǒng)類庫(kù)中提供的方法 ,public class C5_10
41、 extends A4 public static void main(String arg) C5_10 p1=new C5_10(); p1.Printme(); 該程序的運(yùn)行結(jié)果如下:x=0 y=1I am an C5_10,【示例程序C5_11.java】 this的使用。class AlassArea double x,y; double area(double x,double y) double s; this.x=x; /借助this來(lái)表示引用的是類數(shù)據(jù)成員 this.y=y; s=this.x * this.y; return s; ,public class C5_11 e
42、xtends AlassArea public static void main(String args) double a=2.2,b=3.1,z; C5_11 ss=new C5_11(); /創(chuàng)建ss的對(duì)象 z=ss.area(a,b);/引用父類對(duì)象的成員方法求面積 System.out.println(“z=”+z); 該程序的運(yùn)行結(jié)果如下:z=6.820000000000001,【示例程序C5_12.java】 計(jì)算圓的面積和周長(zhǎng)。public class C5_12 public static void main(String args) double x; Circle cir
43、=new Circle(5.0); x=cir.area(); System.out.println(“圓的面積=”+x); x=cir.perimeter(); System.out.println(“圓的周長(zhǎng)=”+x); ,class Circle double r; /定義半徑 final double PI=3 /定義圓周率 public Circle(double r) /類的構(gòu)造方法 this.r=r; /通過(guò)構(gòu)造方法給r賦值 double area() /計(jì)算圓面積的方法 return PI*r*r; double perimeter() /計(jì)算圓周長(zhǎng)的
44、方法 return 2*(this.area()/r); /使用this變量獲取圓的面積 ,該程序的運(yùn)行結(jié)果如下:圓的面積=78.53981633974999圓的周長(zhǎng)=31.415926535899995,2super的使用場(chǎng)合super表示的是當(dāng)前對(duì)象的直接父類對(duì)象,是當(dāng)前對(duì)象的直接父類對(duì)象的引用。所謂直接父類,是相對(duì)于當(dāng)前對(duì)象的其他“祖先”類而言的。例如,假設(shè)類A派生出子類B,類B又派生出自己的子類C,則B是C的直接父類,而A是C的祖先類。super代表的就是直接父類。若子類的數(shù)據(jù)成員或成員方法名與父類的數(shù)據(jù)成員或成員方法名相同,當(dāng)要調(diào)用父類的同名方法或使用父類的同名數(shù)據(jù)成員時(shí),可用關(guān)鍵字
45、super來(lái)指明父類的數(shù)據(jù)成員和方法。,super的使用方法有三種:(1) 用來(lái)訪問(wèn)直接父類隱藏的數(shù)據(jù)成員,其使用形式如下:super.數(shù)據(jù)成員(2) 用來(lái)調(diào)用直接父類中被覆蓋的成員方法,其使用形式如下:super.成員方法(參數(shù))(3) 用來(lái)調(diào)用直接父類的構(gòu)造方法,其使用形式如下:super(參數(shù))下面通過(guò)例子來(lái)說(shuō)明前兩種用法,關(guān)于第三種用法,將在5.4.5節(jié)介紹。,【示例程序C5_13.java】 super的使用。class A5 int x=4; int y=1; public void printme() System.out.println(“x=”+x+“ y=”+y); Sys
46、tem.out.println(“class name: ”+this.getClass().getName(); ,public class C5_13 extends A5 int x; public void printme() int z=super.x+6; /引用父類(即A5類)的數(shù)據(jù)成員 super.printme(); /調(diào)用父類(即A5類)的成員方法 System.out.println(“I am an ”+this.getClass().getName(); x=5; System.out.println(“ z=”+z+“ x=”+x); /打印子類的數(shù)據(jù)成員 ,pub
47、lic static void main(String arg) int k; A5 p1=new A5(); C5_13 p2=new C5_13(); p1.printme(); p2.printme(); / super.printme(); /錯(cuò),在static方法中不能引用非static成員方法 / k=super.x+23; /錯(cuò),在static方法中不能引用非static數(shù)據(jù)成員 ,該程序的運(yùn)行結(jié)果如下:x=4 y=1class name: A5x=4 y=1class name: c5_13I am an c5_13z=10 x=5,5.4.5 構(gòu)造方法的重載與繼承1構(gòu)造方法的
48、重載一個(gè)類的若干個(gè)構(gòu)造方法之間可以相互調(diào)用。當(dāng)一個(gè)構(gòu)造方法需要調(diào)用另一個(gè)構(gòu)造方法時(shí),可以使用關(guān)鍵字this,同時(shí)這個(gè)調(diào)用語(yǔ)句應(yīng)該是整個(gè)構(gòu)造方法的第一條可執(zhí)行語(yǔ)句。使用關(guān)鍵字this來(lái)調(diào)用同類的其他構(gòu)造函數(shù)時(shí),優(yōu)點(diǎn)同樣是可以最大限度地提高對(duì)已有代碼的利用程度,提高程序的抽象度和封裝性,減少程序的維護(hù)工作量。,【示例程序C5_14.java】 構(gòu)造方法的重載。class Addclass public int x=0,y=0,z=0; /以下是多個(gè)同名不同參數(shù)的構(gòu)造方法 Addclass(int x) /可重載的構(gòu)造方法1 this.x=x; Addclass(int x,int y) /可重載的
49、構(gòu)造方法2 this(x); /當(dāng)前構(gòu)造方法調(diào)用可重載的構(gòu)造方法1 this.y=y; ,Addclass(int x,int y,int z) /可重載的構(gòu)造方法3 this(x,y); /當(dāng)前構(gòu)造方法調(diào)用可重載的構(gòu)造方法2 this.z=z; public int add() return x+y+z;public class C5_14, public static void main(String args) Addclass p1=new Addclass(2,3,5); Addclass p2=new Addclass(10,20); Addclass p3=new Addclas
50、s(1); System.out.println(“x+y+z=”+p1.add(); System.out.println(“x+y=”+p2.add(); System.out.println(“x=”+p3.add(); ,該程序的運(yùn)行結(jié)果如下:x+y+z=10 x+y=30 x=1,2構(gòu)造方法的繼承子類可以繼承父類的構(gòu)造方法,構(gòu)造方法的繼承遵循以下的原則:(1) 子類無(wú)條件地繼承父類的不含參數(shù)的構(gòu)造方法。(2) 如果子類自己沒(méi)有構(gòu)造方法,則它將繼承父類的無(wú)參數(shù)構(gòu)造方法,并將這些方法作為自己的構(gòu)造方法;如果子類自己定義了構(gòu)造方法,則在創(chuàng)建新對(duì)象時(shí),它將先執(zhí)行繼承自父類的無(wú)參數(shù)構(gòu)造方法,然
51、后再執(zhí)行自己的構(gòu)造方法。(3) 對(duì)于父類的含參數(shù)構(gòu)造方法,子類可以通過(guò)在自己的構(gòu)造方法中使用super關(guān)鍵字來(lái)調(diào)用它,但這個(gè)調(diào)用語(yǔ)句必須是子類構(gòu)造方法的第一條可執(zhí)行語(yǔ)句。,【示例程序C5_15.java】 構(gòu)造方法的繼承。class Addclass2 public int x=0,y=0,z=0; Addclass2(int x) /父類可重載的構(gòu)造方法1 this.x=x; Addclass2(int x,int y) /父類可重載的構(gòu)造方法2 this.x=x; this.y=y; Addclass2(int x,int y,int z) /父類可重載的構(gòu)造方法3 this.x=x; t
52、his.y=y; this.z=z; public int add() return x+y+z;,public class C5_15 extends Addclass2 int a=0,b=0,c=0; C5_15(int x) /子類可重載的構(gòu)造方法1 super(x); a=x+7; C5_15(int x,int y) /子類可重載的構(gòu)造方法2 super(x,y); a=x+5; b=y+5; ,C5_15(int x,int y,int z)/子類可重載的構(gòu)造方法3 super(x,y,z); a=x+4; b=y+4; c=z+4; public int add() Syste
53、m.out.println(“super: x+y+z=”+super.add(); return a+b+c; ,public static void main(String args) C5_15 p1=new C5_15(2,3,5); C5_15 p2=new C5_15(10,20); C5_15 p3=new C5_15(1); System.out.println(a+b+c=+p1.add(); System.out.println(a+b=+p2.add(); System.out.println(a=+p3.add(); ,該程序的運(yùn)行結(jié)果如下:super: x+y+z=1
54、0a+b+c=22super: x+y+z=30a+b=40super: x+y+z=1a=8,5.4.6 向方法傳遞對(duì)象前面已講過(guò)傳遞給方法的參數(shù)可以是表達(dá)式(如常量、變量)、對(duì)象等,并說(shuō)明傳遞給方法的參數(shù)若是變量,則只能由實(shí)參傳遞給形參,而不能由形參帶回,即它是一種單向值傳遞。也就是說(shuō),在方法的引用過(guò)程中,對(duì)于形參變量值的修改并不影響實(shí)參變量值。但是,傳遞給方法的參數(shù)若是對(duì)象,則實(shí)參與形參的對(duì)象的引用指向同一個(gè)對(duì)象,因此成員方法中對(duì)對(duì)象的數(shù)據(jù)成員的修改,會(huì)使實(shí)參對(duì)象的數(shù)據(jù)成員值也發(fā)生同樣的變化。這種參數(shù)的傳遞方式被稱為“雙向地址傳遞”。,【示例程序C5_16.java】 方法中的參數(shù)是對(duì)象
55、時(shí)的情形。import java.applet.Applet;import java.awt.Graphics;class Student1 public String Name; public int age=16; public int score=0; public void ShowStudent(Graphics g,int x,int y), g.drawString(Name:+Name,x,y); g.drawString(age:+age,x,y+20); g.drawString(score:+score,x,y+40); public class C5_16 extend
56、s Appletpublic void studentAttributes(Student1 s,String Name, int age, int score) s.Name=Name; s.age=age; s.score=score;,public void paint(Graphics g) Student1 st1=new Student1( ); /創(chuàng)建st1的對(duì)象 Student1 st2=new Student1( ); /創(chuàng)建st2的對(duì)象 studentAttributes(st1,“zhang”,23,81); / st1的對(duì)象作為實(shí)參 studentAttributes(
57、st2,“l(fā)i”,24,90); / st2的對(duì)象作為實(shí)參 st1.ShowStudent(g,25,25); /執(zhí)行此方法可發(fā)現(xiàn)st1的對(duì)象將新值帶回 st2.ShowStudent(g,25,120); /再次執(zhí)行此方法可發(fā)現(xiàn)st2的對(duì)象將新值帶回 該程序的運(yùn)行結(jié)果如圖5.6所示。,圖5.6 程序C5_16的運(yùn)行結(jié)果,5.4.7 繼承與封裝的關(guān)系在面向?qū)ο笙到y(tǒng)中,有了封裝機(jī)制以后,對(duì)象之間只能通過(guò)消息傳遞進(jìn)行通信。那么,繼承機(jī)制的引入是否削弱了對(duì)象概念的封裝性?繼承和封裝是否矛盾?其實(shí)這兩個(gè)概念并沒(méi)有實(shí)質(zhì)性的沖突,在面向?qū)ο笙到y(tǒng)中,封裝性主要指的是對(duì)象的封裝性,即將屬于某一類的一個(gè)具體的對(duì)
58、象封裝起來(lái),使其數(shù)據(jù)和操作成為一個(gè)整體。在引入了繼承機(jī)制的面向?qū)ο笙到y(tǒng)中,對(duì)象依然是封裝得很好的實(shí)體,其他對(duì)象與它進(jìn)行通信的途徑仍然只有一條,那就是發(fā)送消息。類機(jī)制是一種靜態(tài)機(jī)制,不管是基類還是派生類,對(duì)于對(duì)象來(lái)說(shuō),它仍然是一個(gè)類的實(shí)例,既可能是基類的實(shí)例,也可能是派生類的實(shí)例。因此,繼承機(jī)制的引入絲毫沒(méi)有影響對(duì)象的封裝性。,從另一個(gè)角度來(lái)看,繼承和封裝機(jī)制還具有一定的相似性,它們都是一種共享代碼的手段。繼承是一種靜態(tài)共享代碼的手段,通過(guò)派生類對(duì)象的創(chuàng)建,可以接受某一消息,啟動(dòng)其基類所定義的代碼段,從而使基類和派生類共享這一段代碼。封裝機(jī)制所提供的是一種動(dòng)態(tài)共享代碼的手段,通過(guò)封裝,我們可將一段代碼定義在一個(gè)類中,在另一個(gè)類所定義的操作中,我們可以通過(guò)創(chuàng)建該類的實(shí)例,并向它發(fā)送消息而啟動(dòng)這一段代碼,同樣也達(dá)到共享的目的。,5.5 抽象類、接口與包抽象類體現(xiàn)數(shù)據(jù)抽象的思想,是實(shí)現(xiàn)程序多態(tài)性的一種手段。接口則是Java中實(shí)現(xiàn)多重繼承的唯一途徑。包是一個(gè)更大的程序單位,主要實(shí)現(xiàn)軟件復(fù)用。5.5.1 抽象類假設(shè)我們要編寫一個(gè)計(jì)算矩形、三角形和圓的面積與周長(zhǎng)的程序,若按前面所學(xué)的方式編程,我們必須定義四個(gè)類,即圓類、三
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 法律盡職調(diào)查員考試試卷及答案
- 巢湖市營(yíng)養(yǎng)學(xué)會(huì)征求意見表
- 2025年腈綸扁平絲項(xiàng)目建議書
- 2025年樹脂型密封膠項(xiàng)目建議書
- Unit 3 My weekend plan(第6課時(shí))Part B Lets check 教案人教pep英語(yǔ)六年級(jí)上冊(cè)
- 2025年江西省高校畢業(yè)生“三支一扶”計(jì)劃招募考試試題【答案】
- 2025年曲阜市社區(qū)工作者招聘考試筆試試題【答案】
- 2025年非調(diào)質(zhì)鋼項(xiàng)目合作計(jì)劃書
- 消防員安全培訓(xùn)心得體會(huì)(3篇)
- 湘藝版音樂(lè)六年級(jí)上冊(cè)《搖太陽(yáng)》教案1
- 學(xué)堂在線 心理學(xué)與生活 章節(jié)測(cè)試答案
- 鐵路鄰近營(yíng)業(yè)線施工安全管理
- 傳承紅色基因鑄就黨紀(jì)之魂建黨104周年七一黨課
- 護(hù)理警示教育培訓(xùn)課件
- 2025年低壓電工證考試試題及答案
- 2025至2030中國(guó)風(fēng)電設(shè)備及零部件行業(yè)發(fā)展趨勢(shì)分析與未來(lái)投資戰(zhàn)略咨詢研究報(bào)告
- 2025年鐵路駕駛員規(guī)范知識(shí)測(cè)試題集錦
- 實(shí)踐制作“龍骨水車”模型課件-滬科版八年級(jí)全一冊(cè)物理
- 供應(yīng)鏈計(jì)劃員考試題庫(kù)
- 兒童舞蹈課件模板
- 2025-2030中國(guó)智能瓶子回收機(jī)行業(yè)前景預(yù)判及供需平衡分析報(bào)告
評(píng)論
0/150
提交評(píng)論