繼承與多態(tài)性-JAVA程序設(shè)計(jì)課件_第1頁
繼承與多態(tài)性-JAVA程序設(shè)計(jì)課件_第2頁
繼承與多態(tài)性-JAVA程序設(shè)計(jì)課件_第3頁
繼承與多態(tài)性-JAVA程序設(shè)計(jì)課件_第4頁
繼承與多態(tài)性-JAVA程序設(shè)計(jì)課件_第5頁
已閱讀5頁,還剩135頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第4章繼承與多態(tài)性第4章繼承與多態(tài)性14.1繼承的基本概念顧名思義,繼承就是子將父的東西承接過來。圖4-1動物類別之間的繼承【提示】繼承需要符合IS-A(是一種)關(guān)系,也就是子類是父類的一種,如老虎是食肉動物的一種。4.1繼承的基本概念顧名思義,繼承就是子將父的東西承接過2Java繼承的特點(diǎn)1)繼承關(guān)系是傳遞的。若類C繼承類B,類B繼承類A,則類C既有從類B那里繼承下來的屬性與方法,也有從類A那里繼承下來的屬性與方法,還可以有自己新定義的屬性和方法。2)繼承簡化了人們對事物的認(rèn)識和描述,能清晰體現(xiàn)相關(guān)類間的層次結(jié)構(gòu)關(guān)系。3)繼承提供了軟件復(fù)用功能。若類B繼承類A,那么建立類B時(shí)只需要再描述與基類(類A)不同的少量特征(數(shù)據(jù)成員和成員方法)即可。這種做法能減小代碼和數(shù)據(jù)的冗余度,大大增加程序的重用性。4)繼承通過增強(qiáng)一致性來減少模塊間的接口和界面,大大增加了程序的易維護(hù)性。Java繼承的特點(diǎn)1)繼承關(guān)系是傳遞的。若類C繼承類B,類34.2Java繼承的實(shí)現(xiàn)4.2.1繼承的語法在Java中使用extends關(guān)鍵字實(shí)現(xiàn)繼承關(guān)系,格式如下:[訪問控制方式]class<子類名>extends<父類名>{......//成員定義 }4.2Java繼承的實(shí)現(xiàn)4.2.1繼承的語法44.2.1繼承的語法【實(shí)例4-1】繼承的使用classPerson{

privateStringname;//姓名

private

intage;//年齡

publicStringgetName(){

returnname; }

public

voidsetName(Stringname){

=name; }

public

intgetAge(){

returnage; }

public

voidsetAge(intage){

this.age=age; } }classStudentextendsPerson{

privateStringschool;//學(xué)校

private

intgrade;//年級

publicStringgetSchool(){

returnschool; }

public

voidsetSchool(Stringschool){

this.school=school; }

public

intgetGrade(){

returngrade; }

public

voidsetGrade(intgrade){

this.grade=grade; }}4.2.1繼承的語法【實(shí)例4-1】繼承的使用classS54.2.1繼承的語法public

classInheritDemo{

public

static

voidmain(String[]args){ Studentstu=newStudent();//新建學(xué)生對象 stu.setName("張三");//訪問從父類繼承的方法 stu.setAge(20);//訪問從父類繼承的方法 stu.setSchool("哈佛大學(xué)");//訪問本類定義的方法 stu.setGrade(2);//訪問本類定義的方法 System.out.println("姓名:"+stu.getName()+",年齡:"+stu.getAge()+"學(xué)校:"+stu.getSchool()+",年級:"+stu.getGrade()); }}4.2.1繼承的語法publicclassInheri64.2.1繼承的語法4.2.1繼承的語法74.2.2protected訪問控制方式父類和子類是一般類和特殊類關(guān)系,子類是需要擴(kuò)展父類的功能的,在擴(kuò)展父類的功能時(shí),可能會需要使用到從父類繼承的私有成員,但父類的私有成員,在子類中不能直接訪問。為此,Java提供了protected訪問控制方式來解決這個(gè)問題。protected訪問控制方式介于private和public之間,用protected修飾的類里的成員,向所有子類和同一個(gè)包的其它類開放其訪問權(quán)限。

4.2.2protected訪問控制方式父類和子類是一般84.2.3super關(guān)鍵字與子類對象實(shí)例化過程子類對象實(shí)例中這些繼承下來的非靜態(tài)數(shù)據(jù)成員所占用的內(nèi)存區(qū)域?yàn)樽宇悓ο髮?shí)例中的父類子對象。注意父類子對象本身相當(dāng)于一個(gè)父類對象實(shí)例。Java語言的每一個(gè)對象實(shí)例也有一個(gè)特殊的私有數(shù)據(jù)成員,稱為super,用來引用該父類子對象。super也是一個(gè)引用變量,其類型則是它所屬的對象實(shí)例的父類類型。4.2.3super關(guān)鍵字與子類對象實(shí)例化過程子類對象實(shí)94.2.3super關(guān)鍵字與子類對象實(shí)例化過程【實(shí)例4-2】子類對象實(shí)例化classPerson{

publicPerson(){ System.out.println("我是Person類的構(gòu)造方法"); }}classStudentextendsPerson{

publicStudent(){ System.out.println("我是Student類的構(gòu)造方法"); }}public

