第3章類與對象_第1頁
第3章類與對象_第2頁
第3章類與對象_第3頁
第3章類與對象_第4頁
第3章類與對象_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第3章 類與對象Java基礎(chǔ)本章主要內(nèi)容本章主要內(nèi)容n面向?qū)ο蟪绦蛟O(shè)計n類n對象n方法n關(guān)鍵字thisn關(guān)鍵字staticn包n訪問控制第3章 類與對象 為了加快軟件的開發(fā)步伐、縮短軟件開發(fā)生命周期,面向?qū)ο缶幊碳夹g(shù)應(yīng)運而生。Java語言是一種面向?qū)ο蟮木幊陶Z言,面向?qū)ο蟮某绦蛟O(shè)計以類和對象為基礎(chǔ)。第三章和第四章,將從類和對象入手,詳細介紹Java的面向?qū)ο蟪绦蛟O(shè)計。本章將介紹面向?qū)ο蟮幕靖拍?、定義類、構(gòu)造對象等。 面向?qū)ο蟮木幊趟枷肓D使在計算機語言中對事物的描述與現(xiàn)實世界中該事物的描述盡可能的一致,類(class)和對象(object)就是面向?qū)ο蠓椒ǖ暮诵母拍睢?對象是實際存在的事物個

2、體,也稱實例對象是實際存在的事物個體,也稱實例(instance); 類是對某一類事物的描述,是抽象的、概念上的定義;類是對某一類事物的描述,是抽象的、概念上的定義; 例如,現(xiàn)實中,“人”是一個抽象的、廣義的概念,可以用一個類來表示,但是對于“某個具體的人”,如小明、小紅就是一個客觀實際存在的個體,就是一個對象。3.1.1 面向?qū)ο?.1.2 面向?qū)ο蟮奶攸cn封裝性n繼承性n多態(tài)性3.2.1 類的定義 類是對一組具有相同特性(屬性)和相同行為(方法)的事物的概括。類代表的是總體,而不代表某個特定的個體。 例如,人具有的常見相同特征有:姓名、年齡、性別、身高和體重等信息。對于每一個具體的人來說,

3、每個特征都具有自己具體的數(shù)值,而類代表的是總體特征,它只描述特征的類型和結(jié)構(gòu),不指定具體的數(shù)值。 除了相同特性的描述,還包括這個類具有的共同行為。例如,“人”這個類,可以包含的共同行為有:說話、走路、吃和睡覺。3.2.2類的實現(xiàn)類是組成類是組成Java程序的基本要素,類由類頭和類體兩部分組成。程序的基本要素,類由類頭和類體兩部分組成。Java類語法格式如下:類語法格式如下:訪問控制符 修飾符 class 類名 類頭 /類體開始標志 類的成員變量說明 /成員變量定義及初始化 類的構(gòu)造方法定義 /構(gòu)造方法定義 類的成員方法定義 /方法定義 /類體結(jié)束標志類體3.2.2 類的實現(xiàn)【例3.1】Java

4、語言“人”類簡單示例。public class Person / 類名稱的單詞首字母必須大寫 String name ; / 定義一個成員變量:姓名 int age ; / 定義一個成員變量:年齡 public void speak( ) / 定義一個成員方法 System.out.println(姓名: + name + ,年齡: + age) ;3.2.3成員變量成員變量,即屬性,用來定義該類事物的特性。成員變量,即屬性,用來定義該類事物的特性。定義成員變量的一般格式如下:定義成員變量的一般格式如下:訪問控制符 修飾符 數(shù)據(jù)類型 成員變量名=初始值; 類的成員變量在類體內(nèi)并在方法的外邊聲明

5、,一般常放在類體的開始部分。聲明“人”類的成員變量姓名和年齡,如:class Person String name ; / 定義一個成員變量:姓名 int age ; / 定義一個成員變量:年齡 3.2.4成員方法成員方法,即行為,用來實現(xiàn)事物的行為,由方法聲明和方法體(操作代成員方法,即行為,用來實現(xiàn)事物的行為,由方法聲明和方法體(操作代碼)兩部分組成。碼)兩部分組成。定義成員方法的一般格式如下:定義成員方法的一般格式如下:訪問控制符 修飾符 返回值類型 方法名(形式參數(shù)表) 方法聲明 變量聲明 /方法內(nèi)用的變量,局部變量 程序代碼 /方法的主體代碼 return 表達式 /返回語句3.2.

