本章內(nèi)容
面向?qū)ο缶幊趟枷?/h2>?面向過程編程
–傳統(tǒng)的C語言屬于面向過程編程请敦。面向過程解決問題的思路:通常是分析出解決問題所需要的步驟舀射,然后用方法把這些步驟一步一步實現(xiàn),最后一個一個依次調(diào)用方法來解決捡偏。
案例:ATM提款機終端系統(tǒng)(面向過程編程)
–步驟1:輸入密碼纱扭,系統(tǒng)判斷是否正確,如正確棍矛,進(jìn)入取款界面安疗,如錯誤,提示重新輸入茄靠。
–步驟2:進(jìn)入取款界面茂契,輸入取款金額,系統(tǒng)判斷余額是否足夠慨绳,如不足掉冶,提示真竖;如足夠,點鈔厌小。
–步驟3:吐出鈔票恢共,打印票據(jù)。
面向過程編程考慮的問題是程序運行的流程璧亚,主要是程序的算法讨韭,而數(shù)據(jù)只是在必要的時候插入到算法中間。
面向?qū)ο缶幊蹋∣OP:Object-Oriented Programming )
從現(xiàn)實世界中客觀存在的事物出發(fā)來構(gòu)造軟件系統(tǒng)癣蟋,并在系統(tǒng)構(gòu)造中盡可能運用人類的自然思維方式透硝,強調(diào)直接以問題域中的事物為中心來思考問題,認(rèn)識問題疯搅,并根據(jù)這些事物的本質(zhì)特點濒生,把它們抽象地表示為系統(tǒng)中的對象,作為系統(tǒng)的基本構(gòu)成單位幔欧。面向?qū)ο蠼鉀Q問題的思路:通常是把構(gòu)成問題域的事務(wù)分解成各個對象罪治,給對象賦予相應(yīng)的屬性和行為,通過多個對象的相互協(xié)調(diào)來解決問題礁蔗。建立對象的目的不是為了完成一個步驟觉义,而是為了描敘某個事物在整個解決問題的步驟中的行為 。支持面向?qū)ο缶幊淌荍ava 語言的重要特點浴井。
案例:ATM提款機終端系統(tǒng)(面向?qū)ο缶幊?
面向過程
面向?qū)ο?/h2>
面向?qū)ο缶幊趟枷?/h2>
面向?qū)ο蠡靖拍?/h2>–抽象(abstract):
面向?qū)ο蠡靖拍?/h2>
–抽象(abstract):
?????????從事物中舍棄個別的非本質(zhì)特征晒骇,抽取共同的本質(zhì)特征
?????????只考慮與問題域相關(guān)的信息,而忽略與問題域不相關(guān)的部分
? ?–對象(object):是系統(tǒng)中用來描述客觀事物的一個實體磺浙。
?可以是有形的厉碟,也可以是無形的(如一個客戶,一張銀行卡屠缭,窗體中的一個按鈕等等)
? 對象是構(gòu)成世界的一個獨立單位
?具有自己的靜態(tài)結(jié)構(gòu)(屬性)和動態(tài)行為(方法)
? 每個對象有自己的唯一標(biāo)識
類(class):
類是一組具有相同屬性和行為的對象的抽象,
類的作用是用來創(chuàng)建對象崭参,對象是類的一個實例
類和對象的關(guān)系
抽象和具體的關(guān)系呵曹。
每一個類在某一時刻都有零個或更多的實例, 類是生成對象的模板
一個類定義了使用哪些數(shù)據(jù)來描述屬性何暮,每一個對象都有相應(yīng)的屬性值數(shù)據(jù)奄喂,
一個類通過一系列方法來定義行為,這些方法能在每個對象中被激活
面向?qū)ο笾饕卣?br>
封裝(encapsulation):
所謂封裝是把對象的屬性和行為結(jié)合在一個獨立的系統(tǒng)單位內(nèi)部
盡可能隱蔽對象的內(nèi)部細(xì)節(jié)海洼,只向外部提供接口
降低對象間的耦合度
封裝的重要意義:
? ? 使對象能夠集中而完整地描述并對應(yīng)一個具體事物
? ? 體現(xiàn)了事物的相對獨立性跨新,使對象外部不能隨意存取對象的內(nèi)部數(shù)據(jù)
繼承(inheritance):
也稱泛化,繼承性是子類自動共享父類屬性和方法的機制坏逢,在定義和實現(xiàn)一個類的時候域帐,可以在一個已經(jīng)存在的類的基礎(chǔ)之上來進(jìn)行赘被,把這個已經(jīng)存在的類所定義的內(nèi)容作為自己的內(nèi)容,并加入自己若干新的內(nèi)容繼承簡化了人們對事物的認(rèn)識和描述肖揣,有益于軟件復(fù)用民假,是OO技術(shù)提高軟件開發(fā)效率的重要原因之一是類之間的一種關(guān)系,一般類與特殊類之間的關(guān)系繼承關(guān)系的語義:“is a kindof”
多態(tài)(polymorphism):
指同一個命名可具有不同的語義
OO方法中龙优,常指在一般類中定義的屬性或方法被特殊類繼承之后羊异,可以具有
不同的數(shù)據(jù)類型或表現(xiàn)出不同的行為,對于子類彤断,可用不同的方法替代實現(xiàn)父
類的服務(wù)的方法
類的定義
什么是類
把相似的對象劃歸成一個類野舶。
在軟件設(shè)計中,類宰衙,就是一個模板平道,它定義了通用于一個特定種類的所有對象
的屬性(變量)和行為(方法)。
什么是類菩浙? 示例 XiyoujiRole.java
西游記游戲軟件中的游戲人物
孫悟空:孫悟空的武器是金箍棒巢掺,戰(zhàn)斗力五顆星,耐力五顆星
唐? 僧:唐僧沒有武器劲蜻,戰(zhàn)斗力為零陆淀,耐力五顆星
豬八戒:豬八戒的武器是耙子,戰(zhàn)斗力四顆星先嬉,耐力兩顆星
沙? 僧:沙僧的武器是月牙鏟 轧苫,戰(zhàn)斗力三顆星,耐力四顆星
類的格式
類的格式
示例
Employee.java
類的成員
成員變量:
[修飾符] 類型 屬性名=[默認(rèn)值];
其中修飾符有:public疫蔓、private含懊、protected,也可以省略不寫。
例如:
方法:
[修飾符] 返回值類型 方法名(形參列表){ 語句}
對象的創(chuàng)建和使用
什么是對象
類(class) — 是對某一類事物的描述對象(object) — 是實際存在的某類事物的個體衅胀, 也稱為實例(instance)類是創(chuàng)建對象的模板岔乔,對象是類的實例。
創(chuàng)建對象
語法格式
類名 對象名 =new構(gòu)造器
示例
Employee zhang =newEmployee( )
示例 TestEmployee.java
構(gòu)造器(構(gòu)造方法/構(gòu)造器滚躯,Constructor)
構(gòu)造器的作用
完成對象的創(chuàng)建雏门,即完成對象的實例化一般使用構(gòu)造器來完成對成員變量的初始化 示例Employee.java
通過實例Person ,可以看到使用帶參數(shù)的構(gòu)造器進(jìn)行實例化簡化了代碼掸掏,在創(chuàng)建對象的同時給對象的屬性賦值茁影。此時,類由一個抽象的藍(lán)圖變化為一個具體的對象丧凤,同時對象的屬性已經(jīng)賦值募闲。通過多次調(diào)用構(gòu)造器,一個類可以實例化出多個對象愿待。
構(gòu)造器也是方法浩螺,但是它是特殊的方法而已靴患。它也可以像普通方法一樣發(fā)生重載。通常一個類中不止一個構(gòu)造方法年扩,而是有多個不同參數(shù)的構(gòu)造器蚁廓,用戶可以根據(jù)需要選擇不同的構(gòu)造器創(chuàng)建對象。
注意在開發(fā)中厨幻,我們在編寫自己的類時相嵌,應(yīng)該根據(jù)需要提供相應(yīng)的構(gòu)造器,保證在使用這個類時况脆,能夠選擇到合適的構(gòu)造方法饭宾。
所有的對象都是通過構(gòu)造器來創(chuàng)建的,也可以說任何對象都是通過內(nèi)存分配操作符new 創(chuàng)建和開辟內(nèi)存空間的格了。如果在開發(fā)時看铆,沒有明確的寫出構(gòu)造方法,在編譯時編譯器會發(fā)現(xiàn)該類沒有構(gòu)造器盛末,這時編譯器會自動的給這個類增加一個構(gòu)造器弹惦,該構(gòu)造器沒有任何參數(shù),我們稱之為“默認(rèn)的空構(gòu)造器”悄但。相反棠隐,如果我們在編寫時,手寫了一個或是若干個帶參的構(gòu)造器檐嚣,那么助泽,這個不帶參的空構(gòu)造器就不會再自動產(chǎn)生并存在。在這樣的情況下嚎京,如果在某些情況下還想使用這樣的無參數(shù)默認(rèn)構(gòu)造器的話嗡贺,最好還是養(yǎng)成手寫出這個無參數(shù)的構(gòu)造器來,以備后用鞍帝。否則在這個類中诫睬,將不再存在這個默認(rèn)的構(gòu)造器。
默認(rèn)的構(gòu)造器
在Java中帕涌,每個類都至少要有一個構(gòu)造器岩臣,如果程序員沒有在類里定義構(gòu)造器,系統(tǒng)會自動為這個類產(chǎn)生一個默認(rèn)的訪問權(quán)限為public且參數(shù)列表為空的構(gòu)造器
一旦編程者為該類定義了構(gòu)造器宵膨,系統(tǒng)就不再提供默認(rèn)的構(gòu)造器
? 練習(xí)
對象創(chuàng)建的內(nèi)存模型
在java中所有的變量、數(shù)組炸宵、對象都是分配在內(nèi)存中的辟躏,根據(jù)變量類型的不同分配的內(nèi)存也有所不同。Java中主要有3種類型的變量:
局部變量:定義在方法體中的變量土全;或是方法的形參捎琐。
實例變量:即類的屬性会涎,也是全局變量。
靜態(tài)變量:在類中聲明為static的屬性瑞凑。
內(nèi)存的類別
堆和棧分別存儲哪些變量末秃?
除了8種基本數(shù)據(jù)類型的變量,其他變量都是引用類型變量
類(class)
接口(interface)
Animal a ;
數(shù)組
int[ ] c ;
對象創(chuàng)建的內(nèi)存模型
Person p =newPerson( “l(fā)isi”,44, “male”);
示例 Person.java PersonTest.java
內(nèi)存結(jié)構(gòu)參考java虛擬機視頻
Person p =newPerson( “zhang”,33,”male”);
Person q =newPerson( “l(fā)isi”,44, “male”);
如上所示籽御,對象的屬性name 练慕、age、sex都分配在堆內(nèi)存中技掏,但是對象名 p铃将、q都分配在棧內(nèi)存中。p 哑梳、q也稱為對象的引用(reference)劲阎,引用在java中是地址的同義詞。
訪問對象:在其他類中或main方法中鸠真,若想訪問對象的屬性或是方法必須先實例化這個類悯仙,然后通過對象名(引用)和點操作符來完成:
匿名對象
創(chuàng)建完對象,在調(diào)用該對象的方法時吠卷,也可以不定義對象的句柄锡垄,而直接調(diào)用這個對象的方法。這樣的對象叫匿名對象
示例 Person.java PersonTest.java
使用匿名對象的情況
如果對一個對象只需要進(jìn)行一次方法調(diào)用
垃圾回收機制
Java的垃圾回收機制是自動的撤嫩,它保證程序健壯的主要手段偎捎,避免了由于程序員忘記回收內(nèi)存而引起的內(nèi)存泄漏,同時也避免了回收內(nèi)存帶來的代碼繁瑣序攘。
垃圾回收機制實際上是JVM內(nèi)部運行的一個優(yōu)先級比較低的后臺線程茴她,這種多線程的模式使得java 具有更好的性能,完全不用程序員參與程奠。
垃圾回收機制僅僅作用于堆內(nèi)存丈牢,于棧內(nèi)存無關(guān)。
對于程序員來說瞄沙,對象何時變成垃圾呢己沛?
G1垃圾回收器
JDK7中引入了一個新的垃圾回收器,G1距境,它是Garbage First的縮寫申尼。G1回收器優(yōu)先回收垃圾最多的區(qū)域。為了實現(xiàn)這個策略它把堆分成了多個區(qū)域垫桂,就好比Java 7之前分成三個區(qū)域那樣(新生代师幕,老生代和持久代)。G1回收器是一個可預(yù)測的回收器诬滩,同時對那些內(nèi)存密集型的程序它還能保證較高的吞吐量霹粥。
變量的作用域
類變量
用static修飾的成員變量灭将,它們在類被載入時創(chuàng)建,只要類存在后控,static變量就存在
實例變量
類體中聲明的成員變量庙曙,即非static的屬性
局部變量
方法體中聲明的變量,方法中的參數(shù)浩淘,或代碼塊中聲明的變量捌朴,都是局部變量
局部變量只在方法調(diào)用的過程中有效,方法調(diào)用結(jié)束后失效
變量的作用域
變量初始化的順序
隱式賦予變量默認(rèn)值
成員變量
顯式賦予初始值
通過構(gòu)造器體賦予新值
示例 PersianCat.java
this關(guān)鍵字
this關(guān)鍵字
代表對象自身的引用
一個引用
指向調(diào)用該方法的當(dāng)前對象
通常在類的方法定義中使用
用this關(guān)鍵字的情況
方法中的變量與成員變量重名
在一個構(gòu)造器中馋袜,調(diào)用其它重載的構(gòu)造器
返回當(dāng)前對象的引用
示例? Employee.java? ? ? Dog.java
本章重點總結(jié)
面向?qū)ο蟮乃枷?/h3>類的定義
什么是類
類的屬性
對象的創(chuàng)建和使用
創(chuàng)建對象
構(gòu)造器
this關(guān)鍵字
課后作業(yè)
定義一個點類Point男旗,包含2個成員變量x、y分別表示x和y坐標(biāo)欣鳖,2個構(gòu)造器Point()和Point(int x0,y0),以及一個movePoint(int dx,int dy)方法實現(xiàn)點的位置移動察皇,創(chuàng)建兩個Point對象p1、p2泽台,分別調(diào)用movePoint方法后什荣,打印p1和p2的坐標(biāo)。[必作題]
定義一個矩形類Rectangle:(知識點:對象的創(chuàng)建和使用)[必做題]
1.定義三個方法:getArea()求面積怀酷、getPer()求周長稻爬,showAll()分別在控制臺輸出長、寬蜕依、面積桅锄、周長。
2 有2個屬性:長length样眠、寬width
3? 通過構(gòu)造方法Rectangle(int width, int length)友瘤,分別給兩個屬性賦值
4? 創(chuàng)建一個Rectangle對象,并輸出相關(guān)信息
定義一個筆記本類檐束,該類有顏色(char)和cpu型號(int)兩個屬性辫秧。 [必做題]
1 無參和有參的兩個構(gòu)造方法;有參構(gòu)造方法可以在創(chuàng)建對象的同時為每個屬性賦值被丧;
2? 輸出筆記本信息的方法
3? 然后編寫一個測試類盟戏,測試筆記本類的各個方法。
設(shè)計一個類Student甥桂,該類包括姓名柿究、學(xué)號和成績。設(shè)計一個方法黄选,按照成績從高到低的順序輸出姓名蝇摸、學(xué)號和成績信息。[選做題]
定義兩個類,描述如下: [必做題]
1定義一個人類Person:
1.1定義一個方法sayHello()探入,可以向?qū)Ψ桨l(fā)出問候語“hello,my name is XXX”
1.2有三個屬性:名字、身高懂诗、體重
2定義一個PersonCreate類:
2.1創(chuàng)建兩個對象蜂嗽,分別是zhangsan,33歲殃恒,1.73植旧;lishi,44离唐,1.74
2.2分別調(diào)用對象的sayHello()方法病附。
定義兩個類,描述如下: [必做題]
1定義一個人類Person:
1.1定義一個方法sayHello()亥鬓,可以向?qū)Ψ桨l(fā)出問候語“hello,my name is XXX”
1.2有三個屬性:名字完沪、身高、體重
1.3通過構(gòu)造方法嵌戈,分別給三個屬性賦值
2定義一個Constructor類:
2.1創(chuàng)建兩個對象覆积,分別是zhangsan,33歲熟呛,1.73宽档;lishi,44庵朝,1.74
2.2分別調(diào)用對象的sayHello()方法吗冤。
定義一個汽車類Vehicle,要求如下:[選做題]
1屬性包括:汽車品牌brand(String類型)九府、顏色color(String類型)和速度speed(double類型)椎瘟,并且所有屬性為私有。
2至少提供一個有參的構(gòu)造方法(要求品牌和顏色可以初始化為任意值昔逗,但速度的初始值必須為0)降传。
3為私有屬性提供訪問器方法。注意:汽車品牌一旦初始化之后不能修改勾怒。
4定義一個一般方法run()婆排,用打印語句描述汽車奔跑的功能
5定義測試類VehicleTest,在其main方法中創(chuàng)建一個品牌為“benz”笔链、顏色為“black”的汽車段只。