教學課件面向對象程序設計_第1頁
教學課件面向對象程序設計_第2頁
教學課件面向對象程序設計_第3頁
教學課件面向對象程序設計_第4頁
教學課件面向對象程序設計_第5頁
已閱讀5頁,還剩71頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

教學課件面向對象程序設計第1頁,共76頁,2023年,2月20日,星期五3.1類和對象面向對象方法類的定義成員變量成員方法構造方法對象的創建和使用類成員與實例成員第2頁,共76頁,2023年,2月20日,星期五面向對象方法現實生活中的對象有形的對象醫院醫生病人手術器械體溫計

…….無形的對象治療方案手術規程…….第3頁,共76頁,2023年,2月20日,星期五面向對象方法對象的特征分析靜態特征:屬性姓名性別年齡職稱專長……量血壓聽診寫病歷開處方……第4頁,共76頁,2023年,2月20日,星期五【案例3-1】用面向對象方法模擬醫生為病人診療過程。案例說明:

本案例通過對病人就診模型的分析與簡化,抽象出包括日期、體溫計、病人以及醫生等四個主要的類,并利用醫生類的接診、開處方、診療等實例成員方法將這些類聯系起來,重現病人就診時醫生用體溫計測量病人體溫,給病人診療并開據處方的過程。圖5-2案例5-1的運行結果第5頁,共76頁,2023年,2月20日,星期五面向對象的基本概念對象(Object)是一個應用系統中用來描述客觀事物的實體,是具有特定屬性(數據)和行為(方法)的基本運行單位,是類的一個特定狀態下的實例。類(Class)是Java代碼的基本組織模塊,是用以描述一組具有共同屬性和行為的對象的基本原型,是對這組對象的概括、歸納與抽象表達,它定義了本類對象所應擁有的狀態屬性集及操作這組屬性的行為方法集。3132第6頁,共76頁,2023年,2月20日,星期五面向對象的基本概念(續1)接口(Interface)是一種只包含常量與抽象方法的特殊的類,是Java語言用以實現類間多重繼承功能的唯一手段。接口定義了一組特定功能的對外接口與規范,而并不真正實現這種功能,功能的實現留待給實現這一接口的各個類來完成34包(Package)是用來容納一組相關類與接口的容器,是Java語言組織與管理類與接口的一種機制

33第7頁,共76頁,2023年,2月20日,星期五類與對象的關系類與對象之間的關系,類似于數據類型與變量之間的關系;一個類可以生成無數個不同的對象,每個對象屬性值不同,其狀態也不同。可以用計算機模型與計算機實體之間的關系來更形象地說明類與對象之間的關系:將馮·諾依曼計算機模型看作計算機類,則不同品牌的計算機實體就對應為一個個的實例對象。第8頁,共76頁,2023年,2月20日,星期五類與對象的關系示例計算機模型與計算機實體之間的關系:第9頁,共76頁,2023年,2月20日,星期五面向對象編程(OOP)

從問題域客觀存在的事物出發,將這些現實世界的物理實體抽象成概念世界的抽象數據類,再進一步將這種抽象數據類轉換為計算機世界的類(Class);類刻畫出實體所具有的狀態信息與所能發揮的功能信息,是創建對象時所遵循的模板(Template)。對類進行實例化,就生成一個個的對象,對象對應于各個具體事物,是程序運行過程中實際發揮作用的類的獨立內存映像。借助于類與對象這兩個面向對象程序中最基本的要素,按照盡可能符合人類自然思維的方式,來構造軟件系統,這就是所謂的面向對象程序設計(OOP)

第10頁,共76頁,2023年,2月20日,星期五OOP的邏輯過程面向對象設計分析的完整過程如圖所示:現實域抽象抽象類對象實例化映射抽象數據類物理實體邏輯實現概念域計算機世界第11頁,共76頁,2023年,2月20日,星期五面向對象的重要特征

面向對象具有以下幾個重要特征:抽象封裝與隱藏繼承多態性