6、4成員方法Person類中加入設(shè)置和獲取名字及年齡、列出輸出所有屬性值的方法如:public class Person . void setName(String n) /設(shè)置姓名 name = n; String getName() /獲取姓名 return name; void setAge(int i) /設(shè)置年齡 age = i; int getAge() /獲得年齡 return age; void show() /輸出姓名和年齡System.out.println(This persons name is +name);System.out.println(This persons

7、 age is +age); . 3.2.4成員方法 Java本身也提供了豐富的方法,給編程帶來很大方便。我們不必知道這些方法的程序細節(jié),可以執(zhí)行常見的數(shù)學(xué)運算、字符串運算、輸入和輸出操作等。如:a=Math.sqrt(0.16); /計算0.16的平方根 3.3對象3.3.1對象的定義 對象是實際存在的類事物的個體,也稱為實例(instance)。程序中的對象是類的一個實例,是一個軟件單元,它由一組結(jié)構(gòu)化的數(shù)據(jù)和在其上的一組操作構(gòu)成。如:a=Math.sqrt(0.16); /計算0.16的平方根提示:類和對象的關(guān)系。提示:類和對象的關(guān)系。類可理解為一種新的數(shù)據(jù)類型,一旦聲明后,就可以用它來

8、創(chuàng)建對象(實例)。類是對象的模版,對象是類的實例。 3.3.2 對象的創(chuàng)建和使用 一個類定義完成之后要想使用肯定得依靠對象,創(chuàng)建一個新對象的語法是使用new關(guān)鍵字來調(diào)用類的構(gòu)造器。對象創(chuàng)建格式:對象創(chuàng)建格式:類名稱 對象名稱 = new 類名稱(參數(shù)值列表) ; 參數(shù)值列表用來初始化對象的成員變量,可以為空。也可以細分為以下聲明對象和實例化對象兩步:類名稱 對象名稱 = null; /聲明對象對象名稱 = new 類名稱(參數(shù)值列表) ; /實例化對象 3.3.2 對象的創(chuàng)建和使用 對象的使用包括引用對象的成員變量和方法兩方面,通過運算符 可以實現(xiàn)對屬性的訪問和方法的調(diào)用。對象引用屬性和調(diào)用方

9、法格式:對象引用屬性和調(diào)用方法格式:對象名稱.成員變量名; /引用成員變量對象名稱.成員方法名(實際參數(shù)表); /調(diào)用對象成員方法 【例3.2】建立對象“小明”和調(diào)用對象的成員方法示例。/ ObjectDemo.javaclass Person String name ; int age ; Person() Person(String n, int a) name=n; age=a; void speak( ) / 定義方法System.out.println(“姓名:” + name + “,年齡:” + age) ; void updateAge(int a) / 定義方法age=a;

10、class ObjectDemo public static void main(String args) Person xiaoming = new Person(小明,13) ; /創(chuàng)建對象xiaoming xiaoming.speak() ; / 調(diào)用speak方法 System.out.println(修改年齡:) ; int newAge = 15; xiaoming.updateAge(newAge); / 調(diào)用updateAge方法 xiaoming.speak(); / 調(diào)用speak方法 3.3.2 對象的創(chuàng)建和使用對象小明的創(chuàng)建,也可細分為聲明對象和實例化對象兩步,如:Pe

11、rson xiaoming = null ; /聲明對象xiaoming = new Person(小明,13) ; /實例化對象 3.3.2 對象的創(chuàng)建和使用 在例3.2中實例化了一個對象xiaoming,在實例化對象的過程中需要在內(nèi)存中開辟空間,具體的內(nèi)存分配過程如圖3-2所示。 Java 內(nèi)存機制中存在兩種內(nèi)存,一種是棧內(nèi)存,另一種是堆內(nèi)存。基本類型的變量和對象引用(即對象的名稱)都是棧內(nèi)存中分配,當(dāng)在一段代碼塊定義一個變量時,Java 就在棧中為這個變量分配內(nèi)存空間,當(dāng)變量所在的代碼塊運行結(jié)束,Java 會自動釋放掉為該變量分配的內(nèi)存空間,該內(nèi)存空間可以立即被另作它用。堆內(nèi)存用來存放由