classSuperDemo1{

public

static

voidmain(String[]args){ Studentstu=newStudent();//新建學(xué)生對象 }}圖4-5運(yùn)行結(jié)果4.2.3super關(guān)鍵字與子類對象實(shí)例化過程【實(shí)例4-2104.2.3super關(guān)鍵字與子類對象實(shí)例化過程【實(shí)例4-3】super關(guān)鍵字classPerson{

privateStringname;//姓名

private

intage;//年齡

publicPerson(Stringname,intage){

=name;

this.age=age; }

publicStringgetName(){

returnname; }

public

intgetAge(){

returnage; }}4.2.3super關(guān)鍵字與子類對象實(shí)例化過程【實(shí)例4-3114.2.3super關(guān)鍵字與子類對象實(shí)例化過程classStudentextendsPerson{

privateStringschool;//學(xué)校

private

intgrade;//年級

publicStudent(Stringname,intage,Stringschool,intgrade){

super(name,age);//調(diào)用父類構(gòu)造方法,初始化從父類繼承的對象屬性

this.school=school;

this.grade=grade; }

publicStringgetSchool(){

returnschool; }

public

intgetGrade(){

returngrade; }}4.2.3super關(guān)鍵字與子類對象實(shí)例化過程class124.2.3super關(guān)鍵字與子類對象實(shí)例化過程public

classSuperDemo2{

public

static

voidmain(String[]args){ Studentstu=newStudent("張三",20,"哈佛大學(xué)",2);//新建學(xué)生對象 System.out.println("姓名:"+stu.getName()+",年齡:"+stu.getAge()+"學(xué)校:“+stu.getSchool()+",年級:"+stu.getGrade()); }}4.2.3super關(guān)鍵字與子類對象實(shí)例化過程public134.2.4方法重寫(Override)方法重寫也稱為方法覆蓋或方法重定義

classVehicle{

public

voidrun(){ System.out.println("交通工具在跑!"); }}classTruckextendsVehicle{ @Override//表示方法重寫的Java注解

public

voidrun(){ System.out.println("貨車在地上跑!"); }}classAirplaneextendsVehicle{ @Override//表示方法重寫的Java注解

public

voidrun(){ System.out.println("飛機(jī)在天上飛!"); }}4.2.4方法重寫(Override)方法重寫也稱為方法144.2.5final關(guān)鍵字final在Java中表示最終的意思,使用final可以聲明類、屬性和方法:1)使用final可以聲明常量,常量不能修改,定義時(shí)要賦初值;例如:final

intNUM=0;2)使用final聲明的方法不能被子類重寫;3)使用final聲明的類不能有子類。4.2.5final關(guān)鍵字final在Java中表示最終154.3繼承與子類型類A繼承類B,則類型A是類型B的子類型。Java語言允許祖先類類型的引用變量指向后代類類型的對象。例如,類GraduateStudent是類Student的子類,下述語句是合法的:Students=newGraduateStudent();類似的如果一個(gè)方法的形參是超類類型,那么方法調(diào)用時(shí)可以傳給它一個(gè)子類對象作為實(shí)參,例如對于一個(gè)方法voidf(Studentd);可以這樣來調(diào)用它:GraduateStudents=newGraduateStudent();f(s);//子類對象作為實(shí)參4.3繼承與子類型類A繼承類B,則類型A是類型B的子類型164.4抽象類與多態(tài)性4.4.1抽象類的引入抽象類往往用來表征我們在對問題領(lǐng)域進(jìn)行分析、設(shè)計(jì)中得出的抽象概念,是對一系列看上去不同,但是本質(zhì)上相同的具體概念的抽象。4.4抽象類與多態(tài)性4.4.1抽象類的引入174.4.2抽象方法在抽象類中創(chuàng)建的沒有具體實(shí)現(xiàn)的,必須要子類重寫的方法稱為抽象方法。抽象方法用關(guān)鍵字abstract進(jìn)行修飾,這種方法只聲明返回的數(shù)據(jù)類型、方法名稱和所需的參數(shù),沒有方法體,也就是說抽象方法只需要聲明而不需要實(shí)現(xiàn)。聲明一個(gè)抽象方法的基本格式如下:abstract<方法返回值類型><方法名>(參數(shù)列表);例如: abstract

voidf();4.4.2抽象方法在抽象類中創(chuàng)建的沒有具體實(shí)現(xiàn)的,必須要184.4.3抽象類的定義【實(shí)例4-4】如何定義抽象類及抽象方法示例abstract