33313234第12頁,共76頁,2023年,2月20日,星期五抽象抽象(Abstraction):抽象是面向對象編程的起點,也是其最本質的特征之一。抽象的廣義概念是這樣定義的:從研究對象中提取與當前目標主題關系最密切的主要方面,而忽略掉與目標無關的那些方面或關系不大的細枝末節,從而更充分地注意與當前目標有關的方面,更明確地突出主題,這就是抽象第13頁,共76頁,2023年,2月20日,星期五抽象示例下圖闡述了如何由自然界眾多的動物實體出發,經過抽象的處理過程,最終得到動物這一概念第14頁,共76頁,2023年,2月20日,星期五封裝封裝(Encapsulation):封裝也可稱為信息隱藏(InformationHiding),是通過對象的方法來訪問與改變對象屬性的一種機制。封裝是面向對象的一個重要原則,其實現的核心是將類的屬性與相關的操作捆綁起來,包裝成不可分割的、獨立的對象實體,將內部的數據與實現細節盡可能隱蔽起來,使外部用戶不能直接操縱對象的內部信息,只能通過對象對外提供的施加有一定限制的訪問接口來使用對象第15頁,共76頁,2023年,2月20日,星期五封裝示例下圖形象地說明了一個類的封裝原理。類對數據與行為的封裝是借助于不同級別的訪問修飾符來達到控制目的的第16頁,共76頁,2023年,2月20日,星期五繼承繼承(Inheritance):繼承是指從已有的類中可以派生出若干個新類,已有類稱為基類或父類,新類稱為派生類或子類;子類將自動地獲得基類的屬性與方法,從而不需再重復定義這些屬性與方法;當然子類還可以修改父類的方法或增加新的方法,從而使自己更適合特殊的需要。類之間的繼承關系是現實世界中遺傳關系的直接模擬第17頁,共76頁,2023年,2月20日,星期五多態性多態性(Polymorphism):是指允許不同類的對象對同一消息作出各自的響應,即以統一的風格處理已存在的數據及相關的操作。多態性語言具有靈活、抽象、行為共享、代碼共享的優勢,較好地解決了應用程序中方法同名的問題第18頁,共76頁,2023年,2月20日,星期五

OOP的優越性從面向過程到面向對象是程序設計技術的一個飛躍。人們之所以要采用面向對象的程序設計技術,其目的在于:

提升程序的開發與運行效率提高代碼的可重用性(或者稱為復用性)按照與人類習慣思維方法一致的原則開發系統第19頁,共76頁,2023年,2月20日,星期五OOP的優越性(續)提高程序的可靠性與可維護性

提高程序的可擴展性增強程序的可控制性總之,面向對象的程序設計,能夠有效分解、降低問題的難度與復雜性,提高整個求解過程的可控制性、可監視性和可維護性,從而獲得較高的開發效率與可靠效果第20頁,共76頁,2023年,2月20日,星期五類的定義在面向對象的程序設計中,將數據與對數據進行的操作合起來定義為類。類是將數據和與數據相關的操作封裝在一起的集合體,用來定義一組對象共同具有的狀態(屬性)和行為(方法)的模板。類是一種復雜的數據類型,它不但包含數據,還包含了對數據進行操作的方法(Method),通常將類中的數據稱為成員變量,而操作數據的方法稱為成員方法,二者統稱為類的成員。第21頁,共76頁,2023年,2月20日,星期五類的定義Java類的定義格式如下:<類聲明>{<類主體>}說明:(1)類聲明定義該類的名稱、訪問權限、與其他類的關系以及實現的接口等。(2)類主體定義該類中的成員,包含成員變量和成員方法。成員方法是用來描述對成員變量進行的操作,不但定義方法,一般還要實現該方法。第22頁,共76頁,2023年,2月20日,星期五類的定義類聲明的格式如下:

[<修飾符>]class<類名>[extends<父類名>][implements<接口名>]說明:(1)class是定義類的關鍵字,<類名>、<父類名>、<接口名>都應該是合法的Java標識符。(2)在類的聲明中必須包括關鍵字class和自定義的類名,而方括號[]中的是可選項。(3)子句extends<父類名>顯式地指明當前類的父類,子句implements<接口名>則說明當前類要實現接口。