12、 new 創(chuàng)建的對象,在堆中分配的內(nèi)存,由 Java 虛擬機的自動垃圾回收器來管理。 3.3.2 對象的創(chuàng)建和使用圖圖3-2 對象的實例化過程對象的實例化過程3.3.2 對象的創(chuàng)建和使用若又有:Person xiaoming2 = null ; xiaoming2 = xiaoming; /復(fù)制 圖圖3-2 對象的復(fù)制對象的復(fù)制 在Java中,程序員不需要考慮跟蹤每個生成的對象,系統(tǒng)采用了自動垃圾收集的內(nèi)存管理方式。運行時系統(tǒng)通過垃圾收集器周期性地清除無用對象并釋放它們所占的內(nèi)存空間。 垃圾收集器作為系統(tǒng)的一個線程運行,當(dāng)內(nèi)存不夠用時或當(dāng)程序中調(diào)用了System.gc()方法要求垃圾收集時,垃

13、圾收集器便于系統(tǒng)同步運行開始工作。在系統(tǒng)空閑時,垃圾收集器和系統(tǒng)異步工作。 事實上,在類中都提供了一個撤銷對象的方法finalize(),但并不提倡使用該方法。若在程序中確實希望清除某對象并釋放它所占的存儲空間時,只須將空引用(null)賦給它即可。 3.3.3對象的回收 Java只有一種參數(shù)傳遞方式,即按值傳遞。如果傳入方法的是基本類型的數(shù)據(jù),方法聲明的形參得到的是基本類型數(shù)據(jù)的一份拷貝。如果當(dāng)引用語句中的實參是對象或數(shù)組時,那么被引用的方法聲明的形參得到的是對象引用的拷貝,即實參和形參指向同一對象。方法的參數(shù)傳遞具體見例3.3所示。 3.4方法參數(shù)傳遞3.4.1方法參數(shù)傳遞【例3.3】方法

14、參數(shù)傳遞示例。/MethodParaDemo.javapublic class MethodParaDemo int i = 50; void method1(int a) /參數(shù)為基本類型的方法a *= 2 ; void method2(MethodParaDemo o) /參數(shù)為引用類型的方法o.i *= 2; public static void main(String args)MethodParaDemo mp = new MethodParaDemo();int temp = 100;mp.method1(temp); /基本類型數(shù)據(jù)的拷貝System.out.println(te

15、mp); mp.method2(mp); /對象引用的拷貝System.out.println(mp.i); 3.4.1方法參數(shù)傳遞 所謂方法的重載(Overloading)就是指在一個類中兩個或更多的方法擁有相同的方法名,但是形參列表各不相同。 在編寫重載方法時,應(yīng)該注意以下兩點: (1) 方法的返回值類型對方法的簽名沒有影響,即返回值類型不能用于區(qū)分方法,因為方法可以沒有返回值。 (2) 重載方法之間是以所帶參數(shù)的個數(shù)及相應(yīng)參數(shù)的數(shù)據(jù)類型來區(qū)分的。 3.4.2方法的重載 【例3.4】方法的重載。/OverloadDemo.javaclass Person String name; Stri

16、ng sex; void printPerson() name = Xiaoli; System.out.println(name=+name); /輸出姓名 void printPerson(String str) /方法重載接受姓名參數(shù) name = str; sex= male; System.out.println(name=+name+ sex=+male); /輸出姓名和性別 void printPerson(String str, String n) /方法重載接受姓名和性別參數(shù) name = str; sex=n; System.out.println(name=+name+

17、sex=+sex); /輸出姓名和性別 boolean printPerson(String str, int a)/方法重載接受姓名和年齡參數(shù) name = str; int age=a; System.out.println(“name=”+name+“ age=”+age); /輸出姓名和年齡 return true; public static void main(String args ) Person p = new Person();/創(chuàng)建Person類的對象實例/對象調(diào)用類的各成員實例方法并傳遞實參給接受的形參實現(xiàn)方法的重載 p.printPerson( ); /調(diào)用第一個pr