classFruit{//定義抽象類

publicStringcolor;//定義顏色成員變量

publicFruit(){//定義構(gòu)造方法 color="綠色";//對變量color進(jìn)行初始化 }

public

abstract

voidharvest();//定義抽象方法}classAppleextendsFruit{

public

voidharvest(){ System.out.println("蘋果已經(jīng)收獲!"); }}4.4.3抽象類的定義【實(shí)例4-4】如何定義抽象類及抽象194.4.3抽象類的定義classOrangeextendsFruit{

public

voidharvest(){ System.out.println("桔子已經(jīng)收獲!"); }}public

classAbstractClassDemo{

public

static

voidmain(String[]args){ Fruitf1=newApple();//父類引用指向子類對象 f1.harvest();//通過父類引用調(diào)用子類對象的重寫方法 f1=newOrange(); f1.harvest(); }}4.4.3抽象類的定義classOrangeexten204.4.4多態(tài)性(Polymorphism)“Polymorphism(多態(tài))”一詞來自希臘語,意為“多種形式”。指的是一個(gè)程序中同名的不同方法共存的情況。多態(tài)有編譯時(shí)(靜態(tài))多態(tài)和運(yùn)行時(shí)(動態(tài))多態(tài)。編譯時(shí)多態(tài)是通過方法重載實(shí)現(xiàn)的;運(yùn)行時(shí)多態(tài)是通過方法覆蓋實(shí)現(xiàn)(子類覆蓋父類方法)的。4.4.4多態(tài)性(Polymorphism)“Polym214.4.4多態(tài)性(Polymorphism)【實(shí)例4-5】一個(gè)經(jīng)典的抽象圖形類和它的具體子類的例子程序4-5ShapeDemo.javaimportjava.util.*;abstract

classShape{//Shape類是幾個(gè)具體圖形類的抽象父類

public

abstract

voiddraw();//定義抽象方法}classRectangleextendsShape{//Rectangle類是Shape類的一個(gè)具體子類@Override//表示方法重寫的Java注解

public

voiddraw(){System.out.println("畫矩形");}}4.4.4多態(tài)性(Polymorphism)【實(shí)例4-5】224.4.4多態(tài)性(Polymorphism)classCircleextendsShape{//Circle類也是Shape類的一個(gè)具體子類@Override

public

voiddraw(){System.out.println("畫圓");}}classTriangleextendsShape{//Triangle類是Shape類的一個(gè)具體子類@Override

public

voiddraw(){System.out.println("畫三角形");}}4.4.4多態(tài)性(Polymorphism)classC234.4.4多態(tài)性(Polymorphism)//ShapeDemo類中隨機(jī)生成矩形、圓、三角形,然后用Shape類型的引用調(diào)用public

classShapeDemo{Randomrand=newRandom();//創(chuàng)建一個(gè)隨機(jī)數(shù)類,具體使用可參看Java幫助文檔

publicShapecreateShape(){

intc=rand.nextInt(3);//產(chǎn)生0-2之間的隨機(jī)整數(shù)Shapes=null;

switch(c){//根據(jù)產(chǎn)生的隨機(jī)整數(shù)創(chuàng)建對象

case0:s=newRectangle();

break;

case1:s=newCircle();

break;

case2:s=newTriangle();

break;}

returns;}4.4.4多態(tài)性(Polymorphism)//Shape244.4.4多態(tài)性(Polymorphism)

public

static

voidmain(String[]args){ShapeDemodemo=newShapeDemo();Shape[]shapes=newShape[5];//定義5個(gè)Shape類的引用

for(inti=0;i<shapes.length;i++){ //使5個(gè)Shape類的引用指向隨機(jī)生成的子類對象shapes[i]=demo.createShape();}

for(inti=0;i<shapes.length;i++){shapes[i].draw();//同樣的消息,不同的響應(yīng)}}}4.4.4多態(tài)性(Polymorphism)public254.5繼承的使用要點(diǎn)1、抽象類是用來繼承的,具體類不是用來繼承的。

2、抽象類應(yīng)當(dāng)擁有盡可能多的共同代碼。3、抽象類應(yīng)當(dāng)擁有盡可能少的數(shù)據(jù)。

4.5繼承的使用要點(diǎn)1、抽象類是用來繼承的,具體類不是用264.5繼承的使用要點(diǎn)4.5繼承的使用要點(diǎn)274.5繼承的使用要點(diǎn)4、使用繼承的條件。當(dāng)以下的條件全部被滿足時(shí),才應(yīng)當(dāng)使用繼承關(guān)系:(1)繼承代表“一般/特殊”關(guān)系,其中超類代表一般,而子類代表特殊,子類是超類的一個(gè)特殊種類,而不是超類的一個(gè)角色,也就是要區(qū)分“Has-A”與“Is-A”兩種關(guān)系的不同。Has-A關(guān)系應(yīng)當(dāng)使用聚合描述,而只有Is-A關(guān)系才符合繼承關(guān)系。(2)子類具有擴(kuò)展超類的責(zé)任,而不是具有注銷掉(Nullify)超類特性的責(zé)任。(3)只有從分類學(xué)角度上有意義時(shí),才可以使用繼承,不要從工具類繼承。4.5繼承的使用要點(diǎn)4、使用繼承的條件。284.5繼承的使用要點(diǎn)4.5繼承的使用要點(diǎn)294.6instanceof運(yùn)算符例如,Manager和Contractor都是抽象類Employee的子類publicvoidmethod(Employeee){if(einstanceofManager){…//dosomethingasaManager}elseif(einstanceofContractor){…//dosomethingasaContractor}}然而,這種做法通常被認(rèn)為是沒有好好利用面向?qū)ο笾械亩鄳B(tài)性,這樣的設(shè)計(jì)實(shí)際很糟糕,代碼難以維護(hù)。4.6instanceof運(yùn)算符例如,Manager和C304.7Object類4.7.1基本作用Object類是Java類層中的最高層類,是所有類的超類。所有的類構(gòu)成了一棵以O(shè)bject類為頂點(diǎn)的繼承樹。結(jié)果是所有的類都繼承了Object類聲明的接口和方法,這一特性在程序設(shè)計(jì)中有舉足輕重的作用,可以使用這種“通用”對象類型進(jìn)行“通用”程序設(shè)計(jì),所以在很多類庫設(shè)計(jì)上都采用Object類型作為方法的參數(shù)類型。4.7Object類4.7.1基本作用314.7Object類4.7.2主要方法1、equals()方法用于測試某個(gè)對象是否同另一個(gè)對象相等。它在Object類中的實(shí)現(xiàn)是判斷兩個(gè)對象是否指向同一塊內(nèi)存區(qū)域(直接用“==”進(jìn)行比較)。2、toString()方法返回該對象的字符串表示。3、finalize()方法當(dāng)垃圾回收器將要釋放無用對象的內(nèi)存時(shí),先調(diào)用該對象的finalize方法。4.7Object類4.7.2主要方法324.8基本類型的包裝類序號基本數(shù)據(jù)類型包裝類1byteByte2booleanBoolean3shortShort4charCharacter5intInteger6longLong7floatFloat8doubleDouble4.8基本類型的包裝類序號基本數(shù)據(jù)類型包裝類1byteB334.8基本類型的包裝類對于包裝類說,這些類的用途主要包含兩種:作為和基本數(shù)據(jù)類型對應(yīng)的類類型存在,方便涉及到對象的操作。包含每種基本數(shù)據(jù)類型的相關(guān)屬性如最大值、最小值等,以及相關(guān)的操作方法。通過包裝類可以獲取本類型的最大和最小值,例如,下面語句會打印出整型的最大和最小值:System.out.println(Integer.MAX_VALUE);

//2147483647

System.out.println(Integer.MIN_VALUE);

//-2147483648【注意】數(shù)值類型的包裝類中都有

MAX_VALUE

MIN_VALUE

兩個(gè)靜態(tài)常量,代表此類型的基本類型的最大值和最小值。4.8基本類型的包裝類對于包裝類說,這些類的用途主要包含兩344.8基本類型的包裝類

int和Integer與String的轉(zhuǎn)換兩個(gè)常用的方法:parseInt和valueOf,它們都是靜態(tài)方法。int

i=Integer.parseInt("123");

//把String轉(zhuǎn)換為intStrings1=Integer.toString(i);//把int轉(zhuǎn)換為StringIntegerb=Integer.valueOf("123");

//把String轉(zhuǎn)換為IntegerStrings2=b.toString();//把Integer轉(zhuǎn)換為String4.8基本類型的包裝類

int和Integer與Strin354.9Java接口4.9.1Java接口的概念Java接口類似于純抽象類,只包含常量和抽象方法,而沒有變量和具體方法。Java接口從更深層次的理解,是定義(規(guī)范,約束)與實(shí)現(xiàn)的分離。

Java接口本身沒有任何實(shí)現(xiàn),所以,Java接口比Java抽象類更抽象化。Java接口的方法只能是抽象的和公開的,Java接口不能有構(gòu)造方法,Java接口可以有public的、靜態(tài)的final屬性。4.9Java接口4.9.1Java接口的概念364.9.2Java接口的定義例如,下面定義一個(gè)Collection(集合)接口:interfaceCollection{ intMAX_NUM=100;//定義的常量,缺省是public、final和static的

//以下是聲明的方法,缺省是public和abstract的 voidadd(Objectobj); voiddelete(Objectobj); Objectfind(Objectobj); intcurrentCount();}4.9.2Java接口的定義例如,下面定義一個(gè)Collec374.9.3Java接口的實(shí)現(xiàn)classFIFOQueueimplementsCollection{voidadd(Objectobj){......}//具體實(shí)現(xiàn)略,以下同voiddelete(Objectobj){......}Objectfind(Objectobj){......}intcurrentCount{......}}4.9.3Java接口的實(shí)現(xiàn)384.9.4Java接口類型的使用classInterfaceType{publicstaticvoidmain(Stringargs[]){Collectionc=newFIFOQueue();......c.add(obj);//通過接口引用調(diào)用對象中的接口實(shí)現(xiàn)方法......}}4.9.4Java接口類型的使用classInterfa394.9.5Java接口與多態(tài)性【實(shí)例4-6】一個(gè)利用接口實(shí)現(xiàn)運(yùn)行時(shí)多態(tài)性的例子interfaceDoor{

public

voidopen();//抽象開門方法

public

voidclose();//抽象關(guān)門方法}classHouseimplementsDoor{//房子類實(shí)現(xiàn)了Door接口

public

voidopen(){ System.out.println("打開了房子的門"); }

public

voidclose(){ System.out.println("關(guān)閉了房子的門"); } }4.9.5Java接口與多態(tài)性【實(shí)例4-6】一個(gè)利用接口實(shí)404.9.5Java接口與多態(tài)性classCarimplementsDoor{//汽車類實(shí)現(xiàn)了Door接口

public

voidopen(){ System.out.println("打開了汽車的門"); }

public

voidclose(){ System.out.println("關(guān)閉了汽車的門"); } } 4.9.5Java接口與多態(tài)性classCarimpl414.9.5Java接口與多態(tài)性public

classInterfacePolymorphismDemo{

public

static

voidmain(String[]args){Doordoor=null;door=newHouse();//接口引用指向房子對象door.open();//通過接口引用調(diào)用接口中的方法door.close();//通過接口引用調(diào)用接口中的方法door=newCar();//接口引用指向汽車對象door.open();//通過接口引用調(diào)用接口中的方法door.close();//通過接口引用調(diào)用接口中的方法}}4.9.5Java接口與多態(tài)性publicclassI424.9.6Java接口的深入理解1、接口是對可插人性的保證

1)關(guān)聯(lián)的可插入性例如:不要使用下面的聲明語句:Vectoremployees=newVector();//Vector是Java的一個(gè)類而應(yīng)該使用下面的聲明語句:Listemployees=newVector();//List是Java的一個(gè)接口

這樣作的好處是,在決定將Vector換成ArrayList(Vector類和ArrayList類都是Java類庫中的集合類)時(shí),程序中需要改動得語句很少,只需用下面語句替換前面的語句:Listemployees=newArrayList();//ArrayList類也實(shí)現(xiàn)了List接口4.9.6Java接口的深入理解1、接口是對可插人性的保434.9.6Java接口的深入理解2)調(diào)用的可插入性publicclassExample{ListmyList;//定義接口類型的引用屬性publicExample(ListaList){myList=aList;//通過構(gòu)造方法參數(shù)給myList屬性賦值}publicintgetSize(){returnmyList.size()//通過接口引用調(diào)用對象的方法}publicstaticvoidmain(Stringargs[]){Vectorv=newVector();Exampleem=newExample(v);System.out.println(em.getSize());//會調(diào)用Vector對象的size()方法ArrayLista=newArrayList();em=newExample(a);System.out.println(em.getSize());//會調(diào)用ArrayList對象的size()方法}}4.9.6Java接口的深入理解2)調(diào)用的可插入性444.9.6Java接口的深入理解2.Java接口是針對抽象編程的保證針對抽象編程,不要針對具體編程。在程序中應(yīng)當(dāng)主要使用Java接口和抽象類將內(nèi)部和外部耦合起來。換言之,應(yīng)當(dāng)使用Java接口和抽象類而不是具體類進(jìn)行變量的類型聲明、參量的類型聲明、方法的返回類型聲明以及數(shù)據(jù)類型的轉(zhuǎn)換等。當(dāng)然,更好的做法是僅僅使用Java接口,而不使用抽象類來做到上面這些。在理想的情況下,一個(gè)具體Java類應(yīng)當(dāng)只實(shí)現(xiàn)Java接口和抽象類中聲明過的方法,而不應(yīng)當(dāng)給出多余的方法(思考為什么?)。4.9.6Java接口的深入理解2.Java接口是針對抽454.10注解(Annotation)4.10.1Annotation簡介簡單的說,注解相當(dāng)于一種標(biāo)記,在程序中加了注解就等于為程序打上了某種標(biāo)記,之后,Java編譯器、開發(fā)工具和其他程序可以用反射來了解程序中的類及各種元素上有無何種標(biāo)記,看有什么標(biāo)記,就去干相應(yīng)的事。4.10注解(Annotation)4.10.1An464.10.2Java提供的幾個(gè)基本注解(1)@Override能實(shí)現(xiàn)編譯時(shí)檢查,可以為子類的重寫方法添加該注釋,以聲明該方法是用于覆蓋父類中的方法。如果該方法不是覆蓋父類的方法,將會在編譯時(shí)報(bào)錯。例如,為某類重寫toString()方法卻寫成了tostring(),如果為該方法添加了@Override注釋,將會在編譯時(shí)報(bào)錯。(2)@SuppressWarnings該注解的作用是阻止編譯器發(fā)出某些警告信息。常見參數(shù):deprecation:過時(shí)的類或方法警告。unchecked:執(zhí)行了未檢查的轉(zhuǎn)換時(shí)警告。(3)@Deprecated該注解的作用是標(biāo)記某個(gè)過時(shí)的類或方法。當(dāng)編程人員使用這些方法時(shí),將會在編譯時(shí)顯示提示信息。4.10.2Java提供的幾個(gè)基本注解(1)@Ov474.11應(yīng)用實(shí)例4.11.1Java接口的實(shí)際應(yīng)用——簡單工廠設(shè)計(jì)模式

一、簡單工廠模式概述

簡單工廠模式是類的創(chuàng)建模式,又叫做靜態(tài)工廠方法(StaticFactoryMethod)模式。簡單工廠模式是由一個(gè)工廠對象決定創(chuàng)建出那一種產(chǎn)品類的實(shí)例。

4.11應(yīng)用實(shí)例4.11.1Java接口的實(shí)際應(yīng)用——484.11.1Java接口的實(shí)際應(yīng)用——簡單工廠設(shè)計(jì)模式二、模式意圖簡單工廠模式的主要意圖是隱藏對象創(chuàng)建這一任務(wù)的復(fù)雜性。客戶通常不指定要創(chuàng)建的具體類,而是面向接口或抽象類進(jìn)行編碼,讓工廠類負(fù)責(zé)創(chuàng)建具體的對象。通常工廠類有一個(gè)返回抽象類或接口類型對象的靜態(tài)方法,客戶通常(并非總是)會提供某種信息,然后工廠類根據(jù)提供的信息來創(chuàng)建并返回一個(gè)類的對象。將創(chuàng)建對象的責(zé)任提取出來的好處是允許客戶代碼不依賴于具體類,遵循依賴倒轉(zhuǎn)原則:“針對抽象編程,不要針對具體編程”。另一個(gè)好處是把創(chuàng)建對象的代碼集中起來,如果需要修改生成的對象,可以很容易找到并修改,而不需要修改客戶代碼。4.11.1Java接口的實(shí)際應(yīng)用——簡單工廠設(shè)計(jì)模式二、494.11.1Java接口的實(shí)際應(yīng)用——簡單工廠設(shè)計(jì)模式三、模式結(jié)構(gòu)與參與者該模式中包含的角色及其職責(zé):1、工廠(Factory)角色簡單工廠模式的核心,它負(fù)責(zé)實(shí)現(xiàn)創(chuàng)建所有實(shí)例的內(nèi)部邏輯。工廠類可以被外界直接調(diào)用,創(chuàng)建所需的產(chǎn)品對象。2、抽象產(chǎn)品(IProduct)角色簡單工廠模式所創(chuàng)建的所有對象的父類或?qū)崿F(xiàn)的接口,它負(fù)責(zé)描述所有實(shí)例所共有的公共接口。3、具體產(chǎn)品(ConcreteProduct)角色

是簡單工廠模式的創(chuàng)建目標(biāo),所有創(chuàng)建的對象都是充當(dāng)這個(gè)角色的某個(gè)具體類的實(shí)例。4.11.1Java接口的實(shí)際應(yīng)用——簡單工廠設(shè)計(jì)模式三、504.11.1Java接口的實(shí)際應(yīng)用——簡單工廠設(shè)計(jì)模式4.11.1Java接口的實(shí)際應(yīng)用——簡單工廠設(shè)計(jì)模式514.11.1Java接口的實(shí)際應(yīng)用——簡單工廠設(shè)計(jì)模式四、實(shí)例——電子商務(wù)網(wǎng)站貨運(yùn)公司的選擇對于一個(gè)電子商務(wù)網(wǎng)站,假設(shè)是根據(jù)訂單貨物重量的大小來確定使用哪一家貨運(yùn)公司,在這里可以采用簡單工廠模式來創(chuàng)建相應(yīng)的貨運(yùn)公司對象。4.11.1Java接口的實(shí)際應(yīng)用——簡單工廠設(shè)計(jì)模式四、524.11.1Java接口的實(shí)際應(yīng)用——簡單工廠設(shè)計(jì)模式classOrder{//訂單類

private

doubleweight;//訂單貨物重量

publicOrder(doubleweight){

super();

this.weight=weight; }

public

doublegetWeight(){

returnweight; } //為了簡單,其它成員省略}//貨運(yùn)公司接口interfaceIShippingCourier{

voidtransport();//運(yùn)輸方法}4.11.1Java接口的實(shí)際應(yīng)用——簡單工廠設(shè)計(jì)模式cl534.11.1Java接口的實(shí)際應(yīng)用——簡單工廠設(shè)計(jì)模式classCompanyAimplementsIShippingCourier{//具體貨運(yùn)公司 @Override

public

voidtransport(){ System.out.println("由CompanyA公司運(yùn)送");//簡單示意性代碼 } }classCompanyBimplementsIShippingCourier{//具體貨運(yùn)公司 @Override

public

voidtransport(){ System.out.println("由CompanyB公司運(yùn)送");//簡單示意性代碼 } }4.11.1Java接口的實(shí)際應(yīng)用——簡單工廠設(shè)計(jì)模式cl544.11.1Java接口的實(shí)際應(yīng)用——簡單工廠設(shè)計(jì)模式//創(chuàng)建具體貨運(yùn)公司類對象的工廠類classShippingCourierFactory{ //根據(jù)貨物重量創(chuàng)建相應(yīng)的貨運(yùn)公司類對象的靜態(tài)方法

public

staticIShippingCouriercreatShippingCourier(Orderorder){

if(order.getWeight()>100){

return

newCompanyA(); }else

return

newCompanyB(); }}4.11.1Java接口的實(shí)際應(yīng)用——簡單工廠設(shè)計(jì)模式//554.11.1Java接口的實(shí)際應(yīng)用——簡單工廠設(shè)計(jì)模式classOrderService{//退貨處理服務(wù)類

public

voiddispatch(Orderorder){//處理退貨單的方法 //調(diào)用工廠類的靜態(tài)方法創(chuàng)建退貨處理類對象 IShippingCouriershippingCourier= ShippingCourierFactory.creatShippingCourier(order); shippingCourier.transport(); } }4.11.1Java接口的實(shí)際應(yīng)用——簡單工廠設(shè)計(jì)模式cl564.11.1Java接口的實(shí)際應(yīng)用——簡單工廠設(shè)計(jì)模式public

classSimpleFactoryPatternDemo{//應(yīng)用程序主類

public

static

voidmain(String[]args){ OrderServiceorderService=newOrderService(); Orderorder1=newOrder(90); orderService.dispatch(order1); Orderorder2=newOrder(110); orderService.dispatch(order2);}}4.11.1Java接口的實(shí)際應(yīng)用——簡單工廠設(shè)計(jì)模式pu574.11.2抽象類的實(shí)際應(yīng)用——模版方法設(shè)計(jì)模式一、模版方法模式概述模板方法(TemplateMethod)模式是一種非常簡單而又經(jīng)常使用的設(shè)計(jì)模式,先創(chuàng)建一個(gè)父類,把其中的一個(gè)或多個(gè)方法留給子類去實(shí)現(xiàn),這實(shí)際上就是在使用模板模式。所謂的模板模式可以這樣來理解:在一個(gè)類中定義一個(gè)算法,但將此算法的某些細(xì)節(jié)留到子類中去實(shí)現(xiàn)。更近一步可以這樣來理解:準(zhǔn)備一個(gè)抽象類,將部分邏輯以具體方法的形式實(shí)現(xiàn),然后聲明一些抽象方法來迫使子類實(shí)現(xiàn)剩余的邏輯。不同的子類以不同的方法實(shí)現(xiàn)這些抽象方法,從而對剩余的邏輯有不同的實(shí)現(xiàn)。4.11.2抽象類的實(shí)際應(yīng)用——模版方法設(shè)計(jì)模式一、模版方58二、模式意圖將一個(gè)類的基本部分抽取出來放到一個(gè)基類中,這樣它就不必重復(fù)出現(xiàn)在幾個(gè)派生類里。三、模式結(jié)構(gòu)與參與者

抽象模板角色:

1、定義了一個(gè)或多個(gè)抽象操作,以便讓子類實(shí)現(xiàn)。

2、定義并實(shí)現(xiàn)了一個(gè)模板方法(指抽象模板類里調(diào)用抽象方法和具體方法的方法)。

具體模板角色:

1、實(shí)現(xiàn)父類所定義的一個(gè)或多個(gè)抽象方法。

2、每一個(gè)抽象模板角色都可以有任意多個(gè)具體模板角色與之對應(yīng)。

3、每一個(gè)具體模板角色都可以給出這些抽象方法的不同實(shí)現(xiàn)。4.11.2抽象類的實(shí)際應(yīng)用——模版方法設(shè)計(jì)模式二、模式意圖4.11.2抽象類的實(shí)際應(yīng)用——模版方法設(shè)計(jì)模式594.11.2抽象類的實(shí)際應(yīng)用——模版方法設(shè)計(jì)模式4.11.2抽象類的實(shí)際應(yīng)用——模版方法設(shè)計(jì)模式604.11.2抽象類的實(shí)際應(yīng)用——模版方法設(shè)計(jì)模式四、實(shí)例——電子商務(wù)網(wǎng)站的退貨處理系統(tǒng)

退貨單目前有兩種:無條件退貨單和有缺陷退貨單。無條件退貨允許客戶退還商品并接收全額退款,但需要減去最初郵寄和包裝的費(fèi)用,然后將商品添加到庫存中。如果客戶收到一件有缺陷的商品并希望退貨,就形成了有問題的退貨,該退款包括最初支付的郵寄和包裝的費(fèi)用,退貨后將商品返廠。4.11.2抽象類的實(shí)際應(yīng)用——模版方法設(shè)計(jì)模式四、實(shí)例——614.11.2抽象類的實(shí)際應(yīng)用——模版方法設(shè)計(jì)模式處理退貨分為兩步,一個(gè)是計(jì)算退款數(shù)量,另一個(gè)是退貨后處理,這對于兩類退貨是一樣的,但對于兩類退貨每步具體處理是不一樣的。這時(shí),我們可以使用模板方法模式定義一個(gè)抽象退貨處理類,在其中定義兩個(gè)抽象方法完成兩步處理,再定義一個(gè)具體的退貨處理方法調(diào)用這兩個(gè)抽象方法(具體實(shí)現(xiàn)留給子類去實(shí)現(xiàn))來完成退貨處理。定義兩個(gè)具體退貨處理子類,給出父類兩個(gè)抽象方法的具體實(shí)現(xiàn)。實(shí)際使用時(shí),根據(jù)退貨單類型創(chuàng)建具體子類對象,調(diào)用從父類繼承的退貨處理方法來完成退貨處理。4.11.2抽象類的實(shí)際應(yīng)用——模版方法設(shè)計(jì)模式處理退貨分為624.11.2抽象類的實(shí)際應(yīng)用——模版方法設(shè)計(jì)模式4.11.2抽象類的實(shí)際應(yīng)用——模版方法設(shè)計(jì)模式634.11.2抽象類的實(shí)際應(yīng)用——模版方法設(shè)計(jì)模式enumReturnType{//退貨單類型

FaultReturn,//表示有缺陷退貨類型

NoQuibblesReturn//表示無條件退貨類型}classReturnOrder{//退貨單類//退貨單類型,為了簡單,定義成公有成員

publicReturnTypereturnType; //為了簡單,其它成員省略}4.11.2抽象類的實(shí)際應(yīng)用——模版方法設(shè)計(jì)模式enumR644.11.2抽象類的實(shí)際應(yīng)用——模版方法設(shè)計(jì)模式abstract

classReturnProcessTemplate{//抽象退貨處理類 //下面兩個(gè)是抽象方法,留給子類實(shí)現(xiàn)

protected

abstract

voidGenerateReturn(ReturnOrderreturnOrder);

protected

abstract

voidCalculateRefund(ReturnOrderreturnOrder); //具體方法,調(diào)用兩個(gè)抽象方法

public

voidprocess(ReturnOrderreturnOrder){ GenerateReturn(returnOrder); CalculateRefund(returnOrder); } }4.11.2抽象類的實(shí)際應(yīng)用——模版方法設(shè)計(jì)模式abstra654.11.2抽象類的實(shí)際應(yīng)用——模版方法設(shè)計(jì)模式//無條件退貨處理類classNoQuibblesReturnProssextendsReturnProcessTemplate{ @Override//表示方法重寫的Java注解

protected

voidGenerateReturn(ReturnOrderreturnOrder){ System.out.println("將商品添加到庫存中");//簡單示意性代碼 } @Override

protected

voidCalculateRefund(ReturnOrderreturnOrder){ System.out.println("只退貨款");//簡單示意性代碼 } }4.11.2抽象類的實(shí)際應(yīng)用——模版方法設(shè)計(jì)模式//無條件退664.11.2抽象類的實(shí)際應(yīng)用——模版方法設(shè)計(jì)模式//有缺陷退貨處理類classFaultReturnProssextendsReturnProcessTemplate{ @Override

protected

voidGenerateReturn(ReturnOrderreturnOrder){ System.out.println("將商品返廠");//簡單示意性代碼 } @Override

protected

voidCalculateRefund(ReturnOrderreturnOrder){ System.out.println("全額退款");//簡單示意性代碼 } }4.11.2抽象類的實(shí)際應(yīng)用——模版方法設(shè)計(jì)模式//有缺陷退674.11.2抽象類的實(shí)際應(yīng)用——模版方法設(shè)計(jì)模式classReturnProcessFactory{//創(chuàng)建退貨處理類對象的工廠類 //根據(jù)退貨單類型創(chuàng)建相應(yīng)的退貨處理類對象的靜態(tài)方法

public

staticReturnProcessTemplatecreatReturnProcess(ReturnTypereturnType){

switch(returnType){

case

FaultReturn:

return

newFaultReturnPross();

case

NoQuibblesReturn:

return

newNoQuibblesReturnPross();

default:return

null; } }}4.11.2抽象類的實(shí)際應(yīng)用——模版方法設(shè)計(jì)模式class684.11.2抽象類的實(shí)際應(yīng)用——模版方法設(shè)計(jì)模式classReturnService{//退貨處理服務(wù)類

public

voidprocess(ReturnOrderreturnOrder){//處理退貨單的方法 //調(diào)用工廠類的靜態(tài)方法創(chuàng)建退貨處理類對象 ReturnProcessTemplatereturnProcess=ReturnProcessFactory.creatReturnProcess(returnOrder.returnType);//調(diào)用退貨處理類對象的方法處理退貨 returnPcess(returnOrder); } }4.11.2抽象類的實(shí)際應(yīng)用——模版方法設(shè)計(jì)模式class694.11.2抽象類的實(shí)際應(yīng)用——模版方法設(shè)計(jì)模式public

classTemplateMethodPatternDemo{//應(yīng)用程序主類

public

static

voidmain(String[]args){ ReturnOrderfaultReturnOrder=newReturnOrder();//生成退貨單對象 //設(shè)置退貨單為有缺陷類型 faultReturnOrder.returnType=ReturnType.FaultReturn; //創(chuàng)建退貨處理服務(wù)類對象 ReturnServicereturnService=newReturnService(); returnScess(faultReturnOrder);//調(diào)用處理退貨單的方法 ReturnOrdernoQuibblesReturnOrder=newReturnOrder();//生成退貨單對象 //設(shè)置退貨單為無條件退貨類型 noQuibblesReturnOrder.returnType=ReturnType.NoQuibblesReturn; returnScess(noQuibblesReturnOrder);//調(diào)用處理退貨單的方法}}4.11.2抽象類的實(shí)際應(yīng)用——模版方法設(shè)計(jì)模式public70第4章繼承與多態(tài)性第4章繼承與多態(tài)性714.1繼承的基本概念顧名思義,繼承就是子將父的東西承接過來。圖4-1動物類別之間的繼承【提示】繼承需要符合IS-A(是一種)關(guān)系,也就是子類是父類的一種,如老虎是食肉動物的一種。4.1繼承的基本概念顧名思義,繼承就是子將父的東西承接過72Java繼承的特點(diǎn)1)繼承關(guān)系是傳遞的。若類C繼承類B,類B繼承類A,則類C既有從類B那里繼承下來的屬性與方法,也有從類A那里繼承下來的屬性與方法,還可以有自己新定義的屬性和方法。2)繼承簡化了人們對事物的認(rèn)識和描述,能清晰體現(xiàn)相關(guān)類間的層次結(jié)構(gòu)關(guān)系。3)繼承提供了軟件復(fù)用功能。若類B繼承類A,那么建立類B時(shí)只需要再描述與基類(類A)不同的少量特征(數(shù)據(jù)成員和成員方法)即可。這種做法能減小代碼和數(shù)據(jù)的冗余度,大大增加程序的重用性。4)繼承通過增強(qiáng)一致性來減少模塊間的接口和界面,大大增加了程序的易維護(hù)性。Java繼承的特點(diǎn)1)繼承關(guān)系是傳遞的。若類C繼承類B,類734.2Java繼承的實(shí)現(xiàn)4.2.1繼承的語法在Java中使用extends關(guān)鍵字實(shí)現(xiàn)繼承關(guān)系,格式如下:[訪問控制方式]class<子類名>extends<父類名>{......//成員定義 }4.2Java繼承的實(shí)現(xiàn)4.2.1繼承的語法744.2.1繼承的語法【實(shí)例4-1】繼承的使用classPerson{

privateStringname;//姓名

private

intage;//年齡

publicStringgetName(){

returnname; }

public

voidsetName(Stringname){

=name; }

public

intgetAge(){

returnage; }

public

voidsetAge(intage){

this.age=age; } }classStudentextendsPerson{

privateStringschool;//學(xué)校

private

intgrade;//年級

publicStringgetSchool(){

returnschool; }

public

voidsetSchool(Stringschool){

this.school=school; }

public

intgetGrade(){

returngrade; }

public

voidsetGrade(intgrade){

this.grade=grade; }}4.2.1繼承的語法【實(shí)例4-1】繼承的使用classS754.2.1繼承的語法public

classInheritDemo{

public

static

voidmain(String[]args){ Studentstu=newStudent();//新建學(xué)生對象 stu.setName("張三");//訪問從父類繼承的方法 stu.setAge(20);//訪問從父類繼承的方法 stu.setSchool("哈佛大學(xué)");//訪問本類定義的方法 stu.setGrade(2);//訪問本類定義的方法 System.out.println("姓名:"+stu.getName()+",年齡:"+stu.getAge()+"學(xué)校:"+stu.getSchool()+",年級:"+stu.getGrade()); }}4.2.1繼承的語法publicclassInheri764.2.1繼承的語法4.2.1繼承的語法774.2.2protected訪問控制方式父類和子類是一般類和特殊類關(guān)系,子類是需要擴(kuò)展父類的功能的,在擴(kuò)展父類的功能時(shí),可能會需要使用到從父類繼承的私有成員,但父類的私有成員,在子類中不能直接訪問。為此,Java提供了protected訪問控制方式來解決這個(gè)問題。protected訪問控制方式介于private和public之間,用protected修飾的類里的成員,向所有子類和同一個(gè)包的其它類開放其訪問權(quán)限。

4.2.2protected訪問控制方式父類和子類是一般784.2.3super關(guān)鍵字與子類對象實(shí)例化過程子類對象實(shí)例中這些繼承下來的非靜態(tài)數(shù)據(jù)成員所占用的內(nèi)存區(qū)域?yàn)樽宇悓ο髮?shí)例中的父類子對象。注意父類子對象本身相當(dāng)于一個(gè)父類對象實(shí)例。Java語言的每一個(gè)對象實(shí)例也有一個(gè)特殊的私有數(shù)據(jù)成員,稱為super,用來引用該父類子對象。super也是一個(gè)引用變量,其類型則是它所屬的對象實(shí)例的父類類型。4.2.3super關(guān)鍵字與子類對象實(shí)例化過程子類對象實(shí)794.2.3super關(guān)鍵字與子類對象實(shí)例化過程【實(shí)例4-2】子類對象實(shí)例化classPerson{

publicPerson(){ System.out.println("我是Person類的構(gòu)造方法"); }}classStudentextendsPerson{

publicStudent(){ System.out.println("我是Student類的構(gòu)造方法"); }}public

classSuperDemo1{

public

static

voidmain(String[]args){ Studentstu=newStudent();//新建學(xué)生對象 }}圖4-5運(yùn)行結(jié)果4.2.3super關(guān)鍵字與子類對象實(shí)例化過程【實(shí)例4-2804.2.3super關(guān)鍵字與子類對象實(shí)例化過程【實(shí)例4-3】super關(guān)鍵字classPerson{

privateStringname;//姓名

private

intage;//年齡

publicPerson(Stringname,intage){

=name;

this.age=age; }

publicStringgetName(){

returnname; }

public

intgetAge(){

returnage; }}4.2.3super關(guān)鍵字與子類對象實(shí)例化過程【實(shí)例4-3814.2.3super關(guān)鍵字與子類對象實(shí)例化過程classStudentextendsPerson{

privateStringschool;//學(xué)校

private

intgrade;//年級

publicStudent(Stringname,intage,Stringschool,intgrade){

super(name,age);//調(diào)用父類構(gòu)造方法,初始化從父類繼承的對象屬性

this.school=school;

this.grade=grade; }

publicStringgetSchool(){

returnschool; }

public

intgetGrade(){

returngrade; }}4.2.3super關(guān)鍵字與子類對象實(shí)例化過程class824.2.3super關(guān)鍵字與子類對象實(shí)例化過程public

classSuperDemo2{

public

static

voidmain(String[]args){ Studentstu=newStudent("張三",20,"哈佛大學(xué)",2);//新建學(xué)生對象 System.out.println("姓名:"+stu.getName()+",年齡:"+stu.getAge()+"學(xué)校:“+stu.getSchool()+",年級:"+stu.getGrade()); }}4.2.3super關(guān)鍵字與子類對象實(shí)例化過程public834.2.4方法重寫(Override)方法重寫也稱為方法覆蓋或方法重定義

classVehicle{

public

voidrun(){ System.out.println("交通工具在跑!"); }}classTruckextendsVehicle{ @Override//表示方法重寫的Java注解

public

voidrun(){ System.out.println("貨車在地上跑!"); }}classAirplaneextendsVehicle{ @Override//表示方法重寫的Java注解

public

voidrun(){ System.out.println("飛機(jī)在天上飛!"); }}4.2.4方法重寫(Override)方法重寫也稱為方法844.2.5final關(guān)鍵字final在Java中表示最終的意思,使用final可以聲明類、屬性和方法:1)使用final可以聲明常量,常量不能修改,定義時(shí)要賦初值;例如:final

intNUM=0;2)使用final聲明的方法不能被子類重寫;3)使用final聲明的類不能有子類。4.2.5final關(guān)鍵字final在Java中表示最終854.3繼承與子類型類A繼承類B,則類型A是類型B的子類型。Java語言允許祖先類類型的引用變量指向后代類類型的對象。例如,類GraduateStudent是類Student的子類,下述語句是合法的:Students=newGraduateStudent();類似的如果一個(gè)方法的形參是超類類型,那么方法調(diào)用時(shí)可以傳給它一個(gè)子類對象作為實(shí)參,例如對于一個(gè)方法voidf(Studentd);可以這樣來調(diào)用它:GraduateStudents=newGraduateStudent();f(s);//子類對象作為實(shí)參4.3繼承與子類型類A繼承類B,則類型A是類型B的子類型864.4抽象類與多態(tài)性4.4.1抽象類的引入抽象類往往用來表征我們在對問題領(lǐng)域進(jìn)行分析、設(shè)計(jì)中得出的抽象概念,是對一系列看上去不同,但是本質(zhì)上相同的具體概念的抽象。4.4抽象類與多態(tài)性4.4.1抽象類的引入874.4.2抽象方法在抽象類中創(chuàng)建的沒有具體實(shí)現(xiàn)的,必須要子類重寫的方法稱為抽象方法。抽象方法用關(guān)鍵字abstract進(jìn)行修飾,這種方法只聲明返回的數(shù)據(jù)類型、方法名稱和所需的參數(shù),沒有方法體,也就是說抽象方法只需要聲明而不需要實(shí)現(xiàn)。聲明一個(gè)抽象方法的基本格式如下:abstract<方法返回值類型><方法名>(參數(shù)列表);例如: abstract

voidf();4.4.2抽象方法在抽象類中創(chuàng)建的沒有具體實(shí)現(xiàn)的,必須要884.4.3抽象類的定義【實(shí)例4-4】如何定義抽象類及抽象方法示例abstract

classFruit{//定義抽象類

publicStringcolor;//定義顏色成員變量

publicFruit(){//定義構(gòu)造方法 color="綠色";//對變量color進(jìn)行初始化 }

public

abstract

voidharvest();//定義抽象方法}classAppleextendsFruit{

public

voidharvest(){ System.out.println("蘋果已經(jīng)收獲!"); }}4.4.3抽象類的定義【實(shí)例4-4】如何定義抽象類及抽象894.4.3抽象類的定義classOrangeextendsFruit{

public

voidharvest(){ System.out.println("桔子已經(jīng)收獲!"); }}public

classAbstractClassDemo{

public

static

voidmain(String[]args){ Fruitf1=newApple();//父類引用指向子類對象 f1.harvest();

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論