第23頁,共76頁,2023年,2月20日,星期五類的定義類主體的定義格式如下:{ <成員變量的聲明> <構造方法的聲明與實現> <成員方法的聲明及實現>}說明:(1)類體的數據聲明為成員變量,針對數據的操作聲明為成員方法,數據的操作過程在成員方法的實現中體現。(2)構造方法主要用于類對象的實例化,又稱構造器。(3)類體中聲明的成員變量和方法的排列順序可以任意。第24頁,共76頁,2023年,2月20日,星期五成員變量聲明類的成員變量格式如下:[修飾符][static][final]數據類型成員變量名1[,成員變量名2,…]說明:(1)修飾符的作用是限定成員變量的可訪問權限,主要有public(公共的)、protected(受保護的)、private(私有的)以及缺省等四種情況(2)static用于聲明類成員變量,用于保存與整個類有關的狀態數據的成員變量稱為靜態成員變量或者類成員變量,簡稱為類變量,final用于聲明常量;(3)成員變量的數據類型既可以是基本數據類型,也可以是引用數據類型,如數組或者其他類對象等。第25頁,共76頁,2023年,2月20日,星期五成員方法成員方法是可被調用執行并返回值的、能實現特定功能的程序段。成員方法聲明格式如下:[修飾符][abstract][static][final]返回值類型方法名([參數列表])[throws異常類]{ 方法體 }

說明:(1)方法的修飾符和成員變量的修飾符一樣有四種情況;(2)abstract、static和final分別用于指定所聲明的方法為抽象方法、靜態方法和最終方法。靜態方法又稱類成員方法或類方法,一般用于與類有關的數據操作,可以使用類名直接調用。第26頁,共76頁,2023年,2月20日,星期五成員方法(3)成員方法執行數據操作功能后都會向調用者返回數據操作的結果,返回值類型就是用于聲明該成員方法返回值結果的數據類型,可以是包括基本數據類型和引用類型在內任何合法的類型。(4)若成員方法不返回任何值,則返回值類型用void標記,不能缺省。(5)每個成員方法都有一個方法名,緊鄰方法名的是用一對括號()括起來的參數列表,參數列表也稱為形式參數表,簡稱形參表。(6)形參表主要用于聲明該成員方法在被調用時需要調用者提供的、與數據操作相關的參數的個數與數據類型。每個成員方法允許聲明的形參可以有0到多個,每個形參由形參數據類型、空格符和形參名組成,多個形參之間用逗號分隔,即便成員方法沒有形參,括號()也不能缺省。第27頁,共76頁,2023年,2月20日,星期五成員方法(7)形參的作用域是局部的,只限于聲明它的成員方法之內有效。throws用于聲明該成員方法在執行過程中可能會拋出的異常類型。(8)花括號{}所括起來的就是方法體,方法體可以包含一到多條語句,用以實現成員方法所負責的數據操作功能。若成員方法的返回值類型不為void,則在方法體中需要使用return語句返回其數據操作的結果,且結果類型必須與方法聲明的返回值類型相一致。(9)在方法體內可以局部變量,其作用域只限于聲明它的方法體內,且聲明中不能使用public等訪問修飾符和static關鍵字,同時需遵循“先賦值,后使用”的原則,且在同一個類的不同方法中可以聲明同名的局部變量,包括形式參數在內的所有局部變量都不能在方法體外被訪問。第28頁,共76頁,2023年,2月20日,星期五成員方法如果方法有返回值類型,則方法體中必須有return語句.如果想讓方法執行后得到值a,即返回值為a,那么在方法中要使用return

a語句。return有“返還”之意,它把表達式的值返回到調用之處。例如:publicclassClass3{doublef(intx){ return2.5+x;}publicstaticvoidmain(String[]args){Class3aaa=newClass3();doubley=aaa.f(3);System.out.println(y);System.out.println(aaa.f(2)); }}第29頁,共76頁,2023年,2月20日,星期五構造方法每當由類構造對象時都要調用該類特定的構造方法,在Java中,每個類都至少有一個構造方法。構造方法可以確保用戶正確地構造類的對象,同時,構造方法也會對對象作初始化工作。構造方法的聲明格式如下: [<修飾符>]<類名稱>([<參數列表>]) { 初始化的程序代碼塊 }說明:(1)一個類的構造方法可以有多個,它們都具有相同的方法名,即類名;(2)與類的成員方法不同,構造方法用于創建類的對象并對對象的成員變量進行初始化。(3)構造方法沒有返回值類型,但是也不能有void關鍵字,且只能通過new運算符調用,且其修飾符一般采用public(或者沒有),以便于在其他位置根據需要定義并實例化該類的對象。可以使用參數值作為變量的初值,也可以直接給變量賦具體的數值。第30頁,共76頁,2023年,2月20日,星期五構造方法(4)當一個類沒有顯式聲明其構造方法時,Java編譯器會自動為該類生成一個默認的、無參數的構造方法,且實例化后對象的成員變量在沒有特別賦值的情況下自動獲得其所聲明類型的默認值。第31頁,共76頁,2023年,2月20日,星期五構造方法

