面向?qū)ο?/p>
面向?qū)ο笫且环N思考問題的方式泰涂,以對(duì)象的形式來思考問題
類:是對(duì)象描述 鲫竞,類是對(duì)象的抽象(抽象:提取對(duì)象的共性)
對(duì)象:是實(shí)實(shí)在在存在的個(gè)體,它是類具體實(shí)現(xiàn)负敏,也叫做類的實(shí)例
對(duì)象創(chuàng)建的過程(new 類名())贡茅,叫做對(duì)象的實(shí)例化
類的定義:
[修飾符] class 類名
{
構(gòu)造器 //對(duì)應(yīng)的是對(duì)象的創(chuàng)建方式
成員變量 //對(duì)應(yīng)的是對(duì)象的屬性
成員方法 //對(duì)應(yīng)的是對(duì)象的行為(功能)
}
構(gòu)造器(構(gòu)造方法,構(gòu)造函數(shù)):
如果不提供有參數(shù)的構(gòu)造器其做,jvm會(huì)提供一個(gè)默認(rèn)的無參構(gòu)造器
[修飾符] 類名()
{
方法體
}
如果類中提供了有參構(gòu)造器顶考,則jvm就不再提供無參構(gòu)造器,如果需要使用無參構(gòu)造妖泄,則需要自己定義
有參構(gòu)造器
[修飾符] 類名(參數(shù)數(shù)據(jù)類型 參數(shù)名...)
{ }
如果一個(gè)類中同時(shí)存在驹沿,無參構(gòu)造器和多個(gè)有參構(gòu)造器,這個(gè)叫做構(gòu)造器的重載
成員變量:
存在于類中蹈胡,但是處于成員方法以外
作用域: 從聲明的地方開始渊季,到類的結(jié)束
成員變量是有默認(rèn)值(缺省值)的,根據(jù)數(shù)據(jù)類型的不同罚渐,初始值是不同却汉,如果是int類型的, 初始值是0 ,如果是引用類型荷并,初始是null
成員變量合砂,可以用修飾符修飾
局部變量:
存在于成員方法中,注意:參數(shù)是特殊的局部變量
作用域:從聲明的地方開始源织,到方法的結(jié)束
局部變量沒有默認(rèn)值
只能用final修飾
成員方法:
[修飾符] void|返回值的數(shù)據(jù)類型 方法名([參數(shù)類型 參數(shù)名 , ...])
{
方法體 也叫作代碼塊
}
對(duì)象的創(chuàng)建和使用
對(duì)象的創(chuàng)建
類名 對(duì)象名 = new 類名([參數(shù),...]);
對(duì)象的使用
獲得對(duì)象的屬性
數(shù)據(jù)類型 變量名 = 對(duì)象名.屬性名
修改對(duì)象的屬性
對(duì)象名.屬性名 = 屬性值 ;
調(diào)用對(duì)象的方法
對(duì)象名.方法名();
方法的重載
1翩伪,在同一個(gè)類中
2,方法名相同
3谈息,參數(shù)不同:參數(shù)個(gè)數(shù)缘屹,參數(shù)順序,參數(shù)類型 (滿足其中之一侠仇,則視為參數(shù)不同)
this關(guān)鍵字的使用
每一個(gè)類中都有兩個(gè)特殊的成員變量轻姿,一個(gè)是this,一個(gè)是super
this 里面存儲(chǔ)的當(dāng)當(dāng)前對(duì)象的地址 ,代表就是當(dāng)前對(duì)象
this有兩個(gè)用法:
1逻炊,當(dāng)成員變量名和局部變量名發(fā)生沖突的時(shí)候踢代,可以使用 this.變量名 標(biāo)注成員變量
2,當(dāng)一個(gè)構(gòu)造器需要調(diào)用本類的其他構(gòu)造器時(shí)嗅骄,可以使用this()進(jìn)行調(diào)用胳挎,但是this()必須寫在構(gòu)造器方法體的第一行
static(靜態(tài)的)是修飾符,可以用來修飾成員變量和成員方法
static 修飾成員變量
有static修飾的成員變量叫做類變量 也叫做 類成員變量 也叫做靜態(tài)變量
沒有static修飾的成員變量 叫做實(shí)例變量 這里的實(shí)例指的是對(duì)象
有static修改的成員變量溺森,是所有對(duì)象共有的變量
使用及修改需要 用類名.變量名
static 修飾成員方法
有static修飾的成員方法叫做類方法慕爬,也叫做靜態(tài)方法
沒有static修飾的成員方法叫做實(shí)例方法 這里的實(shí)例指的是對(duì)象
有static修飾的成員方法是所有該類對(duì)象共有的方法
調(diào)用的時(shí)候,可以使用對(duì)象名.方法名(); 也可以使用類名.方法名();
java程序的運(yùn)行屏积,首先jvm將class文件加載到j(luò)vm中医窿,這時(shí)會(huì)同時(shí)把靜態(tài)變量和靜態(tài)方法同時(shí)加載到j(luò)vm
當(dāng)創(chuàng)建該類對(duì)象的時(shí)候,jvm才會(huì)加載實(shí)例變量和實(shí)例方法
靜態(tài)方法可以訪問靜態(tài)變量和靜態(tài)方法炊林,但是不能訪問實(shí)例變量和實(shí)例方法
實(shí)例方法可以訪問靜態(tài)方法和靜態(tài)變量也可以訪問實(shí)例方法和實(shí)例變量 即 實(shí)例方法可以訪問類中所有的變量及方法
static 修飾代碼塊
代碼塊:一般用作初始化工作
{ 代碼 }
有static修飾的代碼塊姥卢,叫靜態(tài)代碼塊,一般用于初始化一些靜態(tài)的變量
靜態(tài)代碼塊,在class文件被加載時(shí)執(zhí)行独榴,程序運(yùn)行期間僧叉,只會(huì)執(zhí)行一次
當(dāng)?shù)谝淮蝿?chuàng)建對(duì)象的時(shí)候,執(zhí)行順序是
先加載class文件棺榔,然后是按照順序 加載靜態(tài)變量瓶堕,靜態(tài)方法,靜態(tài)代碼塊(這里的順序指的是源文件的編碼的順序)
然后會(huì)執(zhí)行一次靜態(tài)代碼塊
然后按照順序 執(zhí)行實(shí)例代碼塊
創(chuàng)建對(duì)象的時(shí)候是先執(zhí)行實(shí)例代碼塊再執(zhí)行構(gòu)造器
沒有static修飾的代碼塊症歇,叫做實(shí)例代碼塊郎笆,一般用于初始化工作
實(shí)例代碼塊,每次創(chuàng)建對(duì)象時(shí)忘晤,都會(huì)執(zhí)行一次
引用:
Person p = new Person() ;
這個(gè)p就是一個(gè)引用數(shù)據(jù)宛蚓,其實(shí)p里存的不是真正的對(duì)象,而是對(duì)象在內(nèi)存中的地址
Java中的內(nèi)存 棧 堆 方法區(qū)
棧中的數(shù)據(jù):如果是基本數(shù)據(jù)類型设塔,則存儲(chǔ)的是數(shù)據(jù)
如果是引用數(shù)據(jù)類型凄吏,則存儲(chǔ)的是地址
所有的方法的運(yùn)行都是在棧中,每運(yùn)行一個(gè)方法壹置,jvm就會(huì)在棧內(nèi)存開辟一個(gè)空間竞思,用來存儲(chǔ)方法中的變量
引用數(shù)據(jù)類型,在棧中存儲(chǔ)的是一個(gè)地址钞护,這個(gè)地址指向的是對(duì)象在堆內(nèi)存中的實(shí)際位置
每創(chuàng)建一個(gè)新的對(duì)象盖喷,jvm就會(huì)在堆內(nèi)存中去開辟一個(gè)空間,存放該對(duì)象的屬性难咕,而方法存在于方法區(qū)
Java中的引用數(shù)據(jù)類型有哪些?
數(shù)組课梳,類,接口
思考:數(shù)組中數(shù)余佃,存在哪? //在堆內(nèi)存中
int a = {1,2,3,4,5,6} ;
棧內(nèi)存中的a的值是什么? 是地址 指的是數(shù)組中的數(shù)在堆內(nèi)存中的實(shí)際的位置
引用
Person p = new Person() ;
p 中存儲(chǔ)的是對(duì)象在內(nèi)存中的地址
程序運(yùn)行過程中暮刃,一旦新建對(duì)象,那么該對(duì)象時(shí)存儲(chǔ)在堆內(nèi)存中
方法的運(yùn)行都是在棧內(nèi)存中爆土,每運(yùn)行一個(gè)方法椭懊,jvm就會(huì)在棧內(nèi)存中開辟一個(gè)空間,用于存儲(chǔ)該方法運(yùn)行時(shí)產(chǎn)生的變量
如果變量的數(shù)據(jù)類型是基本數(shù)據(jù)類型 則存儲(chǔ)的是真實(shí)數(shù)據(jù)
如果變量的數(shù)據(jù)類型是引用數(shù)據(jù)類型 則存儲(chǔ)的是數(shù)據(jù)在堆內(nèi)存中的地址
this 關(guān)鍵字
Java的類中有兩個(gè)特殊的成員變量步势,一個(gè)是this,代表當(dāng)前對(duì)象的引用氧猬,this中存放的是當(dāng)前對(duì)象的地址
另一個(gè)是super 代表的是當(dāng)前對(duì)象的父類對(duì)象 super中存放的是當(dāng)前對(duì)象的父類對(duì)象在堆內(nèi)存中的地址
this關(guān)鍵字的作用:
1,當(dāng)類中的成員變量和局部變量重名時(shí)坏瘩,可以通過this.變量名來標(biāo)注成員變量
2盅抚,當(dāng)一個(gè)構(gòu)造器需要調(diào)用類中其他的構(gòu)造器時(shí),可以使用this([參數(shù)...])來進(jìn)行調(diào)用
注意:構(gòu)造器只能被構(gòu)造器所調(diào)用倔矾,不能再成員方法中調(diào)用構(gòu)造器
如果一個(gè)構(gòu)造器需要調(diào)用另一個(gè)構(gòu)造器妄均,則this([參數(shù)....])必須位于構(gòu)造器方法體中的第一行
static關(guān)鍵字 就是一個(gè)修飾符 可以用來修飾成員變量柱锹,成員方法,代碼塊丰包,類
static修飾成員變量
有static修飾的成員變量叫類變量 也叫做 靜態(tài)變量 是該類所有對(duì)象共享的變量 調(diào)用方法推薦使用類名.變量名
沒有static修飾的成員變量叫做實(shí)例變量 這里的實(shí)例指的是對(duì)象
static修飾成員方法
有static修飾的成員方法叫做類方法禁熏,也叫做靜態(tài)方法,是該類所有對(duì)象共享的方法 烫沙,調(diào)用 推薦使用 類名.方法名([參數(shù)...]);
沒有static修飾的成員方法叫做實(shí)例方法匹层,調(diào)用 對(duì)象名.方法名([參數(shù)....]);
static修飾代碼塊
有static修飾的代碼塊叫做靜態(tài)代碼塊隙笆,主要就是用來做一些初始化工作锌蓄,比如初始化靜態(tài)變量
在程序運(yùn)行的整個(gè)過程中,只會(huì)執(zhí)行一次
沒有static修飾的代碼塊叫做實(shí)例代碼塊撑柔,主要用于一些初始化的工作瘸爽,比如初始化實(shí)例變量
每創(chuàng)建一個(gè)對(duì)象,就會(huì)執(zhí)行一次
實(shí)例代碼塊和構(gòu)造器誰先執(zhí)行? 代碼塊先執(zhí)行
注意:
1铅忿,靜態(tài)代碼塊剪决,靜態(tài)方法只能訪問靜態(tài)變量,靜態(tài)方法檀训,不能訪問實(shí)例方法柑潦,實(shí)例變量
2,實(shí)例方法峻凫,實(shí)例代碼塊 可以訪問該類中所有的方法及變量
jvm類加載流程
程序運(yùn)行時(shí)渗鬼,是先加載class文件,同時(shí)加載的還有該class文件中的靜態(tài)變量荧琼,靜態(tài)方法譬胎,靜態(tài)代碼塊
當(dāng)創(chuàng)建對(duì)象時(shí),jvm才會(huì)分配空間命锄,加載實(shí)例變量堰乔,實(shí)例方法,實(shí)例代碼塊
在整個(gè)程序運(yùn)行的過程中脐恩,一個(gè)class文件只會(huì)被加載一次
包:是Java語言當(dāng)中用來管理類镐侯,接口等源文件的一個(gè)管理工具。
包的使用和聲明:
包的聲明:
package 包名;
1,包名一般采用多級(jí)包名;package com ; 一級(jí)包名 package com.zdsoft; 二級(jí)包名
2,包名一般使用小寫字母
3,包名不能以java和javax開頭
4驶冒,一般情況主包名采用的是倒置的域名+項(xiàng)目名稱+功能名稱 比如:com.huawei.netopen.util com.zdsoft.qq.login
5,包的聲明語句必須位于源文件的第一行
包的導(dǎo)入:
什么時(shí)候需要導(dǎo)入包?
當(dāng)一個(gè)包里面的類需要引用另外一個(gè)包里面的類時(shí)苟翻,就需要導(dǎo)入 關(guān)鍵字 import
語法:
import 包名.類名|接口名; //這是導(dǎo)入指定包中的指定的類 或者指定的接口名
import 包名.* ; //這是導(dǎo)入指定包中的所有的類和接口
注意:導(dǎo)包語句寫在源文件 聲明包名之后,聲明類之前;
訪問權(quán)限修飾符
private 修飾的成員方法和成員變量不能被其他類訪問只怎,本類中可以訪問
也就是說袜瞬,如果你在其他的類中創(chuàng)建了該類對(duì)象,那么身堡,這個(gè)對(duì)象是不能調(diào)用以private修飾的所有的成員方法和變量
(default) 如果成員變量和成員方法前面沒有訪問權(quán)限修飾符 則 默認(rèn)為default
被default修飾的成員變量和成員方法邓尤,只能被本類和與其在同一個(gè)包中的其他類訪問
protected 被該修飾符修飾的成員變量和成員方法可以被本類和與其在同一個(gè)包中的其他類以及不與其在同一個(gè)包中的子類訪問
public 被該修飾符修飾的成員變量和成員方法可以被所有的類訪問
final修飾符 (final的中文意思 :最終的)
被final修飾的變量最多只能被賦值一次
被final修飾的變量一經(jīng)賦值,則不能再被改變
final int a = 10 ;
a = 20 ; //這是錯(cuò)誤的
被final修飾的成員變量,成員必須賦初始值汞扎,一經(jīng)賦值則不能被改變
被final修飾的局部變量季稳,可以先聲明,等到使用的時(shí)候再賦值澈魄,但是只能被賦值一次
面向?qū)ο蟮娜筇攸c(diǎn)
封裝景鼠,繼承,多態(tài)
封裝:
這里講的封裝痹扇,主要是對(duì)屬性和方法的封裝铛漓,
對(duì)屬性的封裝:
需要把屬性私有化,然后對(duì)外提供公共的訪問方法
對(duì)方法的封裝:
將外部可以訪問的方法使用public修飾鲫构,將外部不能訪問的方法使用private修飾
繼承:
將多個(gè)具有相同屬性和行為的類的相同的屬性和行為抽取出來浓恶,封裝到一個(gè)單獨(dú)的類中,
這時(shí)结笨,具有相同屬性和行為的類就不必要重復(fù)的編寫這些行為和屬性包晰,只需要繼承封裝后的那一個(gè)新類就能擁有這些屬性和行為
這些具有相同屬性和行為的類叫做子類,封裝的新類叫做父類或者超類
如:狗 , 貓 , 豬 都有共同的屬性 性別炕吸,年齡 伐憾,都有共同行為 吃 ,睡
就將這些相同的屬性和行為抽取出來赫模,封裝一個(gè)新類 動(dòng)物
動(dòng)物 有性別 树肃,年齡 等屬性 有 吃,睡等行為
此時(shí):狗只需要繼承動(dòng)物 就可以擁有動(dòng)物的屬性和行為
語法
[修飾符] class 狗 extends 動(dòng)物
{ }
注意:子類不能繼承父類私有的屬性和方法
子類除了能夠擁有父類非私有的屬性和方法外嘴瓤,還有可以擴(kuò)展自己特有的屬性和方法
包的創(chuàng)建和使用
包:是Java語言中用來管理類扫外,接口等源文件的一個(gè)管理工具,類似于windows系統(tǒng)中的文件夾
包的聲明:
package 包名 ;
聲明包時(shí)需要注意的點(diǎn):
1廓脆,采用多級(jí)包名
2筛谚,一般使用小寫字母
3,包名不能以java或javax開頭
4停忿,一般情況主包名采用的是倒置的域名.工程名.功能名
5,包的聲明語句必須位于源文件的第一行
包的導(dǎo)入:
需要使用關(guān)鍵字 import
import 包名.類名|接口名 ; //導(dǎo)入指定包中指定的類或者接口
import 包名.* ; //導(dǎo)入指定包中所有的類和接口
什么時(shí)候需要導(dǎo)入包?
當(dāng)一個(gè)包里面的類驾讲,需要引用另一個(gè)包里面的類時(shí),則需要導(dǎo)入包
訪問修飾符 (public private (default) protected)
private 私有的席赂,由private修飾的變量和方法只能在本類中被訪問
default 默認(rèn)的(當(dāng)變量及方法沒有訪問權(quán)限修飾符時(shí)則默認(rèn)為default)吮铭, 由default修飾的變量和方法可以在本類訪問以及與其在同一個(gè)包中的其他類訪問
protected 受保護(hù)的 在default的基礎(chǔ)上,增加了其他包中的繼承了該類的子類
public 公共的 可以被其他所有的類方問
final修飾符(中文含義:最終的)
被final修飾的變量最多只能被賦值一次颅停,一經(jīng)賦值就不能改變
封裝
對(duì)方法和屬性的封裝
對(duì)屬性的封裝:
將屬性私有化谓晌,然后對(duì)外提供公共訪問接口 提供 get set方法
對(duì)方法的封裝:
將你不愿意提供給外界訪問的方法私有化(用private修飾),希望外界訪問的方法共有化(用public修飾)
繼承
父類是子類的抽象
把具有相同屬性和行為的多個(gè)類的相同的屬性和行為抽取出來癞揉,封裝成一個(gè)新的類纸肉,
這個(gè)新的類叫做父類溺欧,這具有相同屬性和行為的多個(gè)類叫做子類,需要繼承父類柏肪。
繼承的語法
[修飾符] class 子類名 extends 父類名
{
}
子類可以有自己擴(kuò)展的屬性和方法
繼承的特點(diǎn):
1姐刁,Java語言當(dāng)中,如果一個(gè)類沒有明確的指出它父類烦味,那么默認(rèn)繼承的Object類
2聂使,Java語言當(dāng)中,類的繼承只支持單繼承谬俄,即一個(gè)類只能有一個(gè)直接父類 extends 后只跟一個(gè)父類名
3柏靶,Java語言當(dāng)中,支持多層繼承
4凤瘦,Java語言當(dāng)中宿礁,子類只能繼承父類非私有的屬性和方法案铺,不能繼承父類的構(gòu)造器
注意:
1蔬芥,不要為了獲得某個(gè)類中的功能,而去繼承這個(gè)類
2控汉,繼承關(guān)系中笔诵,類與類之間一定要有所屬關(guān)系,如:狗是動(dòng)物的一種姑子,動(dòng)物是生物的一種
包對(duì)于繼承的影響(關(guān)系到訪問權(quán)限修飾符)
private 修飾的屬性和方法是私有的乎婿,只能在本類訪問,不能繼承
default 修飾的屬性和方法街佑,可以被本類訪問谢翎,可以被同包內(nèi)中的其他類所訪問 能同包內(nèi)中的子類所繼承
protected 修飾的屬性和方法,在default的基礎(chǔ)上沐旨,增加了可以被其他包中的子類繼承
public 修飾的屬性和方法森逮,可以被任意類訪問
子類對(duì)象的創(chuàng)建流程
當(dāng)新創(chuàng)建一個(gè)子類對(duì)象時(shí),實(shí)際上是先調(diào)用了父類的無參構(gòu)造器磁携,然后才調(diào)用了子類自身的構(gòu)造器
每一個(gè)子類構(gòu)造器中默認(rèn)的第一行有隱式調(diào)用父類的無參構(gòu)造器
如果父類只提供了有參的構(gòu)造器褒侧,那么子類需要在每一個(gè)構(gòu)造器的第一行顯示的調(diào)用父類的有參構(gòu)造器
super關(guān)鍵字
每一個(gè)類中都有兩個(gè)特殊的成員變量,一個(gè)是this 代表當(dāng)前對(duì)象谊迄,一個(gè)是super闷供,代表的父類對(duì)象
this有兩個(gè)作用:
當(dāng)成員變量和局部變量發(fā)生沖突的時(shí)候,可以使用this.變量名來標(biāo)注成員變量
當(dāng)一個(gè)構(gòu)造器中需要調(diào)用本類的另一個(gè)構(gòu)造器時(shí)统诺,可以使用this([參數(shù)]);來進(jìn)行調(diào)用歪脏,但是this()必須寫在構(gòu)造器的方法體的第一行
super的作用:
1,當(dāng)子類中的變量和父類中的成員變量重名時(shí)粮呢,可以使用super.變量名來標(biāo)注 父類的成員變量
2婿失,當(dāng)子類的構(gòu)造器調(diào)用父類的構(gòu)造器時(shí)怠硼,使用super([參數(shù)]); 注意:super()必須寫在子類構(gòu)造器方法體中的第一行
所以不能同時(shí)顯式的存在super(),this()。
3移怯,當(dāng)在子類的方法香璃,需要調(diào)用父類的方法時(shí),super.父類方法名([參數(shù)]);
方法的重寫 override
當(dāng)子類從父類繼承過來的方法舟误,無法滿足子類的功能需求時(shí)葡秒,子類需要對(duì)該方法進(jìn)行重新實(shí)現(xiàn),這個(gè)個(gè)過程叫做方法的重寫嵌溢,也叫做方法的覆蓋眯牧,或者復(fù)寫
方法重寫的條件:
1,一個(gè)類需要重寫另一個(gè)類中的方法赖草,那么它們一定要有繼承關(guān)系
2学少,子類中重寫的方法的訪問權(quán)限修飾符的權(quán)限一定要大于等于父類方法的訪問權(quán)限
3,子類重寫的方法的方法名秧骑,參數(shù)列表版确,返回值的數(shù)據(jù)類型必須和父類保持一致
多態(tài):就是指的是一個(gè)事物多種形態(tài)
方法的多態(tài)
方法的重載(發(fā)生在本類中)
方法的重寫(發(fā)生在繼承中)
變量的多態(tài)(這里主要指對(duì)象的多態(tài))
1,向上轉(zhuǎn)型
父類變量 Father f ; 既可以保存父類對(duì)象的引用乎折,也可以保存子類對(duì)象引用
Father (父類) Son(子類)
Father f ;
Son s = new Son();
f = s ;
注意:當(dāng)對(duì)象發(fā)生向上轉(zhuǎn)型時(shí)绒疗,只會(huì)保留父類中可以被繼承的方法和變量,子類重寫的方法會(huì)保留
2骂澄,向下轉(zhuǎn)型
子類變量可以存儲(chǔ)子類對(duì)象的引用吓蘑,也可以存儲(chǔ)父類對(duì)象的引用
注意:如果需要進(jìn)行向下轉(zhuǎn)型,則應(yīng)該先進(jìn)行向上轉(zhuǎn)型
抽象方法:
當(dāng)父類中的方法不確定子類應(yīng)該實(shí)現(xiàn)什么樣的功能時(shí)坟冲,可以把這個(gè)方法聲明為抽象方法
抽象方法的聲明語法:
[修飾符(public)] abstract void|返回值數(shù)據(jù)類型 方法名([參數(shù)類型 參數(shù)名]);
注意:抽象方法必須存在于抽象類中磨镶,抽象方法沒有方法體
抽象類的聲明語法:
[修飾符(public)] abstract class 類名
{
成員變量
成員方法(可以是抽象的,也可以不是抽象的)
代碼塊
}
抽象類使用注意點(diǎn):
1,抽象類不能被實(shí)例化(不能創(chuàng)建對(duì)象健提, 不能 new)
2,抽象類就是用來被繼承的
3,抽象類中可以沒有抽象方法琳猫,但是抽象方法一定要存在于抽象類中
4,抽象類中可以存在具象方法(有方法體的方法)
5矩桂,抽象類的子類必須實(shí)現(xiàn)(重寫)抽象類中的所有的抽象方法沸移,否則子類就需要聲明為抽象類
6,抽象方法被重寫的時(shí)候侄榴,需要去掉關(guān)鍵字abstract雹锣,并為方法加上方法體