面向對象編程學習的主線
1.Java 類及類的成員
- 面向對象的三大特征
- 其它關鍵字
理解面向過程與面向對象
面向過程(POP) 與 與 象 面向對象(OOP)
? 二者都是一種思想巷疼,面向對象是相對于面向過程而言的拴曲。面向過程井仰,強調的
是功能行為浅缸,以函數為最小單位,考慮怎么做学搜。面向對象,將功能封裝進對
象,強調具備了功能的對象讨勤,以類/對象為最小單位,考慮誰來做晨另。
? 面向對象更加強調運用人類在日常的思維邏輯中采用的思想方法與原則潭千,如
抽象、分類借尿、繼承刨晴、聚合、多態(tài)等路翻。
? 面向對象的三大特征
?封裝 (Encapsulation)
?繼承 (Inheritance)
?多態(tài) (Polymorphism)
面向對象:Object Oriented Programming
面向過程:Procedure Oriented Programming
程序員從面向過程的執(zhí)行者轉化成了面向對象的指揮者
面向對象分析方法分析問題的思路和步驟:
?根據問題需要狈癞,選擇問題所針對的現(xiàn)實世界中的實體。
?從實體中尋找解決問題相關的屬性和功能茂契,這些屬性和功能就形成了概念世界中的類蝶桶。
?把抽象的實體用計算機語言進行描述,形成計算機世界中類的定義掉冶。即借助某種程序
語言真竖,把類構造成計算機能夠識別和處理的數據結構儡蔓。
?將類實例化成計算機世界中的對象。對象是計算機世界中解決問題的最終工具疼邀。
兩個要素:類和對象
類(Class)和對象(Object)是面向對象的核心概念喂江。
? 類是對一類事物的描述,是抽象的旁振、概念上的定義
? 對象是實際存在的該類事物的每個個體获询,因而也稱為實例(instance)。
? “萬事萬物皆對象”
可以理解為: 類 = 抽象概念的人拐袜;對象 = 實實在在的某個人
? 面向對象程序設計的重點是 類的設計
? 類的設計
類的結構:屬性和方法
現(xiàn)實世界的生物體吉嚣,大到鯨魚,小到螞蟻蹬铺,都是由最基本的細胞構成的尝哆。同
理,Java代碼世界是由諸多個不同功能的類構成的甜攀。
? 現(xiàn)實生物世界中的細胞又是由什么構成的呢秋泄?細胞核、細胞質规阀、… 那么恒序,
Java中用類class來描述事物也是如此。常見的類的成員有:
? 屬 屬 性:對應類中的成員變量
? 行 行 為:對應類中的成員方法
Field = 屬性 = 成員變量谁撼,Method = ( 成員) 方法 = 函數
類和對象的創(chuàng)建
類的語法格式
符 修飾符 class 類名 {
屬性聲明;
方法聲明;
}
說明: 修飾符public :類可以被任意訪問
類的正文要用{ } 括起來
舉例:
public class Person {
String username;
String password;
public void printInfo() {
System.out.println(this.username + " " + this.password);
}
}
public class Test1 {
public static void main(String[] args) {
Person person = new Person();
person.username = "小舞";
person.password = "13455";
person.printInfo();
}
}
說明:
如果 創(chuàng)建了一個類的多個對象歧胁,對于類中定義的屬性,每個對象都擁有各自的一套副本厉碟,且互不干擾喊巍。
對類和對象創(chuàng)建的再理解
1.定義類(考慮修飾符、類名)
2.編寫類的屬性(考慮修飾符箍鼓、屬性類型崭参、屬性名、初始化值)
3.編寫類的方法(考慮修飾符袄秩、返回值類型阵翎、方法名逢并、形參等)
提示
? 類的訪問機制:
? 在一個類中的訪問機制: 類中的方法可以直接訪問類中的成員變量 .(例外:static 方法訪問非 static,編譯不通過 )
? 在不同類中的訪問機制: 先創(chuàng)建要訪問類的對象 之剧, 再用對象訪問類中
定義的成員
體會類的多個對象的關系
public class Test1 {
public static void main(String[] args) {
Person person = new Person();
person.username = "小舞";
person.password = "13455";
person.printInfo();
System.out.println("-----------------------------");
Person person1 = new Person();
person1.username = "小劉";
person1.password = "13asd5";
person1.printInfo();
}
}
打印
小舞 13455
-----------------------------
小劉 13asd5
對象的內存解析
堆(Heap),此內存區(qū)域的唯一目的就是存放對象實例砍聊,幾乎所有的對象實例都在這里分配內存背稼。這一點在Java虛擬機規(guī)范中的描述是:所有的對象實例以及數組都要在堆上分配。
? 通常所說的棧(Stack)玻蝌,是指虛擬機棧蟹肘。虛擬機棧用于存儲局部變量等词疼。局部變量表存放了編譯期可知長度的各種基本數據類型(boolean、byte帘腹、char 贰盗、 short 、int 阳欲、 float 舵盈、 long 、double)球化、對象引用(reference類型秽晚,它不等同于對象本身是對象在堆內存的首地址)。 方法執(zhí)行完筒愚,自動釋放赴蝇。
? 方法區(qū)(Method Area),用于存儲已被虛擬機加載的類信息巢掺、常量句伶、靜態(tài)變量即時編譯器編譯后的代碼等數據。
匿名對象
我們也可以不定義對象的句柄陆淀,而直接調用這個對象的方法熄阻。這樣的對象叫做匿名對象。
?如:new Person().shout();
? 使用情況
?如果對一個對象只需要進行一次方法調用倔约,那么就可以使用匿名對象秃殉。
new Person().printInfo();
?我們經常將匿名對象作為實參傳遞給一個方法調用。
屬性與局部變量的對比
語法格式:
修飾符 數據類型 屬性名 = 初始化值 ;
? 說明1: 修飾符
? 常用的權限修飾符有:private浸剩、缺省钾军、protected、public
? 其他修飾符:static绢要、final (暫不考慮)
? 說明2 :數據類型
? 任何基本數據類型(如int吏恭、Boolean) 或 任何引用數據類型。
? 說明3 :屬性名
? 屬于標識符重罪,符合命名規(guī)則和規(guī)范即可樱哼。
方法聲明的說明
什么是方法(method 、函數):
? 方法是類或對象行為特征的抽象剿配,用來完成某個功能操作搅幅。在某些語言中
也稱為函數或過程。
? 將功能封裝為方法的目的是呼胚,可以實現(xiàn)代碼重用茄唐,簡化代碼
? Java里的方法不能獨立存在,所有的方法必須定義在類里蝇更。
public class Person {
String username;
String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public void printInfo() {
System.out.println(this.username + " " + this.password);
}
}
方法的聲明格式 :
修飾符 返回值類型 方法名 ( 參數類型 參 形參1, 參數 類型 參 形參2, …. ){
方法體程序代碼
return 返回值 值;
}
其中 :
修飾符:public, 缺省,private, protected等 等
返回 值類型:
? 沒有返回值:void沪编。 呼盆。
? 有返回值,聲明出返回值的 類型蚁廓。與方法體中“ “return ” 返回值” 搭配使用
方法名 :屬于標識符访圃,命名時遵循標識符命名規(guī)則和規(guī)范,“ 見名知意”
形參列表:可以包含零個相嵌,一個或多個 參數挽荠。多個參數時,中間用“, ”隔開
返回 值:方法在執(zhí)行完畢后返還給調用它的程序的數據平绩。
方法的調用
? 方法通過方法名被調用圈匆,且只有被調用才會執(zhí)行。
?方法調用的過程分析
注 意:
?方法被調用一次捏雌,就會執(zhí)行一次
?沒有具體返回值的情況跃赚,返回值類型用關鍵字void表示,那么方法體中可
以不必使用return語句性湿。如果使用纬傲,僅用來結束方法。
?定義方法時肤频,方法的結果應該返回給調用者叹括,交由調用者處理。
?方法中只能調用方法或屬性宵荒,不可以在方法內部定義方法汁雷。
方法的重載(overload)
重載的概念
在同一個類中,允許存在一個以上的同名方法报咳,只要它們的參數個數或者參數
類型不同即可侠讯。
重載的特點:
與返回值類型無關,只看參數列表暑刃,且參數列表必須不同厢漩。(參數個數或參數類
型)。調用時岩臣,根據方法參數列表的不同來區(qū)別溜嗜。
重載示例:
//返回兩個整數的和
int add(int x,int y){return x+y;}
//返回三個整數的和
int add(int x,int y,int z){return x+y+z;}
//返回兩個小數的和
double add(double x,double y){return x+y;}
使用重載方法,可以為編程帶來方便架谎。
? 例如炸宵,System.out.println()方法就是典型的重載方法,其內部的聲
明形式如下 :
public void println(byte x)
public void println(short x)
public void println(int x)
public void println(long x)
public void println(float x)
public void println(double x)
public void println(char x)
public void println(double x)
public void println()
//……
說明:
- 聲明格式:方法名(參數的類型名 ...參數名)
- 可變參數:方法參數部分指定類型的參數個數是可變多個:0個狐树,1個或多個
- 可變個數形參的方法與同名的方法之間焙压,彼此構成重載
- 可變參數方法的使用與方法參數部分使用數組是一致的
- 方法的參數部分有可變形參,需要放在形參聲明的最后
-
在一個方法的形參位置抑钟,最多只能聲明一個可變個數形參
方法涯曲,必須由其 所在類或對象調用才有意義。若方法含有參數:
? 形參:方法聲明時的參數
? 實參:方法調用時實際傳給形參的參數值
Java的實參值如何傳入方法呢在塔?
Java里方法的參數傳遞方式只有一種:值傳遞幻件。 即將實際參數值的副本
(復制品)傳入方法內,而參數本身不受影響蛔溃。
?形參是基本數據類型:將實參基本數據類型變量的“數據值”傳遞給形參
?形參是引用數據類型:將實參引用數據類型變量的“地址值”傳遞給形參
方法參數
方法參數傳遞
遞歸方法:一個方法體內調用它自身绰沥。
?方法遞歸包含了一種隱式的循環(huán),它會重復執(zhí)行某段代碼贺待,但這種重復執(zhí)
行無須循環(huán)控制徽曲。
?遞歸一定要向已知方向遞歸,否則這種遞歸就變成了無窮遞歸麸塞,類似于死
循環(huán)秃臣。
public int sum(int num) {
if (num == 1) {
return 1;
} else {
return num + sum(num - 1);
}
}
return 關鍵字的使用
返回當前方法需要傳遞出去的值,類型必須是方法返回值類型或是其子類
理解“萬事萬物皆對象”
所有的事物都可以抽象為類,然后再抽象為對象
封裝和隱藏
為什么需要封裝?封裝的作用和含義哪工?
? 我要用洗衣機抄沮,只需要按一下開關和洗滌模式就可以了怜跑。有必要了解洗衣機內
部的結構嗎?有必要碰電動機嗎?
? 我要開車捶箱,…
? 我們程序設計追求“高內聚,低耦合”啤咽。
? 高內聚 :類的內部數據操作細節(jié)自己完成讳癌,不允許外部干涉;
? 低耦合 :僅對外暴露少量的方法用于使用茴她。
? 隱藏對象內部的復雜性蜕径,只對外公開簡單的接口。便于外界調用败京,從而提
高系統(tǒng)的可擴展性兜喻、可維護性。通俗的說赡麦,把該隱藏的隱藏起來朴皆,該暴露
的暴露出來。這就是封裝性的設計思想泛粹。
使用者對類內部定義的屬性( 對象的成員變量) 的直接操作會導致數據的錯誤遂铡、混亂或 安全性 問題。
Java中通過將數據聲明為私有的(private)晶姊,再提供公共的(public)
方法:getXxx() 和setXxx()實現(xiàn)對該屬性的操作扒接,以實現(xiàn)下述目的:
?隱藏一個類中不需要對外提供的實現(xiàn)細節(jié);
?使用者只能通過事先定制好的方法來訪問數據,可以方便地加入控制邏輯钾怔,
限制對屬性的不合理操作碱呼;
?便于修改,增強代碼的可維護性宗侦;
public class Person {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public void printInfo() {
System.out.println(this.username + " " + this.password);
}
public int sum(int num) {
if (num == 1) {
return 1;
} else {
return num + sum(num - 1);
}
}
}
對于class的權限修飾只可以用public和default(缺省)愚臀。
? public類可以在任意地方被訪問。
? default類只可以被同一個包內部的類訪問矾利。
構造器(或構造方法)
構造 器 的特征
?它具有與類相同的名稱
?它不聲明返回值類型姑裂。(與聲明為void不同)
?不能被static、final男旗、synchronized舶斧、abstract、native修飾察皇,不能有
return語句返回值
? 構造 器 的作用: 創(chuàng)建對象茴厉;給對象進行初始化
?如:Order o = new Order(); Person p = new Person(“Peter”,15);
?如同我們規(guī)定每個“人”一出生就必須先洗澡,我們就可以在“人”的
構造器中加入完成“洗澡”的程序代碼让网,于是每個“人”一出生就會自
動完成“洗澡”呀忧,程序就不必再在每個人剛出生時一個一個地告訴他們
要“洗澡”了。
語法 格式 :
符 修飾符 名 類名 ( 參數列表) {
初始化 語句溃睹;
}
public class Person {
private String username;
private String password;
private int age ;
public Person(){
age = 18;
}
}
?根據參數不同而账,構造器可以分為如下兩類:
? 隱式無參構造器(系統(tǒng) 默認 提供)
? 顯 式 定義一個或多個 構造器(無參、有參)
?注 意:
?Java 語言中因篇,每個類都至少有一個 構造器
? 默認構造器的修飾符與所屬類的修飾符一致
? 一旦 顯式定義了 構造器泞辐, 則系統(tǒng) 不再 提供默認 構造 器
? 一個類可以創(chuàng)建多個 重載 的構造器
? 父類的構造器不可以被子類繼承
對象數組的內存解析
匿名對象的使用
在使用的時候,有時候會發(fā)現(xiàn),某個類只使用一次,創(chuàng)建一次就夠了,所以可以使用匿名對象
public class Test1 {
public static void main(String[] args) {
System.out.println(new Person().sum(100));
}
}
構造器一般用來創(chuàng)建對象的同時初始化對象
構造器重載使得對象的創(chuàng)建更加靈活,方便創(chuàng)建各種不同的對象竞滓。
構造器重載咐吼,參數列表 必須 不同
JavaBean
JavaBean是一種Java語言寫成的可重用組件。
?所謂javaBean商佑,是指符合如下標準的Java類:
?類是公共的
?有一個無參的公共的構造器
?有屬性锯茄,且有對應的get、set方法
? 用戶可以使用JavaBean將功能茶没、處理肌幽、值、數據庫訪問和其他任何可以
用Java代碼創(chuàng)造的對象進行打包抓半,并且其他的開發(fā)者可以通過內部的JSP
頁面喂急、Servlet、其他JavaBean笛求、applet程序或者應用來使用這些對象廊移。用
戶可以認為JavaBean提供了一種隨時隨地的復制和粘貼的功能糕簿,而不用關
心任何改變。
public class Person {
private String username;
private String password;
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
this的使用
在Java中狡孔,this關鍵字比較難理解懂诗,它的作用和其詞義很接近。
? 它在方法內部使用步氏,即這個方法所屬對象的引用响禽;
? 它在構造器內部使用徒爹,表示該構造器正在初始化的對象荚醒。
? this 可以調用類的屬性、方法和構造器
? 什么時候使用this關鍵字呢隆嗅?
? 當在方法內需要用到調用該方法的對象時界阁,就用this。
具體的:我們可以用this來區(qū)分屬性和局部變量胖喳。
比如:this.name = name;
- 在任意方法或構造器內泡躯,如果使用當前類的成員變量或成員方法可以在其前面添加this,增強程序的閱讀性丽焊。不過较剃,通常我們都習慣省略this。
- 當形參與成員變量同名時技健,如果在方法內或構造器內需要使用成員變量写穴,必須添加this來表明該變量是類的成員變量
3.使用this訪問屬性和方法時,如果在本類中未找到雌贱,會從父類中查找
當前正在操作本方法的對象稱為當前對象
注意:
? 可以在類的構造器中使用"this(形參列表)"的方式啊送,調用本類中重載的其
他的構造器!
? 明確:構造器中不能通過"this(形參列表)"的方式調用自身構造器
? 如果一個類中聲明了n個構造器欣孤,則最多有 n - 1個構造器中使用了
"this(形參列表)"
? "this(形參列表)"必須聲明在類的構造器的首行馋没!
? 在類的一個構造器中,最多只能聲明一個"this(形參列表)"
關鍵字 — package
package語句作為Java源文件的第一條語句降传,指明該文件中定義的類所在
的包篷朵。(若缺省該語句,則指定為無名包)婆排。它的格式為:
package 頂層包名.子包名 ;
舉例: :pack1\pack2\PackageTest.java
package pack1.pack2; //指定類PackageTest屬于包pack1.pack2
public class PackageTest{
public void display(){
System.out.println("in method display()");
}
}
? 包對應于文件系統(tǒng)的目錄声旺,package 語句中,用 “ “.” ” 包 來指明包( 目錄) 的層次泽论;
? 包通常用 小寫: 單詞標識艾少。通常使用所在公司域名的倒置:cn.icanci.xxx
包的作用:
? 包幫助管理大型軟件系統(tǒng):將功能相近的類劃分到同一個包中。比如:MVC的設計模式
? 包可以包含類和子包翼悴,劃分項目層次缚够,便于管理
? 解決類命名沖突的問題
? 控制訪問權限
MVC設計模式
MVC 設計模式
MVC是常用的設計模式之一幔妨,將整個程序分為三個層次:視圖模型層,控制器層谍椅,與
數據模型層误堡。這種將程序輸入輸出、數據處理雏吭,以及數據的展示分離開來的設計模式
使程序結構變的靈活而且清晰锁施,同時也描述了程序各個對象間的通信方式,降低了程序的耦合性杖们。
模型層 model 主要處理數據
數據對象封裝 model.bean/domain
數據庫操作類 model.dao
數據庫 model.db
視圖層 view 顯示數據
相關工具類 view.utils
自定義view view.ui
控制層 controller 處理業(yè)務邏輯
應用界面相關 controller.activity
存放fragment controller.fragment
顯示列表的適配器 controller.adapter
服務相關的 controller.service
抽取的基類 controller.base
MVC
DK 中主要的包介紹
- java.lang----包含一些Java語言的核心類悉抵,如String、Math摘完、Integer姥饰、 System和Thread,提供常用功能
- java.net----包含執(zhí)行與網絡相關的操作的類和接口孝治。
- java.io ----包含能提供多種輸入/輸出功能的類列粪。
- java.util----包含一些實用工具類,如定義系統(tǒng)特性谈飒、接口的集合框架類岂座、使用與日期日歷相關的函數。
- java.text----包含了一些java格式化相關的類
- java.sql----包含了java進行JDBC數據庫編程的相關類/接口
- java.awt----包含了構成抽象窗口工具集(abstract window toolkits)的多個類杭措,這些類被用來構建和管理應用程序的圖形用戶界面(GUI)费什。 B/S C/S
關鍵字—import
注意:
- 在源文件中使用import顯式的導入指定包下的類或接口
- 聲明在包的聲明和類的聲明之間。
- 如果需要導入多個類或接口瓤介,那么就并列顯式多個import語句即可
- 舉例:可以使用java.util.*的方式吕喘,一次性導入util包下所有的類或接口。
- 如果導入的類或接口是java.lang包下的刑桑,或者是當前包下的氯质,則可以省略此import語句。
- 如果在代碼中使用不同包下的同名的類祠斧。那么就需要使用類的全類名的方式指明調用的
是哪個類闻察。 - 如果已經導入java.a包下的類。那么如果需要使用a包的子包下的類的話琢锋,仍然需要導入辕漂。
- import static組合的使用:調用指定類或接口下的靜態(tài)的屬性或方法