構造方法分為缺省的構造方法(不帶參數)和帶參數的構造方法。(1)缺省的構造方法如果類的定義沒有編寫構造方法,Java語言會自動為用戶提供。這個由Java自動提供的構造方法就是所謂的缺省構造方法。缺省的構造方法確保每個Java類都至少有一個構造方法,該方法應符合方法的定義。例如在下例的類EmpInfo中,我們沒有定義構造方法,則Java自動提供了一個缺省的構造方法,如下:

publicEmpInfo(){}//缺省的構造方法第32頁,共76頁,2023年,2月20日,星期五構造方法EmpInfo.javapublicclassEmpInfo{Stringname;//雇員的姓名

Stringdesignation;//雇員的職務

Stringdepartment;//雇員的部門

voidprint(){//成員方法

System.out.println(name+"is"+designation+"at"+department);}publicstaticvoidmain(Stringargv[]){EmpInfoemployee=newEmpInfo();//創建對象并實例化

="RobertJavaman";//給成員變量賦值

employee.designation="Manager";//給成員變量賦值

employee.department="CoffeeShop";//給成員變量賦值

employee.print();//調用方法print()}}運行結果如下:RobertJavamanisManageratCoffeeShop調用缺省的構造方法第33頁,共76頁,2023年,2月20日,星期五構造方法第34頁,共76頁,2023年,2月20日,星期五構造方法(2)帶參數的構造方法帶有參數的構造方法能夠實現這樣的功能:當構造一個新對象時,類構造方法可以按需要將一些指定的參數傳遞給對象的變量。第35頁,共76頁,2023年,2月20日,星期五構造方法例如,可以為People類增加一個如下所示的構造方法ClassPeople{stringname;intage;floatheight;floatweight;publicPeople()//無參數{name="沈昕";age=26;height=1.62;weight=55.5;}}第36頁,共76頁,2023年,2月20日,星期五構造方法如果希望在創建對象時,其實例變量具有不同的初值,可以通過傳遞參數并將參數值賦給實例變量的方法來實現。構造方法的參數要與實例變量一一對應,例如:People類的另一種構造方法為:帶參數的構造方法

ClassPeople{stringname;intage;floatheight;floatweight;publicPeople(StringinitName,intinitAge,doubleinitHeight,doubleinitWeight){name=initName;age=initAge;height=initHeight;weight=initWeight;}}第37頁,共76頁,2023年,2月20日,星期五對象的創建和使用

對象是類的實例,所以一個對象必定屬于一個已知的類。Java語言中,一個對象的生命周期經歷:創建,使用,銷毀等三個階段。對象被創建后將獲得包括內存在內的所需資源;而對象銷毀后,其所占的資源將被系統自動回收。Java語言具有資源回收機制,能跟蹤存儲單元的使用情況,自動回收不再被使用的資源。對象的創建:創建一個對象包括兩個步驟--聲明對象和為對象分配內存。1)對象的聲明一般格式為:類名對象名如:People張三這里people是前面定義的一個類的名字,張三是聲明對象的名字。但此時對象“張三”的內存中沒有任何數據,即“張三”還是一個空對象,不能使用。要是用這個對象還必須為這個對象分配內存,也叫做為對象分配實體。

第38頁,共76頁,2023年,2月20日,星期五對象的創建和使用2)為對象分配內存:為對象分配內存,即使用new運算符和類的構造方法實例化某個對象。如果類中沒有構造方法,系統會自動調用默認的構造方法(沒有參數,名字遵循普通構造方法的要求:和類名相同),格式為

對象名=new構造方法名([實參列表]);//實例化對象

