版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Java語言程序設(shè)計第7章面向?qū)ο筇卣?/p>
1面向?qū)ο筇卣?3主要內(nèi)容Java語言程序設(shè)計(第4版)清華大學(xué)出版社2022包、類庫和模塊封裝性與訪問權(quán)限45類的繼承final關(guān)鍵字6抽象類7對象轉(zhuǎn)換與多態(tài)8案例:自定義類庫的開發(fā)Java語言程序設(shè)計面向?qū)ο筇卣髅嫦驅(qū)ο筇卣鱆ava語言程序設(shè)計(第4版)清華大學(xué)出版社和面向過程編程方法相比,面向?qū)ο蟮某绦蛟O(shè)計方法的最顯著的特點是它更接近于人們通常的思維規(guī)律,因而設(shè)計出的軟件系統(tǒng)能夠更直接地、自然地反映客觀現(xiàn)實中的問題。封裝性、繼承性和多態(tài)性是面向?qū)ο缶幊陶Z言的三大特性,Java語言支持這三大特性。6.1.1封裝性封裝性是面向?qū)ο蟮囊粋€重要特征。在Java語言中,對象就是一組變量和方法的封裝體。對象是狀態(tài)(屬性)和行為(操作或方法)封裝體。例如,電視機(jī)是一個封裝體。實現(xiàn)信息隱藏,通過接口與外界通信。通過對象的封裝,用戶不必了解對象是如何實現(xiàn)的,只須通過對象提供的接口與對象進(jìn)行交互就可以。封裝性實現(xiàn)了模塊化和信息隱藏,有利于程序的可移植性和對象的管理。6.1.1繼承性繼承(inheritance)的概念普遍存在于現(xiàn)實世界中。它是一個對象獲得另一個對象的屬性的過程。繼承之所以重要,是因為它支持層次結(jié)構(gòu)類的概念。我們發(fā)現(xiàn),在現(xiàn)實世界中,許多知識都是通過層次結(jié)構(gòu)方式進(jìn)行管理的。圖7-1給出了常用交通工具類及其子類的繼承關(guān)系。有交通工具的所有特性。例如,小汽車是一種車,而車又是一種交通工具。交通工具類有的某些特性(可運(yùn)貨,有動力)也適用于它的子類車。飛機(jī)也是一種交通工具,它具有與車不同的特性,但都具有交通工具的所有特性。6.1.1繼承性類的繼承描述了類之間的一種關(guān)系,它實際是類的一種泛化關(guān)系,即是一種(is-a)關(guān)系,比如飛機(jī)是一種(is-a)交通工具。類的繼承是復(fù)用類的一種形式。在面向?qū)ο蠓治鲋校^承外,還有其他關(guān)系,如關(guān)聯(lián)關(guān)系、組合關(guān)系、聚合關(guān)系和依賴關(guān)系等。比如,一臺小汽車就是由發(fā)動機(jī)、車身、輪胎、方向盤等組成,它們共同組成一輛車。多態(tài)性(polymorphism)是面向?qū)ο缶幊陶Z言的一個重要特性。所謂多態(tài),是指一個程序中相同的名字表示不同含義的情況。多態(tài)性比如對于“running”這個動作,我們可以說狗可以running,人也可以running,汽車也可以running。這是無關(guān)的類使用相同的名字情況。多態(tài)性多態(tài)也可存在于具有父子關(guān)系的類型中,例如,假設(shè)Employee類是Programmer類的父類,那么Employee類的“working”與Programmer類的“working”通常具有不同的含義,這是子類中定義的與父類中的方法同名的方法,即稱為方法覆蓋。Java語言程序設(shè)計包、類庫與模塊Java語言使用包來組織類庫。包(package)實際是一組相關(guān)類或接口的集合。Java類庫中的類都是通過包來組織的。我們自己編寫的類也可以通過包組織。包實際上提供了類的訪問權(quán)限和命名管理機(jī)制。概述具體來說,包主要有下面幾個作用:可以將功能相關(guān)的類和接口放到一個包中。通過包實現(xiàn)命名管理機(jī)制,不同包中可以有同名的類。通過包還可以實現(xiàn)對類的訪問控制。用戶定義的類都應(yīng)存放到某個包中,這需要在定義類時使用package語句。包在計算機(jī)系統(tǒng)中實際上對應(yīng)于文件系統(tǒng)的目錄(文件夾)。包與package語句如果在定義類時沒有指定類屬于哪個包,則該類屬于默認(rèn)包(defaultpackage),即當(dāng)前目錄。默認(rèn)包中的類只能被該包中的類訪問。為了保證自己創(chuàng)建的類不與其他人創(chuàng)建的類沖突,需要給包取一個獨(dú)一無二的名稱。為了使你的包名與別人的包名不同,建議將域名反轉(zhuǎn)過來作為包的名稱。例如,假設(shè)一個域名為,那么創(chuàng)建的包名可以為com.boda.xy。創(chuàng)建的類都存放在這個包下,這些類就不會與任何人的類沖突。package語句要將某個類放到包中,需在定義類時使用package語句,如下所示。
packagecom.boda.xy;publicclassEmployee{…}在Java一個源文件只能有一條package語句,該語句必須為源文件的第一條非注釋語句。創(chuàng)建包通常有兩種方法。許多IDE工具(如Eclipse或IntelliJIDEA等)創(chuàng)建帶包的類時自動創(chuàng)建包的路徑,并將編譯后的類放入指定的包中。如何創(chuàng)建包若使用java命令編譯源文件,使用帶–d選項的編譯命令。如上述源文件可使用下列方法編譯。D:\study>javac–dD:\studyEmployee.java這里,-d后面指定的路徑為包的上一級目錄。這樣編譯器自動在D:\study目錄創(chuàng)建一個com\boda\xy子目錄,然后將編譯后的Employee.class類文件放到該目錄中。如果一個類屬于某個包,就可以用類的完全限定名(fullyqualifiedname)來表示它。例如,若Employee類屬于com.boda.xy包,則它的完全限定名是
com.boda.xy.Employee類的完全限定名為了使用某個包中的類或接口,需要將它們導(dǎo)入到源程序中。在Java語言中可以使用兩種導(dǎo)入:一是使用import語句導(dǎo)入指定包中的類或接口。二是使用importstatic導(dǎo)入類或接口中的靜態(tài)成員。類的導(dǎo)入import語句用于導(dǎo)入程序中需要使用的類,它有兩種寫法。一是具體指定要導(dǎo)入的完整類名,另一種是使用星號(*)通配符指定導(dǎo)入某個包中的所有類。比如,程序要使用java.util包中的Scanner類,就可以使用下面兩種方式:import語句importjava.util.Scanner;importjava.util.*;如果一個源程序中要使用某個包中的多個類,用第二種方式比較方便,否則要寫多個import語句。導(dǎo)入某個包中所有類并不是將所有的類都加到源文件中,而是使用到哪個類才導(dǎo)入哪個類。也可以不用import語句而在使用某個類時指明該類所屬的包。
java.util.Scanner
sc=newjava.util.Scanner(System.in);import語句另外,需要注意的是如果用“*”號這種方式導(dǎo)入不同包中有同名的類,在使用時應(yīng)指明類的全名。importjava.util.*;importjava.sql.*;publicclassPackageDemo{publicstaticvoidmain(String[]args){Dated=newDate();//該語句編譯錯誤System.out.println("d="+d);}}程序7.1PackageDemo.java需要使用類的完全限定名。如要創(chuàng)建java.util包中的Date類對象,創(chuàng)建對象的語句應(yīng)該改為:
java.util.Dated=newjava.util.Date();在Java5版中,允許使用importstatic語句導(dǎo)入類中的常量和靜態(tài)方法,然后再使用這些類中的常量或方法就不用加類名前綴了。importstatic語句例如,要使用Math類的random()等方法,就可以先使用下列靜態(tài)導(dǎo)入語句。
importstaticjava.lang.Math.*;然后在程序中就可以直接使用random()了,請看下面程序。importstaticjava.lang.Math.*;importstaticjava.lang.System.*;publicclassImportStaticDemo{publicstaticvoidmain(String[]args){vard=random();//不需要加類名前綴varpi=PI;
out.println("d="+d);//out是System類的一個靜態(tài)成員
out.println("pi="+pi);} }程序7.2ImportStaticDemo.java程序員除了使用自己定義的類外,還可以使用Java類庫(JavaClassLibrary,JCL)中定義的類或者第三方定義的類。JCL是Java語言實現(xiàn)的包的集合。簡單地說,它是JDK中的可用.class文件集合。Java類庫一旦安裝了Java,它們就將作為安裝的一部分,并可以使用JCL類作為構(gòu)建塊來構(gòu)建應(yīng)用程序代碼,這些構(gòu)建塊負(fù)責(zé)完成許多底層開發(fā)。JCL的豐富性和易用性極大地促進(jìn)了Java的流行。包名說明java.langJava語言基礎(chǔ)包,該包中的類不需要導(dǎo)入就可以使用。常用類有Object、Class、String和StringBuilder、System、Math、基本類型包裝類等java.util該包主要包含工具類,其中集合類和接口定義在該包中。常用的有Collection、List、Set、Queue、Map等接口以及這些接口的實現(xiàn)類java.time包含有用于管理日期、時間、期間和持續(xù)時間的類。常用的有LocalDate、LocalTime和LocalDateTime類以及Month、DayOfWeek枚舉java.io包含支持使用流、序列化和文件系統(tǒng)讀寫數(shù)據(jù)的類和接口java.sql和javax.sql這兩個包組成Java數(shù)據(jù)庫連接(JDBC)API,該API允許訪問和處理存儲在數(shù)據(jù)源(通常是關(guān)系數(shù)據(jù)庫)中的數(shù)據(jù)。javax.sql包是java.sql包的補(bǔ)充該包存放網(wǎng)絡(luò)編程類,例如:Socket和ServerSocket類等java.awt和javax.swing這兩個包存放圖形界面程序開發(fā)所需要的類Java類庫Java模塊系統(tǒng)是Java9中添加的最新特性。模塊是對相關(guān)的包和資源進(jìn)行分組,并由一個描述符進(jìn)行描述。Java模塊系統(tǒng)解決了大型Java應(yīng)用程序的兩個主要需求:可靠的配置強(qiáng)封裝它允許Java組件指定其所有依賴項(成功運(yùn)行所需的組件)。它還允許程序員完全隱藏外部組件不能訪問的類型。7.2.4Java模塊Java標(biāo)準(zhǔn)庫被模塊化為大約70個JMOD文件,它們存放在JDK安裝目錄的jmods目錄中。模塊的數(shù)量隨著Java版本的不同而不同。Java17版有大約70個模塊,其中包括Java的標(biāo)準(zhǔn)模塊(名稱以java.開頭)和非標(biāo)準(zhǔn)模塊。可以使用java工具通過--list-modules參數(shù)列出特定于平臺的模塊:java--list-modulesJava標(biāo)準(zhǔn)模塊一些重要的標(biāo)準(zhǔn)模塊包括:java.base、java.desktop、java.logging、java.se、java.se.ee、java.sql和java.xml。還包括以jdk開頭的模塊,如piler、jdk.httpserver及jdk.jartool。模塊化應(yīng)用程序(modularapplication)是使用Java模塊系統(tǒng)的Java應(yīng)用程序。相反,非模塊化應(yīng)用程序是不使用模塊的Java應(yīng)用程序。在Java9之前創(chuàng)建的所有Java應(yīng)用程序都是非模塊化的。Java9或更高版本允許編寫模塊化和非模塊化應(yīng)用程序。創(chuàng)建模塊應(yīng)用程序編寫模塊化應(yīng)用程序只需要在源目錄中創(chuàng)建一個名為module-info.java的模塊描述符。模塊描述符將編譯成輸出目錄中的module-info.class文件。為了創(chuàng)建模塊描述符,Java還提供了10個受限關(guān)鍵字(restrictedkeywords):open、module、requires、transitive、exports、opens、to、uses、provides和with。它們在模塊聲明的上下文中作為關(guān)鍵字,而在其他地方可以作為標(biāo)識符。創(chuàng)建模塊應(yīng)用程序模塊描述符的語法如下:modulemoduleName{requires...;exports...;}requires用于指定該模塊所需要的模塊,下面描述符表示chapter.one模塊編譯和運(yùn)行需要(依賴)com.boda.xy模塊。modulechapter.one{requirescom.boda.xy;}創(chuàng)建模塊應(yīng)用程序這是顯式指定依賴關(guān)系。也存在隱式依賴關(guān)系。比如,開發(fā)人員聲明的任何模塊都隱式地需要JDK的java.base模塊,這個模塊中定義了JavaSE平臺的基礎(chǔ)API,該模塊是編寫Java程序必須的。使用exports導(dǎo)出包使包對任何其他模塊可用。然而,這并不總是你想要的??梢栽趯?dǎo)出語句中指定另一個模塊,使導(dǎo)出僅被所指定的模塊使用。下面描述符表示將chapter.two模塊com.boda.utils包導(dǎo)出給chapter.one模塊。創(chuàng)建模塊應(yīng)用程序modulechapter.two{exportscom.boda.utiltocom.example.desktop;}如果使用Java9或更高版本編寫非模塊化程序,那么包將屬于一個稱為未命名模塊(unnamedmodule)的特殊模塊。未命名的模塊還使向后兼容舊的Java成為可能。未命名模塊可讀取所有其他模塊。創(chuàng)建模塊應(yīng)用程序關(guān)于模塊還有很多內(nèi)容。限于篇幅,本書不加詳細(xì)介紹。感興趣的讀者可參考《深入理解Java模塊系統(tǒng)》,人民郵電出版社,2020年。Java語言程序設(shè)計封裝性與訪問權(quán)限封裝性是面向?qū)ο蟮囊粋€重要特征。在Java語言中,對象就是一組變量和方法的封裝體。通過對象的封裝,用戶不必了解對象是如何實現(xiàn)的,只須通過對象提供的接口與對象進(jìn)行交互就可以。封裝性實現(xiàn)了模塊化和信息隱藏,有利于程序的可移植性和對象的管理。概述對象的封裝是通過兩種方式實現(xiàn):(1)通過包實現(xiàn)封裝性。在定義類時使用package語句指定類屬于哪個包。包是Java語言最大的封裝單位,它定義了程序?qū)︻惖脑L問權(quán)限。(2)通過類或類的成員的訪問權(quán)限實現(xiàn)封裝性。包是Java語言最大的封裝單位,它定義了程序?qū)︻惖脑L問權(quán)限。圖7-2給出了兩個包com.boda.xy和org.demo.ab的結(jié)構(gòu),其中A、B、C類屬于com.boda.xy包,D和E類屬于org.demo.ab包。箭頭表示類繼承關(guān)系,其中B是A的子類,且與A在同一個包中,D也是A的子類,但與A不在同一個包中。概述類(也包括接口和枚舉等)的訪問權(quán)限通過修飾符public實現(xiàn)。它定義哪些類可以使用該類。public類可以被任何其他類使用,而缺省訪問修飾符的類僅能被同一包中的類使用。下面的Robot類定義在com.boda.xy包中,該類缺省訪問修飾符。7.3.1類的訪問權(quán)限packagecom.boda.xy;classRobot{Robot(){System.out.println("創(chuàng)建一個機(jī)器人實例");
}}下面的RobotDemo類定義在org.demo.ab包中,它與Robot類不在同一個包,在該類中試圖使用com.boda.xy包中的Robot類。7.3.1類的訪問權(quán)限packageorg.demo.ab;
importcom.boda.xy.Robot;
publicclassRobotDemo{publicstaticvoidmain(String[]args){
Robotsiri=newRobot();
}}對出現(xiàn)這樣問題可以有兩種解決辦法:(1)將Robot類的訪問修飾符修改為public,使它成為公共類,這樣就可以被所有其他類訪問。(2)將RobotDemo類和Robot類定義在一個包中,即RobotDemo類的package語句改為如下語句。packagecom.boda.xy;7.3.1類的訪問權(quán)限一般情況下,如果一個類只提供給同一個包中的類訪問可以不加訪問修飾符,如果還希望被包外的類訪問,則需要加上public訪問修飾符。類成員的訪問權(quán)限包括成員變量和成員方法的訪問權(quán)限。共有4個修飾符,它們分別是:private缺省的protectedpublic這些修飾符控制成員可以在程序的哪些部分被訪問,也叫成員的可見性。7.3.2類成員的訪問權(quán)限用private修飾的成員稱為私有成員,私有成員只能被這個類本身訪問,外界不能訪問。private修飾符最能體現(xiàn)對象的封裝性,從而可以實現(xiàn)信息的隱藏。private修飾符packagecom.boda.xy;classAnimal{
privateStringname="大熊貓";
privatevoiddisplay(){System.out.println("Mynameis"+name);}}程序7.3AnimalDemo.javapublicclassAnimalDemo{
publicstaticvoidmain(String[]args){Animala=newAnimal();System.out.println("="+);a.display();
}}如果將上面程序的main()方法寫在Animal類中,程序能正常編譯和運(yùn)行。這時,main()方法定義在Animal類中,它可訪問本類中的private變量和private方法。類的構(gòu)造方法也可以被聲明為私有的,這樣其他類就不能生成該類的實例,一般是通過調(diào)用該類的工廠方法來創(chuàng)建類的實例。缺省修飾符的成員,一般稱為包可訪問的。這樣的成員可以被該類本身和同一個包中的類訪問。其他包中的類不能訪問這些成員。對于構(gòu)造方法,如果沒有加訪問修飾符,也只能被同一個包的類產(chǎn)生實例。缺省修飾符當(dāng)成員被聲明為protected時,一般稱為保護(hù)成員。該類成員可以被這個類本身、同一個包中的類以及該類的子類(包括同一個包以及不同包中的子類)訪問。protected修飾符如果一個類有子類且子類可能處于不同的包中,為了使子類能直接訪問父類的成員,那么應(yīng)該將其聲明為保護(hù)成員,而不應(yīng)該聲明為私有或默認(rèn)的成員。用public修飾的成員一般稱為公共成員,公共成員可以被任何其他的類訪問,但前提是類是可訪問的。表7-2總結(jié)了各種修飾符的訪問權(quán)限。public修飾符修飾符同一個類同一個包的類不同包的子類任何類private√???缺省√√??protected√√√?public√√√√Java語言程序設(shè)計7.4類的繼承繼承的基本思想是可以從已有的類派生出新類。不同的類可能會有一些共同的特征和行為,可以將這些共同的特征和行為統(tǒng)一放在一個類中,使它們可以被其他類所共享。概述例如,可以將人定義為一個類(Person),因為員工具有人的所有的特征和行為,則可以將員工類定義為人的子類(Employee),這就叫繼承。進(jìn)一步,還可以將經(jīng)理(Manager)又定義為員工類的子類,經(jīng)理也繼承了員工的特征和行為,這樣形成類的層次結(jié)構(gòu)。在類的層次結(jié)構(gòu)中,被繼承的類稱為父類(parentclass)或超類(superclass),而繼承得到的類稱為子類(subclass)或派生類(derivedclass)。子類繼承父類的狀態(tài)和行為,同時也可以具有自己的特征。概述在Java程序中要實現(xiàn)類的繼承,使用extends關(guān)鍵字,格式如下:[public]classSubClass
extends
SuperClass{//類體定義}7.4.1類繼承的實現(xiàn)關(guān)鍵字extends把SubClass聲明為SuperClass直接子類。這樣聲明后就說SubClass類繼承了SuperClass類或者說SubClass類擴(kuò)展了SuperClass類。如果SuperClass又是其他類的子類,則SubClass就為那個類的間接子類。6.1.1類繼承的實現(xiàn)Java語言程序設(shè)計(第4版)
QQ群:288639486將人(Person)定義為一個類,因為員工(Employee)具有人的所有的特征和行為,則可以將員工類定義為人的子類,這就叫繼承。用UML圖表示繼承:PersonEmployee父類或超類子類或派生類6.1.1實現(xiàn)類的繼承,使用extends關(guān)鍵字,格式如下:
[public]classSubClassextendsSuperClass{//類體定義}說明:1.子類繼承父類中非private的成員變量和成員方法。2省略extends,定義的類繼承Object類。3Java僅支持單繼承。PersonEmployeeObjectPersonStudentObjectEmployeeEmployeeWorkStudentStudentJava語言程序設(shè)計(第4版)
QQ群:288639486類繼承的實現(xiàn)publicclassPerson{publicStringname;publicintage;publicPerson(){//無參構(gòu)造方法
}publicPerson(Stringname,intage){//帶參數(shù)構(gòu)造方法
=name;this.age=age;}publicvoidsayHello(){System.out.println("Mynameis"+name);}}程序7.4Person.javapublicclassEmployeeextendsPerson{publicdoublesalary;//表示員工工資
publicEmployee(){//無參構(gòu)造方法}publicEmployee(Stringname,intage,doublesalary){//帶3個參數(shù)構(gòu)造方法super(name,age);this.salary=salary;}publicdoublecomputeSalary(inthours,doublerate){ doubletotalSalary; totalSalary=this.salary+hours*rate; returntotalSalary;}}程序7.5Employee.javapublicstaticvoidmain(String[]args){varemp=newEmployee("劉明",30,5000);System.out.println("姓名="+);System.out.println("年齡="+emp.age);emp.sayHello();//調(diào)用從父類繼承的方法System.out.println(puteSalary(10,50.0));//調(diào)用子類定義的方法}Java中創(chuàng)建子類實例之前都先調(diào)用父類的構(gòu)造方法創(chuàng)建父類的實例。程序7.6EmployeeDemo.java在子類中可以定義與父類中的名字、參數(shù)列表、返回值類型都相同的方法,這時子類的方法就叫做覆蓋(overriding)或重寫了父類的方法。7.4.2方法覆蓋說明:1子類不能覆蓋超類的private方法。2父類中static方法可以被繼承,但不能被覆蓋。假設(shè)要在Employee類中也定義一個sayHello()方法,它用來輸出員工信息,可定義如下:publicvoidsayHello(){
System.out.println("Hello,Iam"+name);
System.out.println("Iam"+age);
System.out.println("Mysalaryis"+salary);}該方法就是對Person類的sayHello()方法的覆蓋。如果子類覆蓋了超類的方法,再調(diào)用相同的方法時,調(diào)用的是子類的方法。為了避免在覆蓋方法時寫錯方法頭,可以使用@Override注解語法,即在要覆蓋的方法前面添加@Override。例如,假設(shè)一個Employee類要覆蓋Object類的toString()方法,代碼如下:7.4.2方法覆蓋@OverridepublicStringtoString(){return"姓名:"+name+"年齡:"+age;}@Override注解表示其后的方法必須是覆蓋父類的一個方法。如果具有該注解的方法沒有覆蓋父類的方法,編譯器將報告一個錯誤。7.4.2方法覆蓋例如,toString如果被錯誤地寫成tosrting,將報告一個編譯錯誤。如果沒有使用注解,編譯器不會報告錯誤。使用注解可以避免錯誤。關(guān)于方法覆蓋,有下面兩點值得注意:7.4.2方法覆蓋(1)private方法不能被覆蓋。只有非private的實例方法才可以覆蓋,如果在子類中定義了一個方法在父類中是private的,則這兩個方法完全無關(guān)。(2)父類中static方法也不能被覆蓋,但可以被繼承。如果子類中定義了與父類中的static方法完全一樣的方法,那么父類中的方法被隱藏。父類中被隱藏的static方法仍然可以使用“類名.方法名()”形式調(diào)用。在子類中可以使用super關(guān)鍵字,它用來引用當(dāng)前對象的父類對象,它可用于下面三種情況。(1)在子類中訪問父類中被隱藏的成員變量,格式為:
super.variableName7.4.3super關(guān)鍵字(2)在子類中調(diào)用父類中被覆蓋的方法,格式為:
super.methodName([paramlist])(3)在子類中調(diào)用父類的構(gòu)造方法,格式為:super([paramlist])classParent{StringlastName;intage;publicParent(){System.out.println("創(chuàng)建父類對象"); init(50,"張");}publicvoidinit(intage,StringlastName){this.lastName=lastName;this.age=age;}publicvoiddisplay(){
System.out.println("姓="+lastName+",年齡="+age);}}程序7.7SuperTest.javaclassChildextendsParent{intage,money;//age隱藏了父類Parent中的變量agepublicChild(){this(20,1000);System.out.println("創(chuàng)建子類對象");}publicChild(intage,intmoney){
super();//調(diào)用父類的默認(rèn)構(gòu)造方法this.age=age;this.money=money;}@Override//覆蓋父類Parent的display()方法publicvoiddisplay(){
super.display();//訪問父類的display()方法System.out.println("姓="+lastName+",年齡="+age);System.out.println("father.姓="+super.lastName+",father.年齡="+super.age);}}publicclassSuperTest{publicstaticvoidmain(String[]args){Childson=newChild();son.display();}}子類不能繼承父類的構(gòu)造方法。要創(chuàng)建子類對象,需要使用默認(rèn)構(gòu)造方法或為子類定義構(gòu)造方法。7.4.4調(diào)用父類的構(gòu)造方法Java語言規(guī)定,在創(chuàng)建子類對象時,必須先構(gòu)造該類的所有父類對象。因此,在編寫子類的構(gòu)造方法時,必須保證它能夠調(diào)用父類的構(gòu)造方法。在子類的構(gòu)造方法中調(diào)用父類的構(gòu)造方法有兩種方式:(1)使用super來調(diào)用父類的構(gòu)造方法super([paramlist]);這里super指直接父類的構(gòu)造方法,paramlist指調(diào)用父類帶參數(shù)的構(gòu)造方法。7.4.4調(diào)用父類的構(gòu)造方法(2)調(diào)用父類的默認(rèn)構(gòu)造方法在子類構(gòu)造方法中若沒有使用super調(diào)用父類的構(gòu)造方法,則編譯器在子類的構(gòu)造方法的第一句自動加上super(),即調(diào)用父類無參數(shù)的構(gòu)造方法。另外,在子類構(gòu)造方法中也可以使用this調(diào)用本類的其他構(gòu)造方法。不管使用哪種方式調(diào)用構(gòu)造方法,this和super語句必須是構(gòu)造方法中的第一條語句,并且最多只有一條這樣的語句。7.4.4調(diào)用父類的構(gòu)造方法不能既調(diào)用this,又調(diào)用super。在任何情況下,創(chuàng)建一個類的實例時,將會沿著繼承鏈調(diào)用所有父類的構(gòu)造方法,這叫做構(gòu)造方法鏈。下面代碼定義了Vehicle類、Bicycle類和ElectricBicycle類,代碼演示了子類和父類構(gòu)造方法的調(diào)用。7.4.4調(diào)用父類的構(gòu)造方法Vehicle交通工具類Bicycle自行車類ElectricBicycle電動自行車類VehicleBicycleObjectElectricBicycleclassVehicle{//定義Vehicle車輛類publicVehicle(){System.out.println("創(chuàng)建Vehicle對象");}}程序7.8ElectricBicycle.javaclassBicycleextendsVehicle{privateStringbrand;publicBicycle(){this("捷安特牌");System.out.println("創(chuàng)建Bicycle對象");}publicBicycle(Stringbrand){this.brand=brand;}}//ElectricBicycle類擴(kuò)展了Bicycle類publicclassElectricBicycleextendsBicycle{Stringfactory;publicElectricBicycle(){System.out.println("創(chuàng)建ElectricBicycle對象");}publicstaticvoidmain(String[]args){ElectricBicyclemyBicycle=newElectricBicycle();}}Java語言程序設(shè)計7.5final關(guān)鍵字如果一個類使用final修飾,則該類就為最終類(finalclass),最終類不能被繼承。下面代碼會發(fā)生編譯錯誤。7.5.1final修飾類classBBextendsAA{//…}finalclassAA{//…}不能繼承final類如果一個方法使用final修飾,則該方法不能被子類覆蓋。例如,下面的代碼會發(fā)生編譯錯誤:7.5.2final修飾方法classAA{publicfinal
voidmethod(){}//最終方法}classBBextendsAA{@Overridepublicvoidmethod(){}}不能覆蓋final方法用final修飾的變量包括類的成員變量、方法的參數(shù)和方法的局部變量。一個變量如果用final修飾,則該變量為常值變量,一旦賦值便不能改變。7.5.3final修飾變量對于類的成員變量一般使用static與final組合定義類常量。這種常量稱為編譯時常量,編譯器可以將該常量值代入任何可能用到它的表達(dá)式中,這可以減輕運(yùn)行時的負(fù)擔(dān)。如果使用final修飾方法的參數(shù),則參數(shù)的值在方法體中只能被使用而不能被改變,請看下面代碼:7.5.3final修飾變量classTest{publicstaticfinalintSIZE=50;publicvoidmethodA(finalinti){
i=i+1;}publicintmethodB(finalinti){
finalintj=i+1;returnj;}}不能修改final參數(shù)可以使用final參數(shù)注意,如果一個引用變量使用final修飾,表示該變量的引用(地址)不能被改變,一旦引用被初始化指向一個對象,就無法改變使它指向另一個對象。但對象本身是可以改變的,Java沒有提供任何機(jī)制使對象本身保持不變。7.5.3final修飾變量Java語言程序設(shè)計7.6抽象類前面章節(jié)中定義的類可以創(chuàng)建對象,它們都是具體的類。在Java中還可以定義抽象類。抽象類(abstractclass)是包含抽象方法的類。抽象類假設(shè)要開發(fā)一個圖形繪制系統(tǒng),需要定義圓(Circle)類、矩形(Rectangle)類和三角形(Triangle)類等,這些類都需要定義求周長和面積的方法,這些方法對不同的圖形有不同的實現(xiàn)。這時就可以設(shè)計一個更一般的類,比如幾何形狀(Shape)類,在該類中定義求周長和面積的方法。由于Shape不是一個具體的形狀,這些方法就不能實現(xiàn),因此要定義為抽象方法(abstractmethod)。定義抽象方法需要在方法前加上abstract修飾符。抽象方法只有方法的聲明,沒有方法的實現(xiàn)。包含抽象方法的類必須定義為抽象類,定義抽象類需要的類前加上abstract修飾符。下面定義的Shape類即為抽象類,其中定義了兩個抽象方法。抽象類publicabstractclassShape{Stringname;
publicShape(){}//抽象類可以定義構(gòu)造方法
publicShape(Stringname){=name;}publicabstractdoublegetArea();//定義抽象方法publicabstractdoublegetPerimeter();//定義抽象方法}程序7.9Shape.java在抽象類中可以定義構(gòu)造方法,這些構(gòu)造方法可以在子類的構(gòu)造方法中調(diào)用。盡管在抽象類中可以定義構(gòu)造方法,但抽象類不能被實例化,即不能用new生成抽象類的對象,如下列語句將會產(chǎn)生編譯錯誤:
Shapesh=newShape();抽象類在抽象類中可以定義非抽象的方法??梢詣?chuàng)建抽象類的子類,抽象類的子類還可以是抽象類。只有非抽象的子類才能使用new創(chuàng)建該類的對象。抽象類中可以沒有抽象方法,但仍然需要被子類繼承,才能實例化。publicclassCircleextendsShape{protecteddoubleradius;publicCircle(){this(0.0);
}publicCircle(doubleradius){super("圓");//調(diào)用父類的構(gòu)造方法this.radius=radius;
}publicvoidsetRadius(doubleradius){this.radius=radius;
}
程序7.10Circle.javapublicdoublegetRadius(){returnradius;
}@OverridepublicdoublegetPerimeter(){//實現(xiàn)父類的抽象方法return2*Math.PI*radius;
}@OverridepublicdoublegetArea(){//實現(xiàn)父類的抽象方法returnMath.PI*radius*radius;
}@OverridepublicStringtoString(){//覆蓋Object類的toString()方法return"[圓]radius="+radius;
}}6.1.1課堂討論及訓(xùn)練Java語言程序設(shè)計(第4版)
QQ群:288639486定義Rectangle類表示矩形,繼承Shape抽象類,實現(xiàn)其中的getPerimeter()方法和getArea()方法。6.1.1課堂討論及訓(xùn)練Java語言程序設(shè)計(第4版)
QQ群:2886394861.定義一個名為Cylinder類表示圓柱,它繼承Circle類,要求定義一個變量height表示圓柱高度。覆蓋getArea()方法求圓柱的表面積,定義getVolume()方法求圓柱體積。定義默認(rèn)構(gòu)造方法和帶radius和height兩個參數(shù)的構(gòu)造方法。2.畫出Circle類和Cylinder類的UML圖。3.編寫測試程序,提示用戶輸入圓柱的底面圓的半徑和高度,程序創(chuàng)建一個圓柱對象,計算并輸出圓柱表面積和體積。Java語言程序設(shè)計7.7對象轉(zhuǎn)換與多態(tài)性為了討論方便,先介紹兩個術(shù)語:
子類型和父類型。一個類(或接口)實際上定義了一種類型。子類定義的類型稱為子類型,而父類(或接口)定義的類型稱為父類型。因此,對7.6節(jié)中定義的Shape類和Circle類,就可以說Circle是Shape的子類型,Shape類是Circle的父類型。概述子類是它的父類的特殊化,每個子類的實例也都是它父類的實例,但反過來不成立。因此,子類對象和父類對象在一定條件下也可以相互轉(zhuǎn)換,這種類型轉(zhuǎn)換一般稱為對象轉(zhuǎn)換或造型(casting)。對象轉(zhuǎn)換也有自動轉(zhuǎn)換和強(qiáng)制轉(zhuǎn)換之分。對象轉(zhuǎn)換由于子類繼承了父類的數(shù)據(jù)和行為,因此子類對象可以作為父類對象使用,即子類對象可以自動轉(zhuǎn)換為父類對象??梢詫⒆宇愋偷囊觅x值給父類型的引用,也就是,在需要父類對象時,可以用子類對象替換,這也稱為里氏替換原則(Liskovsubstitutionprinciple,LSP)。假設(shè)parent是一個父類型引用,child是一個子類型(直接或間接)引用,則下面的賦值語句是合法的:parent=child;//子類對象自動轉(zhuǎn)換為父類對象對象轉(zhuǎn)換這種轉(zhuǎn)換稱為向上轉(zhuǎn)換(upcasting)。向上轉(zhuǎn)換指的是在類的層次結(jié)構(gòu)圖中,位于下方的類(或接口)對象都可以自動轉(zhuǎn)換為位于上方的類(或接口)對象,但這種轉(zhuǎn)換必須是直接或間接類(或接口)。6.1.1自動轉(zhuǎn)換(向上轉(zhuǎn)換):子類對象可以自動轉(zhuǎn)換為父類對象??梢詫⒆宇愋偷囊觅x值給父類型的引用。自動轉(zhuǎn)換:Employeeemp=newEmployee(“劉明”,30,5000);Personp=emp;PersonEmployeeObject自動轉(zhuǎn)換Objectobj=emp;對象轉(zhuǎn)換Java語言程序設(shè)計(第4版)
QQ群:2886394866.1.1強(qiáng)制轉(zhuǎn)換(向下造型):將父類對象強(qiáng)制轉(zhuǎn)換為子類對象。用“()”運(yùn)算符。將父類型的引用賦值給子類型的引用。強(qiáng)制轉(zhuǎn)換:Employeeemp=newEmployee(“劉明”,30,5000);Personp=emp;emp=(Employee)p;PersonEmployeeObject強(qiáng)制轉(zhuǎn)換強(qiáng)制轉(zhuǎn)換Java語言程序設(shè)計(第4版)
QQ群:288639486對象轉(zhuǎn)換6.1.1注意,不是任何情況下都可以進(jìn)行強(qiáng)制類型轉(zhuǎn)換,請看下面代碼:不正確的強(qiáng)制轉(zhuǎn)換:
Personp=newPerson();Employeeemp=(Employee)p;代碼編譯時沒有錯誤,但運(yùn)行時會拋出ClassCastException異常。PersonEmployeeObject強(qiáng)制轉(zhuǎn)換對象轉(zhuǎn)換Java語言程序設(shè)計(第4版)
QQ群:288639486instanceof運(yùn)算符用來測試一個實例是否是某種類型的實例,這里的類型可以是類、抽象類、接口等。instanceof運(yùn)算符的格式為:variableinstanceof
TypeName該表達(dá)式返回邏輯值。如果variable是TypeName類型或其父類型的實例,返回true,否則返回false。7.7.2instanceof運(yùn)算符設(shè)有Fruit(水果)類及它的兩個子類Apple(蘋果)和Orange(橘子),假設(shè)給出下面聲明:Fruitfruit=newApple();Orangeorange=newOrange();7.7.2instanceof運(yùn)算符表達(dá)式fruitinstanceofOrange的結(jié)果是false;表達(dá)式fruitinstanceofFruit的結(jié)果是true;表達(dá)式orangeinstanceofFruit的結(jié)果是true;表達(dá)式orangeinstanceofApple的結(jié)果是false。如果一個實例是某種類型的實例,那么該實例也是該類型的所有父類型的實例。表達(dá)式fruitinstanceofObject的結(jié)果也是true。7.7.2instanceof運(yùn)算符在Java14之前,instanceof主要是在類型轉(zhuǎn)換之前檢測對象的具體類型,然后執(zhí)行具體的強(qiáng)制轉(zhuǎn)換。從Java14開始,使用instanceof可以在判斷是否屬于具體的類型同時完成轉(zhuǎn)換,例如:Objectobj="這是一個字符串";if(obj
instanceofStringstr){
System.out.println(str.length());}多態(tài)(polymorphism)是指由繼承而產(chǎn)生的相關(guān)的不同的類,其對象對同一消息會做出不同的響應(yīng)。多態(tài)性是指在運(yùn)行時系統(tǒng)判斷應(yīng)該執(zhí)行對象哪個方法的代碼的能力。7.7.3多態(tài)與動態(tài)綁定將方法調(diào)用與方法體關(guān)聯(lián)起來稱方法綁定(binding)。若在程序執(zhí)行前進(jìn)行綁定,叫前期綁定,如C語言的函數(shù)調(diào)用都是前期綁定。若在程序運(yùn)行時根據(jù)對象的類型進(jìn)行綁定,則稱后期綁定或動態(tài)綁定。比如,當(dāng)調(diào)用實例方法時,變量的實際類型在運(yùn)行時決定使用方法的哪個實現(xiàn),這稱為動態(tài)綁定。Java中除static方法和final方法外都是動態(tài)綁定。對子類的一個實例,如果子類覆蓋了父類的方法,運(yùn)行時系統(tǒng)調(diào)用子類的方法,如果子類繼承了父類的方法,則運(yùn)行時系統(tǒng)調(diào)用父類的方法。7.7.3多態(tài)與動態(tài)綁定有了方法的動態(tài)綁定,就可以編寫只與基類交互的代碼,并且這些代碼對所有的子類都可以正確運(yùn)行。下面通過一個例子來說明多態(tài)和方法動態(tài)綁定。假設(shè)抽象類Shape定義了getArea()方法,其子類Circle、Rectangle都各自實現(xiàn)了getArea()方法。下面的程序演示了多態(tài)概念。
publicstaticdoublesumArea(Shape[]shapes){varsumArea=0.0;for(varshape:shapes){System.out.println(shape.getArea());//輸出實際類型的面積sumArea=sumArea+shape.getArea();
}returnsumArea;
}程序7.12PolymorphismDemo.java
publicstaticvoidmain(String[]args){vard=0.0;varshapes=newShape[5];for(vari=0;i<shapes.length;i++){d=Math.random();if(d>0.5){shapes[i]=newCircle(1);}else{shapes[i]=newRectangle(1,2);
}
}varsumArea=sumArea(shapes);System.out.printf("形狀的總面積=%.2f",sumArea);
}Java語言程序設(shè)計7.8案例:自定義類庫開發(fā)在Java應(yīng)用開發(fā)中通常需要開發(fā)自己的類庫,然后在應(yīng)用程序中使用。本例學(xué)習(xí)如何開發(fā)一個簡單的類庫,然后將它打包成.jar文件,并且在程序中使用它。要求定義一個名為com.boda.utils.MathUtils類,在該類中定義如下兩個靜態(tài)方法:自定義類庫的開發(fā)publicstaticboolean
isPrime(intn)publicstaticboolean
isPalindrome(intn)isPrime(intn)方法返回n是否是素數(shù),isPalindrome(intn)方法返回n是否是回文數(shù),如363是一個回文數(shù)。對于自定義類庫,按下面思路設(shè)計。(1)按要求編寫com.boda.utils.MathUtils類,其中定義兩個靜態(tài)方法isPrime(intn)和
isPalindrome(intn)。(2)將編譯好的類文件打包到.jar文件中。(3)在應(yīng)用程序中使用自定義類庫,需要添加.jar文件。自定義類庫的開發(fā)程序7.13是類庫的com.boda.utils.MathUtils類,該類定義了兩個靜態(tài)方法,其中isPrime()用于返回參數(shù)是否是素數(shù),isPalindrome()返回參數(shù)是否是回文數(shù)。
publicstaticbooleanisPrime(intn){//判斷素數(shù)
for(vardivisor=2;divisor*divisor<=n;divisor++){
if(n%divisor==0)
returnfalse;
}
returntrue;
}程序7.13MathUtils.java
publicstaticbooleanisPalindrome(intn){//判斷回文數(shù)
vars=String.valueOf(n);
varlow=0;
varheigh=s.length()-1;
while(low<heigh){if(s.charAt(low)!=s.charAt(heigh)){
returnfalse;//不是回文}low++;heigh--;}returntrue;
}要將上述類打包到.jar文件中還需創(chuàng)建一個主類和一個清單文件,程序7.13的MathUtils類中包含一個main()方法,所以可把它作為主類,否則就需單獨(dú)創(chuàng)建一個主類。自定義類庫的開發(fā)在項目src目錄中創(chuàng)建META-INF目錄,在其中創(chuàng)建一個名為MANIFEST.MF文件,它是清單文件,其中輸入下面3行內(nèi)容:Manifest-Version:1.0Main-Class:com.boda.utils.MathUtils
注意,冒號后面要留一個空格,最后一行是空行。在Eclipse中將項目打包到.jar文件很簡單。右擊項目名稱,選擇Export,在打開的對話框中選擇JARfile,然后指定JAR文件名和路徑,在下面的頁面中指定JAR的清單文件。選中Useexistingmanifestfromworkspace,單擊Browse按鈕,選擇創(chuàng)建的MANIFEST.MF清單文件自定義類庫的開發(fā)最后單擊Finish按鈕創(chuàng)建JAR文件。創(chuàng)建好的JAR文件就和Java的任何庫文件一樣可以發(fā)布和使用。要在應(yīng)用程序中使用JAR文件,需要將它作為外部JAR文件導(dǎo)入到項目中。在Eclipse中,右擊項目名稱,選擇BuildPath→AddExternalArchives,在打開的對話框中選擇JAR文件將其添加到項目中即可使用。運(yùn)行程序,輸出2-1000之間所有回文素數(shù)如圖7-7所示。自定義類庫的開發(fā)對于Java應(yīng)用程序,還可以采用上述方法將其打包成可執(zhí)行的JAR文件。右擊項目名稱,選擇Export,在打開的對話框中選擇RunnableJARfile,在之后的對話框中選擇啟動文件和打包文件路徑和文件名。假設(shè)為上述案例創(chuàng)建了可執(zhí)行JAR文件prime-palin.jar,它存放在D盤根目錄。要執(zhí)行這個可運(yùn)行的JAR文件,在命令提示符下使用帶-jar參數(shù)的java命令,命令及運(yùn)行結(jié)果如圖7-8所示。自定義類庫的開發(fā)6.1.1課堂討論及訓(xùn)練Java語言程序設(shè)計(第4版)
QQ群:2886394861.下面說法是否正確?(1)子類可以覆蓋父類中定義的私有方法。(2)子類可以覆蓋父類中定義的靜態(tài)方法。(3)子類可以繼承父類中構(gòu)造方法。6.1.1課堂討論及訓(xùn)練Java語言程序設(shè)計(第4版)2.如果子類中的一個方法具有和它父類中的方法完全相同的方法簽名,但參數(shù)類型不同,這是方法覆蓋還是方法重載?6.1.1課堂討論及訓(xùn)練Java語言程序設(shè)計(第4版)7.12有下列程序,試指出該程序的錯誤之處。classAA{AA(inta){System.out.println("a="+a);}}classBBextendsAA{BB(Strings){System.out.println("s="+s);}}publicclassConstructorDemo{publicstaticvoidmain(String[]args){BBb=newBB("hello");}}6.1.1編程作業(yè)Java語言程序設(shè)計(第4版)1.給定如圖所示的Animal類及其子類的繼承關(guān)系UML圖。編寫代碼實現(xiàn)這些類。6.1.1編程作業(yè)Java語言程序設(shè)計(第4版)
QQ群:2886394862.定義一個名為Cylinder類表示圓柱,它繼承Circle類(參見編程練習(xí)4.2),要求定義一個變量height表示圓柱高度。覆蓋getArea()方法求圓柱的表面積,定義getVolume()方法求圓柱體積。定義默認(rèn)構(gòu)造方法和帶radius和height兩個參數(shù)的構(gòu)造方法。
畫出Circle類和Cylinder類的UML圖,并實現(xiàn)這些類。
編寫測試程序,提示用戶輸入圓柱的底面圓的半徑和高度,程序創(chuàng)建一個圓柱對象,計算并輸出圓柱表面積和體積。Java語言程序設(shè)計第8章Java核心類庫
1java.lang.Object類23主要內(nèi)容Java語言程序設(shè)計(第4版)清華大學(xué)出版社2022java.lang.Math類java.lang.System類45基本類型包裝類案例:一個整數(shù)棧的實現(xiàn)6BigInteger和BigDecimal類7日期-時間API8案例:打印輸出年歷Java語言程序設(shè)計java.lang.Object類在編寫Java程序時,除了使用自己定義的類,還要大量使用Java標(biāo)準(zhǔn)類庫的類和第三方定義的類。本章重點介紹一些最常用的Java核心類庫的類,其中包括Object類,它是Java所有類的根類,Math類、System類以及基本類型包裝類和新的日期/時間API的有關(guān)類。概述Object類是Java語言中所有類的根類,它定義在java.lang包中。定義類時若沒有用extends指明繼承哪個類,編譯器自動加上extendsObject,也就是自動繼承Object類。因此,Java中所有的類都是Object類的直接或間接子類。Object類中共定義了9個方法,所有的類(包括數(shù)組)都繼承該類中的方法,這些方法如表8-1所示。方
法
說
明publicbooleanequals(Objectobj)比較調(diào)用對象是否與參數(shù)對象obj相等publicStringtoString()返回對象的字符串表示publicinthashCode()返回對象的哈希碼值protectedObjectclone()創(chuàng)建并返回對象的一個副本publicClass<?>getClass()返回對象所屬的完整類名protectedvoidfinalize()當(dāng)對象沒有引用時由垃圾回收器調(diào)用。該方法已廢棄publicvoidwait()publicvoidwait(longtimeout)publicvoidwait(longtimeout,int
nanos)使當(dāng)前線程進(jìn)入等待狀態(tài),直到另一個線程調(diào)用notify()或notifyAll()方法publicvoidnotify()publicvoidnotifyAll()通知等待該對象鎖的單個線程或所有線程繼續(xù)執(zhí)行toString()方法是Object類的一個重要方法,調(diào)用對象的toString()方法可以返回對象的字符串表示。該方法在Object類中的定義是返回類名加一個@符號,再加一個十六進(jìn)制整數(shù)。如果在Employee類中沒有覆蓋toString()方法,執(zhí)行下面的代碼:8.1.1toString()方法
var
emp=newEmployee("劉明",30,5000);
System.out.println(emp.toString());可能產(chǎn)生類似下面的輸出:com.boda.xy.Employee@1db9742通常在類中覆蓋toString()方法,使它返回一個有意義的字符串。例如,在Employee類中按如下覆蓋toString()方法:@OverridepublicStringtoString(){return"員工信息:"+name+""+age+""+salary;}8.1.1toString()方法這時,執(zhí)行語句:
System.out.println(emp.toString());輸出結(jié)果為:
員工信息:劉明305000.0實際上,還可以僅使用對象名輸出對象的字符串表示形式,而不用調(diào)用toString()方法,這時Java編譯器將自動調(diào)用toString()方法,例如,下面兩行等價。
System.out.println(emp);
System.out.println(emp.toString());在Java類庫中有許多類覆蓋了toString()方法,輸出時能夠得到可理解的結(jié)果,LocalDate類就是其一。8.1.1toString()方法equals()方法主要用來比較兩個對象是否相等,使用格式為:obj1.equals(obj2)上述表達(dá)式用來比較兩個對象obj1和obj2是否相等,若相等則返回true,否則返回false。但兩個對象比較的是什么呢?8.1.2equals()方法首先來看一下equals()方法在Object類中的定義:publicbooleanequals(Objectobj){return(this==obj);}由此可以看到,該方法比較的是兩個對象的引用,即相當(dāng)于兩個對象使用“==”號進(jìn)行比較。假設(shè)Employee類定義了id、name和salary成員變量,又假設(shè)我們要比較兩個
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度跨境電商主體變更與物流及客服人員勞動合同3篇
- 二零二五版海外農(nóng)業(yè)開發(fā)項目勞務(wù)輸出合同2篇
- 二零二五版股權(quán)回購項目擔(dān)保及投資風(fēng)險控制合同3篇
- 二零二五年教育培訓(xùn)機(jī)構(gòu)招生合同正本3篇
- 二零二五版辦公樓物業(yè)客戶關(guān)系管理與滿意度調(diào)查合同3篇
- 二零二五年度行政合同在社會保障體系中的構(gòu)建與實施2篇
- 二零二五年股東股權(quán)轉(zhuǎn)讓合同范本3篇
- 二零二五年度祠堂傳統(tǒng)節(jié)日慶典活動承包合同3篇
- 二零二五版企業(yè)間借款合同模板與債務(wù)轉(zhuǎn)讓協(xié)議標(biāo)準(zhǔn)范本6篇
- 二零二五年綠色能源板車租賃服務(wù)合同3篇
- 民宿建筑設(shè)計方案
- 干部基本信息審核認(rèn)定表
- 2023年11月外交學(xué)院(中國外交培訓(xùn)學(xué)院)2024年度公開招聘24名工作人員筆試歷年高頻考點-難、易錯點薈萃附答案帶詳解
- 春節(jié)行車安全常識普及
- 電機(jī)維護(hù)保養(yǎng)專題培訓(xùn)課件
- 汽車租賃行業(yè)利潤分析
- 春節(jié)拜年的由來習(xí)俗來歷故事
- 2021火災(zāi)高危單位消防安全評估導(dǎo)則
- 佛山市服務(wù)業(yè)發(fā)展五年規(guī)劃(2021-2025年)
- 房屋拆除工程監(jiān)理規(guī)劃
- 醫(yī)院保安服務(wù)方案(技術(shù)方案)
評論
0/150
提交評論