JAVA(面向?qū)ο蠡A(chǔ)部分).ppt_第1頁
JAVA(面向?qū)ο蠡A(chǔ)部分).ppt_第2頁
JAVA(面向?qū)ο蠡A(chǔ)部分).ppt_第3頁
JAVA(面向?qū)ο蠡A(chǔ)部分).ppt_第4頁
JAVA(面向?qū)ο蠡A(chǔ)部分).ppt_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第五章 面向?qū)ο蠡A(chǔ),Java程序設(shè)計(jì), ,路 強(qiáng),Chapter5 面向?qū)ο蠡A(chǔ),本章學(xué)習(xí)提示,本章我們主要學(xué)習(xí)面向?qū)ο缶幊痰幕靖拍睢?封裝、繼承、多態(tài) 訪問控制符的使用 Static 和 final 的使用,Chapter5 面向?qū)ο蠡A(chǔ),目 錄,Chapter5 面向?qū)ο蠡A(chǔ),OOP語言,面向?qū)ο蟪绦蛟O(shè)計(jì)(OOP Object-Orienten Programming) 是現(xiàn)今程序設(shè)計(jì)的主流和流行趨勢。在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,將所有事物都作為對象來處理. OOP的基本思想是把人們對現(xiàn)實(shí)世界的認(rèn)識過程應(yīng)用到程序設(shè)計(jì)中?,F(xiàn)實(shí)世界的物體就是對象,它有兩個(gè)基本特點(diǎn)一個(gè)是物體的內(nèi)部構(gòu)成,另一個(gè)是物體的行為. OOP與現(xiàn)實(shí)對象兩個(gè)基本特點(diǎn)相對應(yīng)的是數(shù)據(jù)和方法。 數(shù)據(jù)表示對象的構(gòu)成,方法表示對象的行為.,Chapter5 面向?qū)ο蠡A(chǔ),類的概念,類是對象的“模板”,對象是類的實(shí)例. 類與對象之間的關(guān)系可以看成是抽象與具體的關(guān)系。 其中類是抽象的,對象是具體的 類描述了對象的屬性和行為 對象是類的一個(gè)實(shí)例 在JAVA語言中,所有的東西都是對象,對象就如同是一種新型變量,通過賦值語句對該變量進(jìn)行性初始化操作. 比如,當(dāng)設(shè)計(jì)燈泡的時(shí)候要求每一個(gè)燈泡都必須具有型號這個(gè)屬性,同時(shí)還要能夠進(jìn)行打開、關(guān)閉等操作 因此當(dāng)把燈泡這些共同的屬一生和行為集中起來的時(shí)候就抽象出一個(gè)燈泡類 每一個(gè)具有這些屬性和行為的,具體的燈泡就是這個(gè)燈泡類的對象或者稱為實(shí)例,Chapter5 面向?qū)ο蠡A(chǔ),面向?qū)ο蟮乃拇筇匦?抽象 (Abstraction) 封裝 (Encapsulation) 繼承 (Inheritance) 多態(tài) (Polymorphism),Chapter5 面向?qū)ο蠡A(chǔ),面向?qū)ο蟮幕咎卣?封裝性: 基本思想: 把客觀世界中聯(lián)系緊密的元素及其相關(guān)操作組織在一起,使其相互作用隱藏、封裝在內(nèi)部,而對外部對象只提供單一的功能接口. 目的:將對象的使用者和設(shè)計(jì)者分開。 類比:汽車的左轉(zhuǎn)、右轉(zhuǎn);被陶瓷封裝的集成芯片,Chapter5 面向?qū)ο蠡A(chǔ),繼承性,繼承是OOP中一種由已有的類創(chuàng)建新類的機(jī)制。 一個(gè)父類(公共屬性的集合)可以有多個(gè)子類(是父類的特殊化),一個(gè)子類只可以有一個(gè)父類 子類可以直接使用父類的方法,也可以根據(jù)需要修改父類中已經(jīng)定義的方法(即不改變方法名,而修改方法的參數(shù)個(gè)數(shù)、參數(shù)類型)。 父類和子類可有同名的方法(多態(tài)性)。,Chapter5 面向?qū)ο蠡A(chǔ),多態(tài)性,定義:由于父類和子類可以有同名的方法,在運(yùn)行時(shí) JVM根據(jù)方法的參數(shù)個(gè)數(shù)和類型的不同來查找、決 定執(zhí)行哪個(gè)版本的方法,稱為多態(tài)性. 在程序執(zhí)行時(shí),JVM對對象某一方法的查找是從該對象類所在層次開始,沿類等級逐級向上進(jìn)行,把第一個(gè)方法作為所要執(zhí)行的方法。所以,子類的方法可以屏蔽父類的方法.,Chapter5 面向?qū)ο蠡A(chǔ),面向?qū)ο蟪绦蛟O(shè)計(jì)方法,面向?qū)ο蟪绦蛟O(shè)計(jì)方法是: 對象 = (算法 + 數(shù)據(jù)結(jié)構(gòu)) 程序 = (對象 + 對象 + ) 算法與數(shù)據(jù)結(jié)構(gòu)是一個(gè)整體,算法離不開數(shù)據(jù)結(jié)構(gòu),算法只能適用于特定的數(shù)據(jù)結(jié)構(gòu)。 面向?qū)ο笾?,算法與數(shù)據(jù)結(jié)構(gòu)被捆綁成一個(gè)類 OOA - OOD - OOI,Chapter5 面向?qū)ο蠡A(chǔ),目 錄,Chapter5 面向?qū)ο蠡A(chǔ),數(shù)據(jù)存在哪里,對程序運(yùn)行時(shí)各部分是如何展開的一一特別是內(nèi)存是 如何分配的,作一個(gè)直觀的描述還是很有必要的. 數(shù)據(jù)可以存儲在以下六個(gè)地方: 寄存器 棧 堆 靜態(tài)存儲 固定存儲 非內(nèi)存的存儲,Chapter5 面向?qū)ο蠡A(chǔ),數(shù)據(jù)存在哪里 - 1,寄存器 這是反應(yīng)最快的存儲,因?yàn)樗幬恢貌煌禾幚砥骼? 由于寄存器的數(shù)最非常有限,是由編譯器分配的. 非但不能直接控制寄存器,甚至連它存在的證據(jù)也找不到. 棧 位于“常規(guī)內(nèi)存區(qū)“里,處理器可以通過棧指針(stack pointer)對它進(jìn)行直接訪問. 棧指針下移就創(chuàng)建新的存儲空間,向上移就釋放內(nèi)存空間. 僅次于寄存器的最快、最有效率的分配內(nèi)存的方法. 由于Java 編譯器必須生成能控制棧指針移動(dòng)的代碼,所以程序編譯的時(shí)候,那些將被存儲在棧中的數(shù)據(jù)的大小和生命周期必須是已知的. 使程序的靈活性受到了限制,所以盡管Java把某些數(shù)據(jù)-特別是對象的“引用“reference存放在棧里,但對象本身并沒有放在棧里.,Chapter5 面向?qū)ο蠡A(chǔ),數(shù)據(jù)存在哪里 - 2,堆 是 “多用途的內(nèi)存池”(也在內(nèi)存里面),所有Java對象都保存在這里. 堆的優(yōu)點(diǎn):分配空間的時(shí)候,編譯器無需知道該分配多少空間,或者這些數(shù)據(jù)會在堆里呆多長時(shí)間.因此使用堆的空間會比較靈活. 只要想創(chuàng)建對象,用new就行了,程序執(zhí)行的時(shí)候自會在堆里分配空間. 堆的缺點(diǎn):當(dāng)然得為這種靈活性付出代價(jià),分配堆的存儲空間要比分配棧的慢一些(假如能像C+那樣在棧里創(chuàng)建對象). 靜態(tài)存儲 “靜態(tài)”在這里的意思就是“在固定的位置”( 還是在RAM中)。 靜態(tài)存儲中的數(shù)據(jù)在整個(gè)程序的運(yùn)行期間都能訪問到。 可以用static關(guān)鍵詞說明對象中的某個(gè)元索是靜態(tài)的,但是Java對象本身是決不會放到靜態(tài)存儲中去的.,Chapter5 面向?qū)ο蠡A(chǔ),數(shù)據(jù)存在哪里 - 3,固定存儲 常量值通常直接放在程序里,這樣它們就不會被改動(dòng),因而也更安全. 非內(nèi)存的存儲 如果數(shù)據(jù)完全獨(dú)立于程序,那么即使程序不運(yùn)行,它也應(yīng)該也還在;即使程序失去了對數(shù)據(jù)的控制,它也仍然還在. 兩個(gè)最主要的例子是“流對象(streamed object)“和“持久化對象(persistent object)“.,Chapter5 面向?qū)ο蠡A(chǔ),類的定義,類定義的格式: 類修飾符 class 類名 extends 父類名 implements 接口名 成員變量定義; 方法定義; ,定義類的結(jié)構(gòu)包含有類說明 和類的實(shí)體兩部分。類的說明部分由關(guān)鍵字class與類名組成;類體包括變量的說明、方法的定義與實(shí)現(xiàn)兩個(gè)部分。,類名的第一個(gè)字母要大寫。 類體要用花括號 括起來。,創(chuàng)建類對象一般形式: 類名 對象變量=new 類名(參數(shù)1,參數(shù)2,); 或者 類名 對象變量; 對象變量=new 類名(參數(shù)1,參數(shù)2,);,Chapter5 面向?qū)ο蠡A(chǔ),類的定義,/創(chuàng)建一個(gè)新人物 class People private String name, address; public void setInfo(String newname, String newaddress) name = newname; address = newaddress; public String toString() return “+ name + “, “ + address + “; public class ch05_01_People public static void main(String args) People someguy=new People(); someguy. setInfo( “佐助“, “火影村“ ); System.out.println(someguy.toString(); ,Chapter5 面向?qū)ο蠡A(chǔ),聲明對象時(shí)的內(nèi)存模型,當(dāng)用People類聲明一個(gè)對象someguy: People someguy = new People(); 內(nèi)存模型 僅建立了“someguy”對象的引用(reference) 尚未真正分配內(nèi)存空間,Chapter5 面向?qū)ο蠡A(chǔ),對象分配內(nèi)存后的內(nèi)存模型,當(dāng)系統(tǒng)見到 someguy. setInfo( “佐助“, “火影村“ ); 做兩件事: 為x和y成員變量分配內(nèi)存,即類的所有成員變量被分配內(nèi)存空間,然后執(zhí)行構(gòu)造方法中的語句. new運(yùn)算符在為name和address成員變量分配內(nèi)存后,將返回一個(gè)引用 給對象 someguy 。,Chapter5 面向?qū)ο蠡A(chǔ),對象的初始化和構(gòu)造方法,構(gòu)造方法是一個(gè)類方法中方法名與類名相同的類方法, 它的作用是當(dāng)使用new關(guān)鍵字創(chuàng)建一個(gè)對象時(shí),自動(dòng) 調(diào)用并對新建對象進(jìn)行初始化操作. 構(gòu)造方法的特點(diǎn) 構(gòu)造方法與類名相同 構(gòu)造方法沒有返回值,不定義返回類型 構(gòu)造方法可以重載,針對參數(shù)數(shù)量和類型定義多個(gè)同名構(gòu)造方法 構(gòu)造方法可以繼承,子類可以繼承父類的構(gòu)造方法 構(gòu)造方法不能由編程人員顯式地直接調(diào)用,它是在對象創(chuàng)建時(shí) 由new運(yùn)算符自動(dòng)調(diào)用的 構(gòu)造方法只用來對類實(shí)例進(jìn)行初始化,目的在于簡化初始化操作 在Java中,對象的創(chuàng)建和初始化是統(tǒng)一的兩者缺一不可,Chapter5 面向?qū)ο蠡A(chǔ),構(gòu)造方法構(gòu)造方法的作用,構(gòu)造方法的作用 對象初始化 引入更多的靈活度(變量賦值或更復(fù)雜的操作) 類中可以不定義構(gòu)造方法 每個(gè)類都至少有一個(gè)構(gòu)造方法,如果程序員沒有為類定義構(gòu)造方法,系統(tǒng)會自動(dòng)為該類生成一個(gè)默認(rèn)的構(gòu)造方法。 默認(rèn)構(gòu)造方法的名字與類名相同,它的參數(shù)列表和方法體均為空,自動(dòng)將所有實(shí)例變量初始化為默認(rèn)值 (數(shù)值型為0,布爾型為false,字符型為u0000,對象型為null ). 一旦定義了自己的構(gòu)造方法,默認(rèn)構(gòu)造方法將不再起作用.,Chapter5 面向?qū)ο蠡A(chǔ),Code,/如何將沒有設(shè)計(jì)構(gòu)造器的類添加構(gòu)造器 / 研究帶有構(gòu)造器的類與沒有構(gòu)造器的類之間的區(qū)別 class Student /定義 Student 類 static long sum=0; String name; String address; String grade; static int score; public static long collect() /定義類的方法 sum+=score; return sum; public void setInfo(String x1,String x2,String x3) name=x1; address=x2; grade=x3; public void setScore(int y) score=y; public class ch05_04_Student public static void main(String args ) Student zhang=new Student(); /創(chuàng)建Student類的對象 zhang. setInfo (“張三”, “屯溪路”, “計(jì)算機(jī)學(xué)院“); zhang.setScore(90); zhang.collect(); Student wang=new Student(); /創(chuàng)建Student類的對象 wang. setInfo (“王五“, “屯溪路“, “計(jì)算機(jī)學(xué)院 “); wang.setScore(85); System.out.println (+zhang.address+zhang.grade); System.out.println (+wang.address+wang.grade); System.out.println ( “總成績是 “+wang.collect( ); ,Chapter5 面向?qū)ο蠡A(chǔ),Code,/采用構(gòu)造方法實(shí)現(xiàn)上述功能,研究帶有構(gòu)造器的類與沒有構(gòu)造器的類之間的區(qū)別 class Student static long sum=0; String name; String address; String grade; static int score; public static long collect() /定義類的方法 sum+=score; return sum; Student (String x1, String x2, String x3, int y) name=x1; address=x2; grade=x3; score=y; public class ch05_05_Student public static void main(String args ) Student zhang; zhang=new Student(“張三“,“屯溪路“, “計(jì)算機(jī)學(xué)院“,90); zhang.collect(); Student wang=new Student (“李四“,“屯溪路“, “計(jì)算機(jī)學(xué)院“,85); System.out.println( + zhang.address + zhang.grade); System.out.println( + wang.address + wang.grade); System.out.println( “ 總成績是 “+ wang.collect(); ,Chapter5 面向?qū)ο蠡A(chǔ),目 錄,Chapter5 面向?qū)ο蠡A(chǔ),訪問控制符,允許庫創(chuàng)建者聲明哪些東西是客戶程序員可以使用的,哪些是不可使用的。這種訪問控制的級別在“最大訪問”和“最小訪問”的范圍之間. 分別包括:public,默認(rèn)(無關(guān)鍵字),protected以及private。下面的列表說明訪問控制修飾符含義:,Chapter5 面向?qū)ο蠡A(chǔ),公共訪問控制符public,無論是類或者類成員,只要被聲明成public, 就意味著它可以被從任何地方訪問. 一個(gè)類作為整體對程序的其他部分可見,并不能代表類內(nèi)的所有屬性和方法也同時(shí)對程序的其他部分可見,前者只是后者的必要條件,類的屬性和方法能否為所有其他類所訪問,還要看這些屬性和方法自己的訪問控制符. 實(shí)例變量采用public關(guān)鍵字,這是一種非常糟糕的做法,破壞封裝.,Chapter5 面向?qū)ο蠡A(chǔ),默認(rèn)訪問控制符,假如類或者類成員不含有一個(gè)明確的訪問說明,說明它具有默認(rèn)的訪問控制特性。 默認(rèn)的訪問控制權(quán)規(guī)定類或者類成員只能被同一個(gè)包中的其他代碼所訪問,在包外不可見。這種訪問特性稱為包訪問性。 Java語言中的包是類和接口的集合,它從更高級別上提供了對類和接口的存取保護(hù)和命名空間管理。,Chapter5 面向?qū)ο蠡A(chǔ),私有訪問控制符private,用private修飾的類成員只能被該類中的其他成員所訪問,在該類外不可見. 例如,在Point2D類中有兩個(gè)變量,它們被定義成以下形式: private double x; private double y; private(私有的)關(guān)鍵字用來確??梢栽L問這些實(shí)例變量的只能是Point2D類本身的方法。 在大多數(shù)實(shí)際應(yīng)用的類中,有必要僅僅允許通過方法來對數(shù)據(jù)進(jìn)行操作,維護(hù)封裝.,Chapter5 面向?qū)ο蠡A(chǔ),保護(hù)訪問控制符protected,用protected修飾的類成員不但對于同一個(gè)包中 的其他類是可見的,而且對于其他包中該類的子類也是可見的。 Protected 僅用于繼承情況中。,Chapter5 面向?qū)ο蠡A(chǔ),目 錄,Chapter5 面向?qū)ο蠡A(chǔ),static & final,static 修飾的成員變量為靜態(tài)變量 static 修飾的方法為靜態(tài)方法,被static修飾的成員變量成為靜態(tài)變量,保存在內(nèi)存區(qū)的公共存儲單元中,而不是保存在某個(gè)對象的內(nèi)存區(qū)中。任何一個(gè)類對象在訪問它時(shí)都會得到相同的數(shù)值。 如果某一個(gè)類對象對它進(jìn)行了修改,所有對象的此成員變量也都做了修改。靜態(tài)方法屬整個(gè)類,不用進(jìn)行實(shí)例化操作,使用時(shí)方法前加類名而不是對象名。,final 修飾的變量為最終成員變量 final 修飾的方法為最終方法,最終成員變量一般是在聲明時(shí)進(jìn)行初始化,一旦最終成員變量被賦值,則它在整個(gè)程序執(zhí)行過程中不能改變。 當(dāng)聲明常量時(shí),可以使用final 加上類型和常量名 最終方法不能被重復(fù)定義或更改方法的內(nèi)容,不能被重載,Chapter5 面向?qū)ο蠡A(chǔ),Code - static成員變量,/ 定義一個(gè)學(xué)生檔案類,包括學(xué)生姓名、性別和所在學(xué)校 / 使用static修飾成員變量 class Student String name; String sex; static String school=“合肥工業(yè)大學(xué)“; public class ch05_06_Student public static void main(String args) Student me=new Student(); Student you=new Student(); =“李明 “; me.sex=“男 “; =“張敏 “; you.sex=“女“; /對類成員變量賦值 Student.school=“安徽大學(xué)“; System.out.println(+“ “+me.sex+“ “+me.school); System.out.println(+“ “+you.sex+“ “+you.school); ,Chapter5 面向?qū)ο蠡A(chǔ),Code - final成員變量,/定義類及其方法,引用此方法時(shí) /通過final實(shí)參對類進(jìn)行初始化操作 class Calculate private double r; final double PI=3.14159; void area(double r) double x; x=PI*r*r; System.out.println(“Area=“ + x); public class ch05_07_Calculate public static void main(String args) Calculate dd = new Calculate(); dd.area(12.3); ,Chapter5 面向?qū)ο蠡A(chǔ),Code - static方法,static修飾的方法稱為靜態(tài)方法或成為類方法, 屬于整個(gè)類,在任何地方都可以使用, 而不必對類進(jìn)行實(shí)例化操作 /如何引用類方法 /注意本程序需要從命令行輸入兩個(gè)整型參數(shù) public class ch05_08_Sta_method int width, height; public static double area(int width,int height) return width*height; public static void main(String args) int i,j; double f; i=Integer.parseInt(args0); j=Integer.parseInt(args1); f= ch05_08_Sta_method.area(i,j); System.out.println(“Area= “+i+“*“+j+“ = “+f); ,Chapter5 面向?qū)ο蠡A(chǔ),Code - final方法,使用final修飾的方法被稱為最終方法,不能被更改, 也不能被當(dāng)前類的子類重載 / 定義Final類及其最終方法并引用此方法 / 注意本程序需要從命令行輸入兩個(gè)整型參數(shù) public class ch05_09_Fin_method int width,height; public static final double area(int width,int height) return width*height; public static void main(String args) int i,j; double f; i=Integer.parseInt(args0); j=Integer.parseInt(args1); f=ch05_09_Fin_method.area(i,j); System.out.println(“ Area= “+f ); ,Chapter5 面向?qū)ο蠡A(chǔ),目 錄,Ch

溫馨提示

  • 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

提交評論