例如:張三=newPeople()也可以把以上兩個步驟合在一起,格式為:類名對象名=new構造方法名([實參列表]);例如

People張三=newPeople()new可以實例化類的多個不同的對象,分配不同的內存。因此,這些對象之間的狀態相互獨立。第39頁,共76頁,2023年,2月20日,星期五對象的創建和使用

創建一個對象后,在程序中就可以引用對象中的成員變量,調用對象的成員方法,語法格式如下: 對象名.成員變量 對象名.成員方法([實參列表])例如:aday.year=2009; aday.setDate(2009,10,28);說明:(1)對象名與成員變量或方法之間使用點運算符“.”分隔。(2)方法調用時給出的參數稱為實際參數,簡稱實參。實參可以是常量、變量、表達式或方法的調用,實參的個數與數據類型及排列次序一定要與類定義中該方法聲明的形參保持一致,且多個實參之間用逗號分隔。第40頁,共76頁,2023年,2月20日,星期五對象的創建和使用

(2)當調用方法時,系統按照實參與形參一一對應的關系將實參的值或引用傳遞給對應的形參。需要特別注意的是,若實參為引用類型的數據,其值不能為null。方法后的圓括號()是必需的,即便該方法沒有聲明形式參數也不能缺省。

第41頁,共76頁,2023年,2月20日,星期五對象創建的一個例子classPeople{ intage; Stringname; doubleheight; People(){ name="張婷"; age=25; height=160.0; } voidlaugh(){//類的一個成員方法 System.out.println("Haaha..."); } publicstaticvoidmain(String[]args){ System.out.println("main方法執行"); Peoplep=newPeople(); p.laugh();System.out.println("="+);System.out.println("p.age="+p.age);System.out.println("p.height="+p.height); }}一個構造函數第42頁,共76頁,2023年,2月20日,星期五對象創建的一個例子publicclassClass27{inta;publicClass27(){ a=10;}publicClass27(intq){ a=q;}publicstaticvoidmain(String[]args){Class27ob1=newClass27();Class27ob2=newClass27(20);Class27ob3=newClass27(30);

System.out.println(ob1.a);System.out.println(ob2.a);System.out.println(ob3.a);

}}兩個構造函數第43頁,共76頁,2023年,2月20日,星期五對象創建的一個例子classMan{intheight;intage;}publicclassClass1{publicstaticvoidmain(String[]args){Manman1;man1=newMan();man1.height=180;man1.age=20;System.out.println(man1.height);//使用對象的成員變量

System.out.println(man1.age); }}在本源程序中,有兩個類,其中包含主方法的類為主類,文件名與主類名相同第44頁,共76頁,2023年,2月20日,星期五對象的創建和使用對象的創建—課堂練習:有一個類class1擁有以下成員變量:Inta;Doubleb;Stringc;請編寫構造函數(帶參數)初始化成員變量,創建類class1的對象ob,輸出對象ob的三個成員變量值。第45頁,共76頁,2023年,2月20日,星期五類成員與實例成員

Java類中所包含的成員從功能上可以劃分為成員變量和成員方法兩種。其中,前者存儲數據,后者負責數據的處理。然而,從成員與類及類實例(對象)之間的關系的上看,類中的成員還可以劃分為類成員和實例成員兩種。第46頁,共76頁,2023年,2月20日,星期五類成員與實例成員類成員是屬于類的,使用static關鍵字聲明,故又稱靜態成員,包括類成員變量和類成員方法。通過類名就可以直接訪問類成員變量和調用類成員方法,即使沒有創建對象,也能夠引用類成員。當然,類成員也能夠通過類的實例(即對象)進行引用。實例成員則屬于類的實例(即對象),包括實例成員變量和實例成員方法。只有創建了對象之后,才能通過對象訪問實例成員變量和調用實例成員方法。換句話說,實例成員只能通過類的實例進行引用,而不能為類名。第47頁,共76頁,2023年,2月20日,星期五類成員與實例成員

成員變量又可以分為:實例成員變量和類成員變量(靜態成員變量)(1)實例成員變量----每次創建類的一個實例對象時,系統會為對象的每一個實例成員變量分配內存單元,使得屬于不同對象的同一個實例成員變量具有不同值。也就是說,只有對象存在時,其實例成員變量的值才存在。(2)類成員變量----系統運行時為每一個類成員變量只分配一個存儲單元,使得所有通過該類實例化的對象共享同一個類成員變量的存儲空間。只為該類的第一個對象分配內存單元,其后所有新創建的對象都共享這一個類變量。