18、intPerson方法 p.printPerson(“Xiaoming”); /調(diào)用第二個printPerson方法 p.printPerson(“Xiaohong” , “female”); /調(diào)用第三個printPerson方法 p.printPerson(“XiaoWang”, 22 ); /調(diào)用第四個printPerson方法 構(gòu)造方法(Constructor)是一種特殊的方法,在創(chuàng)建對象時被調(diào)用,也稱為構(gòu)造函數(shù)。Java中的每個類都有構(gòu)造方法,在創(chuàng)建對象時用來初始化新對象。在例3.2中提取出以下代碼:class Person String name ; int age ; publi

19、c Person(String name,int age) /構(gòu)造函數(shù) =name; this.age=age; 3.4.3 構(gòu)造方法 關(guān)于這個Person方法,有幾點不同于一般方法的特征:(1) 它具有與類相同的名稱;(2) 方法聲明中未定義返回值類型;(3) 在方法中沒用return語句返回一個值。在一個類中,具有上述特征的方法就是“構(gòu)造方法”。 3.4.3 構(gòu)造方法n 缺省構(gòu)造方法 如果程序員沒有在一個類里定義構(gòu)造方法,系統(tǒng)會自動為這個類產(chǎn)生一個默認的構(gòu)造方法,這個默認構(gòu)造方法沒有參數(shù),在其方法體中也沒有任何代碼,即什么也不做。class Person String n

20、ame ; int age ; public void speak( ) System.out.println(使用了缺省的構(gòu)造方法) ; public class ConstructorDemo public static void main(String args)Person p = new Person() ; p.speak() ; 3.4.3 構(gòu)造方法n 構(gòu)造方法的重載 如果程序員沒有在一個類里定義構(gòu)造方法,系統(tǒng)會自動為這個類產(chǎn)生一個默認的構(gòu)造方法,這個默認構(gòu)造方法沒有參數(shù),在其方法體中也沒有任何代碼,即什么也不做。class Person String name ; int ag

21、e ; public void speak( ) System.out.println(使用了缺省的構(gòu)造方法) ; public class ConstructorDemo public static void main(String args)Person p = new Person() ; p.speak() ; 3.4.3 構(gòu)造方法n 構(gòu)造方法的重載class Person String name = null; int age = -1; public Person() System.out.println(構(gòu)造函數(shù)1被調(diào)用!) ; Person(String n) name=n;S

22、ystem.out.println(構(gòu)造函數(shù)2被調(diào)用!) ; Person(int a) age=a;System.out.println(構(gòu)造函數(shù)3被調(diào)用!) ; Person(String n, int a) name=n; age=a;System.out.println(構(gòu)造函數(shù)4被調(diào)用!) ; void speak( ) 3.4.3 構(gòu)造方法n 構(gòu)造方法的重載public class ConstructorOverloadDemo public static void main(String args)Person p1 = new Person() ; p1.speak() ;Pe

23、rson p2 = new Person(小紅) ; p2.speak() ;Person p3 = new Person(13) ; p3.speak() ;Person p4 = new Person(小明,16) ; p4.speak() ; 3.4.3 構(gòu)造方法 如果一個變量是在方法體或某個代碼塊中聲明的,它被稱為局部變量。局部變量先聲明后使用,并且Java中沒有為局部變量提供默認值,否則將編譯出錯,如:void method() int i; /局部變量i System.out.println(“i = ” + i);/編譯出錯,變量i尚未初始化 局部變量的作用域從它的聲明開始延續(xù)到

24、包含它的塊尾。如:void method() int i = 5; /局部變量i,i作用域的起始處 if(i 0) int j = 3; /局部變量j,j作用域的起始處 / j作用域的結(jié)束處 / i作用域的結(jié)束處 3.4.4 局部變量 如果一個變量是在方法體或某個代碼塊中聲明的,它被稱為局部變量。局部變量先聲明后使用,并且Java中沒有為局部變量提供默認值,否則將編譯出錯,如:void method() int i; /局部變量i System.out.println(“i = ” + i);/編譯出錯,變量i尚未初始化 局部變量的作用域從它的聲明開始延續(xù)到包含它的塊尾。如:void meth