第48頁,共76頁,2023年,2月20日,星期五類成員變量(靜態成員變量或類變量)如果成員變量的類型關鍵字前面有關鍵字static,這樣的成員變量稱作類變量或靜態成員變量。如:classdog{floatx;//實例成員變量

staticinty;//類變量

}靜態成員變量在不創建對象的情況下也可以使用,它是所有對象共有的變量。如果一個類中的某個成員變量是類變量,那么所有類的實例對象的這個類變量都分配給同一處的內存,修改了其中一個對象的這個類變量,其他類的這個類變量也會隨之改變。也就是說,類變量被所有對象共享。實例成員變量(實例變量):只有在創建了類的對象后才能使用。

類成員與實例成員

第49頁,共76頁,2023年,2月20日,星期五classChinese{staticStringcountry="中國";//定義靜態變量country并初始化

Stringname;intage;voidshout(){System.out.println("啊!我愛你——"+country); //類中的成員方法也可以直接訪問靜態成員變量

}}classTestChinese{publicstaticvoidmain(Stringargs[]){System.out.println("Chinesecountryis"+Chinese.country); //未創建對象直接使用“類名.變量名”格式

Chinesech1=newChinese();System.out.println("我們的祖國是"+ch1.country);//創建了對象直接使用“對象名.變量名”格式

ch1.shout();}}類成員變量-例第50頁,共76頁,2023年,2月20日,星期五類成員與實例成員

類的成員方法也分為:實例成員方法和類成員方法(1)實例成員方法體中既可以訪問類成員變量,也可以訪問實例成員變量,且只能通過對象來調用。(2)類成員方法體中只能訪問類成員變量,不能訪問實例成員變量。但是類成員方法既可以通過對象來調用,也可以通過類名調用。第51頁,共76頁,2023年,2月20日,星期五classdog{floatx()//實例方法

{…

return…

}

staticinty();

//類方法

{…return…

}}類方法在不創建對象的時候也可以被調用。若一個方法被聲明為類方法,則它只能對類變量進行操作,且象類變量一樣,類的所有實例對象共享同一個類方法。如下例:Main方法就是靜態方法,它在程序執行時,由JVM自動調用,而不用先創建對象類成員與實例成員

第52頁,共76頁,2023年,2月20日,星期五classtest{inta=3;staticintb;floatf(intx,inty)

{a=x;b=y;//變量引用合法,因為f為實例方法returnx*y;

}staticfloatg(intx,inty)

{a=x;b=2*a;//變量a引用不合法,因為g為類方法,而a為實例變量returnx*y;}}類成員與實例成員

第53頁,共76頁,2023年,2月20日,星期五publicclassClass14{inta;staticvoidsetA(intb){a=b;

}publicstaticvoidmain(String[]args){Class14.setA(10);}}錯誤在于在靜態方法中調用了非靜態變量,a是成員變量,只有在創建對象后才可以使用類方法第54頁,共76頁,2023年,2月20日,星期五publicclassClass15{staticinta;//靜態變量

staticvoidhello(){//靜態方法

System.out.println("救川~~");}staticvoidsetA(intb){//在靜態方法中調用另一個靜態方法

a=b;//靜態變量a hello();}voidprintA(){//在非靜態方法中調用靜態方法

System.out.println(a); hello();}publicstaticvoidmain(String[]args){Class15.setA(100);Class15ob=newClass15();ob.printA();}}類方法第55頁,共76頁,2023年,2月20日,星期五在使用類方法時要注意以下幾個問題:(1)使用static修飾的類方法是屬于某個類的,它在內存空間中的內容將隨著類的定義而進行分配和裝載,不被任何一個對象所單獨擁有。(2)類方法不能操縱和處理屬于某個對象的實例變量,而只能處理屬于整個類的類變量,也就是說類方法只能處理類變量或者調用類方法。不能調用實例方法。實例方法可以調用該類中的任何其他方法:包括類方法和其他實例方法。(3)因為類方法不能訪問實例變量,所以在類方法中不能使用關鍵字this。類變量與類方法的一些說明第56頁,共76頁,2023年,2月20日,星期五局部變量類中的變量可分為成員變量(MemberVariable)與局部變量(LocalVariable)兩類成員變量在類體中定義,其作用域為整個類。成員變量在類中定義的順序與位置并不影響它的作用域范圍局部變量的作用域(Scope)又稱為局部變量的作用范圍,它是變量可被使用的代碼塊范圍;作用域決定了變量的可見性與生存時間。局部變量作用域開始于它的聲明,持續到包含該局部變量的程序段結束之處。不同類型的局部變量,其作用域也不盡相同3231第57頁,共76頁,2023年,2月20日,星期五局部變量的三種類型定義于方法體內的局部變量:這類局部變量僅能在方法內使用,其作用域局限于所定義的方法體。復合語句(或稱為語句塊)中定義的局部變量:這類局部變量只在復合語句中有效。方法的形參也稱為局部變量:這類局部變量的作用域覆蓋整個方法。方法形參在方法被調用時被創建,并以調用方法傳來的實參作為其初始值,當方法終止,調用結束時,這些形參自動被釋放,其生命周期也隨著終止。333132第58頁,共76頁,2023年,2月20日,星期五局部變量的使用原則局部變量不允許加Java修飾符局部變量在使用前必須先聲明,并賦初值,否則將出錯第59頁,共76頁,2023年,2月20日,星期五classPeople{double身高;//成員變量

booblean性別=true;

String姓名,職業;

publicvoid人物簡介() //成員方法定義

{

age=30; //合法,因為age為全局變量,且和定義位置無關

String愛好=“圍棋”; //局部變量

System.out.println(“個人基本資料:”

+姓名+年齡+性別+身高+職業+愛好);

}intage;

publicvoidspeak(Strings){

System.out.println(“我的娛樂是”+愛好);//非法,變量愛好是局部變量

}}局部變量在變量定義過程中,有時會出現成員變量和局部變量同名的情況,此時,在出現局部變量的方法中,同名的成員變量會被隱藏,即這個成員變量會在這個方法內暫時失效。第60頁,共76頁,2023年,2月20日,星期五This關鍵字

一個對象中的方法一般可以直接訪問同一對象的成員變量。但是,有時候方法體內部定義的變量和成員變量名字相同,還有時方法的入口參數和對象的成員變量名字相同,那么就需要將三者區別清楚。因此,專門用this來指明當前對象的成員變量。通過this可以引用當前對象的成員變量或者調用當前對象的成員方法。語法格式如下:this.成員變量

this.成員方法([參數列表])第61頁,共76頁,2023年,2月20日,星期五This關鍵字

說明:(1)由于this用于表示指向當前對象的引用,所以它不能在類成員方法(靜態方法)中使用,只能出現在實例成員方法中。(2)在類的方法體中,如出現形參或局部變量與成員變量同名的情況,系統默認的是形參或局部變量,若需要訪問成員變量,則只能使用this來引用。(3)在沒有以上同名情況的時候,對于當前對象的成員變量和成員方法的訪問可以省略this引用。(4)this引用還可以用在重載的構造方法中,以調用本類已定義的構造方法。語法格式如下:

this([參數列表])(5)在構造方法中,this()引用必須是第一行語句。第62頁,共76頁,2023年,2月20日,星期五關鍵字this最常見的應用是在類的構造方法和實例方法中解決局部變量與成員變量同名的問題。例如,下面一段程序:publicclassPeople{privateStringname;privateintage;privatechargender;privatedoubleheight;privatedoubletweight;publicPeople(Stringname,intage,chargender,doubleheight,doubleweight){name=name;age=age;gender=gender;height=height;weight=weight;}…

…}This關鍵字第63頁,共76頁,2023年,2月20日,星期五在上面的一段程序中,共有name、age、gender、height和weight5個實例變量。在構造方法中的5個參數的變量名稱與實例成員變量的名稱一一對應相同。在參數名或者局部變量名與實例成員變量同名的時候,由于參數變量和局部變量的優先級高,所以在方法體中參數名或者局部變量名將隱藏同名的實例成員變量。這種情況在Java語言中是不被允許的。如果想使實例變量和方法的參數或方法本身定義的局部變量同名的話,就需要用一種方法使實例成員變量與和其同名的方法參數或局部變量區分開來,這就要使用到this關鍵字。下面的一段程序改寫了上面的程序,使People類的構造方法可以合法地使用與實例變量名稱相同的參數。This關鍵字第64頁,共76頁,2023年,2月20日,星期五publicclassPeople{privateStringname;privateintage;privatechargender;privatedoubleheight;privatedoubletweight;publicPeople(Stringname,intage,chargender,doubleheight,doubleweight){=name;this.age=age;this.gender=gender;this.height=height;this.weight=weight;}…

…}其中,使用this調用的都是實例變量,例如:,而name是參數變量。由上面的實例,我們可以看出,this在方法體中用來指向調用當前正在執行方法的對象。當然我們也可以通過使用與實例變量名不同的參數名或者局域變量名來避免這個問題。This關鍵字第65頁,共76頁,2023年,2月20日,星期五publicclassClass27{inta;publicClass27(){ a=10;}publicClass27(inta){ a=a;}publicstaticvoidmain(String[]args){Class27ob1=newClass27();Class27ob2=newClass27(20);Class27ob3=newClass27(30);

System.out.println(ob1.a);System.out.println(ob2.a);System.out.println(ob3.a);

}}一個使用this關鍵字的例子—構造方法參數與成員變量重名?第66頁,共76頁,2023年,2月20日,星期五//源文件名:theThis.javaclassaThis{inta1=1;inta2=2;voidss(){inta1=10;inta2=20;System.out.println("局部變量a1="+a1);System.out.println("局部變量a2="+a2);System.out.println("成員變量a1="+this.a1);System.out.println("成員變量a2="+this.a2);}}publicclasstheThis{publicstaticvoidmain(Stringargs[]){aThisaa=newaThis();aa.ss();}}一個使用this關鍵字的例子-局部變量與成員變量重名第67頁,共76頁,2023年,2月20日,星期五1.成員方法調用成員方法根據其是否帶有static修飾符可以分為類方法和實例方法。(1)實例方法調用的格式:對象名.方法名(實參列表);例如:Circlec1=newCircle();//r1是對象名System.out.println(“area=”+c1.getArea());(2)類方法調用的格式:類名.方法名(實參列表);例如:publicclassClass14{staticinta;staticvoidsetA(intb){a=b;

}publicstaticvoidmain(String[]args){Class14.setA(10);}}方法調用及參數傳遞第68頁,共76頁,2023年,2月20日,星期五方法調用方式分類以表達式方式調用方法:對于有返回值的方法,將其作為表達式或表達式的一部分來調用。調用的形式為:變量=對象名.方法名([實際參數表]);以語句方式調用方法:對于返回值為空(void)的方法,一般以獨立語句的方式進行調用。調用的形式為:對象名.方法名([實際參數表]);根據成員方法是否有返回值將調用方式分為兩類:3132publicclassEmpInfo{Stringname;//雇員的姓名

Stringdesignation;//雇員的職務

Stringdepartment;//雇員的部門

voidprint(){//成員方法

System.out.println(name+"is"+designation+"at"+department);}

publicstaticvoidmain(Stringargv[]){EmpInfoemployee=newEmpInfo();//創建對象并實例化

="RobertJavaman";//給成員變量賦值

employee.designation="Manager";//給成員變量賦值

employee.department="CoffeeShop";//給成員變量賦值

employee.print();//調用方法print()}}第69頁,共76頁,2023年,2月20日,星期五方法參數傳遞機制方法的參數是方法的輸入接口,是外界傳遞給方法進行加工操作的數據方法的參數傳遞機制是指采用何種方式將實參傳遞給形參第70頁,共76頁,2023年,2月20日,星期五2.參數傳遞(1)形參和實參【例】程序題目publicclassTest{publicintmin(inta,intb){intc;

c=(a<b)?a:b;

returnc;}publicstaticvoidmain(String[]args){intmin=0,x=10,y=20;

Testt=newTest();

min=t.min(x,y);

System.out.println(“minis”+min);

}}方法調用及參數傳遞第71頁,共76頁,2023年,2月20日,星期五(2)參數傳遞分為:按值傳遞和引用傳遞【例

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論