25、od() int i = 5; /局部變量i,i作用域的起始處 if(i 0) int j = 3; /局部變量j,j作用域的起始處 / j作用域的結(jié)束處 / i作用域的結(jié)束處 3.4.4 局部變量this代表當(dāng)前對象。this語法格式為: this.成員變量名 this.成員方法名(實際參數(shù)表) 3.5 關(guān)鍵字thisn 表示對當(dāng)前對象的引用例如,以下兩段代碼是等效的:Person(String n, int a) name = n; age = a;和Person(String n, int a) = n; this.age = a; 3.5 關(guān)鍵字thisn 調(diào)用本類

26、的其他重載的構(gòu)造方法 如果某個構(gòu)造函數(shù)的第一條語句具有形式this(),那么這個構(gòu)造函數(shù)將調(diào)用本類中的其他構(gòu)造函數(shù),如例3.8通過this調(diào)用本類其他重載的構(gòu)造函數(shù)。public class ThisDemo2private int i=0; /第一個構(gòu)造方法:有一個int型形參 ThisDemo2(int i) this.i=i+1;/此時this表示引用成員變量i,而非函數(shù)參數(shù)i System.out.println(constructor1 i = +i+ ,this.i = +this.i); /第二個構(gòu)造方法:有一個String型形參 ThisDemo2(String s) Syst

27、em.out.println(constructor2 s = +s); /第三個構(gòu)造器方法:有一個int型形參和一個String型形參 ThisDemo2(int i,String s) this(s);/this調(diào)用第二個構(gòu)造器方法 this.i=i+;/this以引用該類的成員變量 System.out.println(constructor3 i = +i+n+constructor3 s = +s); public static void main(String args) ThisDemo2 t0=new ThisDemo2(10); ThisDemo2 t1=new ThisDe

28、mo2(ok); ThisDemo2 t2=new ThisDemo2(20,ok again!); 3.5 關(guān)鍵字this 關(guān)鍵字static可以用來修飾類的成員變量和成員方法。如果將關(guān)鍵字static放在一個成員變量聲明前,該變量就成為靜態(tài)變量,也稱為類的成員變量;如果將關(guān)鍵字static放在一個成員方法定義前,該方法就成為靜態(tài)方法,也稱為類的成員方法?!纠?.9】靜態(tài)變量和靜態(tài)方法調(diào)用示例。class Teststatic String staticStr = 靜態(tài)的變量;String str = 非靜態(tài)的變量;public static void test1() System.out.

29、println(靜態(tài)方法);public void test2() System.out.println(“非靜態(tài)方法);public class StaticDemo1public static void main(String args) Test.test1(); /通過類名調(diào)用靜態(tài)方法 System.out.println(Test.staticStr); /通過類名訪問靜態(tài)變量 Test test = new Test(); test.test2(); /需要實例化之后才能夠調(diào)用非靜態(tài)方法 System.out.println(test.str); /需要實例化之后才能夠調(diào)用非靜態(tài)變

30、量 3.6 關(guān)鍵字static3.7 包 為了便于管理大型軟件系統(tǒng)中數(shù)目眾多的類,解決類命名重名的問題,Java引入了包(package)。在定義和使用很多類時,對類文件進行分類管理。包是Java提供的類組織方式,一個包對應(yīng)一個文件夾,包中還可以有子包,形成包等級。3.7.1包的定義 包是在使用多個類或接口時,為了避免名稱重復(fù)而采用的一種措施。在類或接口的最上面一行加上 package 的聲明就可以了,經(jīng)過 package 的聲明之后,在同一文件內(nèi)的接口或類都被納入相同的包中。package的聲明格式:的聲明格式: package 包名;格式說明:格式說明: 包名:必選,用于指定包的名稱,包的名稱必須為合法的Java標識符。當(dāng)包中還有子包時,可以使用“包1.包2.包n”進行指定,其中,包1為最外層的包,而包n則為最內(nèi)層的包。如:package test.demoa; /聲明包并將PackageDemo類文件放在包文件夾test/demoa下3.6.2 Java系統(tǒng)常用包 Java提供了豐富的標準類和相關(guān)的幫助文檔來幫助程序設(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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論