五、Java類(lèi)和對(duì)象
1、概述
1.1、基本概念
類(lèi)是具有相同屬性和行為的一組對(duì)象的集合
,包含數(shù)據(jù)和操作,數(shù)據(jù)被稱(chēng)為成員變量
,操作被稱(chēng)為方法
對(duì)象是類(lèi)的實(shí)例,即對(duì)象 = 數(shù)據(jù) + 行為
或者對(duì)象 = 狀態(tài) + 操作
類(lèi)抽象的、概念上的定義,對(duì)象是一個(gè)具體的、實(shí)際存在的個(gè)體,即一個(gè)實(shí)例
1.2、類(lèi)的特性
封裝:提供多種訪問(wèn)的權(quán)限,目的是:隱藏類(lèi)中成員變量和方法的細(xì)節(jié)
繼承:提供從已存在的類(lèi)創(chuàng)建新的類(lèi)的機(jī)制
多態(tài):方法執(zhí)行的多樣性,表現(xiàn)為:覆蓋和重寫(xiě)
1.3、定義類(lèi)
Java程序設(shè)計(jì)的基本單位就是類(lèi),Java源文件就是由若干個(gè)類(lèi)構(gòu)成的
// 格式
聲明類(lèi){
成員變量的聲明
方法的聲明及實(shí)現(xiàn)
構(gòu)造方法
代碼塊
內(nèi)部類(lèi)
}
// 定義類(lèi)的格式
[修飾符] [abstract|finally] class 類(lèi)名 [extends 父類(lèi)] [implements 接口列表]{ // 注:修飾符:省略 或者 public
// 聲明成員變量
[修飾符] [static] [final] 數(shù)據(jù)類(lèi)型 成員變量名 [ = 表達(dá)式] // static: 類(lèi)成員變量 ;final: 常用于聲明常量
// 注:修飾符:public、private、protected、省略
// 盡可能用private
// 聲明方法
[修飾符] [static] [finally] 返回值類(lèi)型 方法名([參數(shù)列表]) [throws 異常類(lèi)]{
語(yǔ)句序列
[return [返回值]]
}
// 注:修飾符:public、private、protected、省略
// throws 異常類(lèi):聲明方法拋出指定異常
}
1.4、變量
1.4.1、分類(lèi)
名稱(chēng) | 定義位置 | 作用域 |
---|---|---|
成員變量 | 在類(lèi)中聲明 | 整個(gè)類(lèi) |
局部變量 | 在方法中聲明 | 該方法 |
1.4.2、補(bǔ)充
對(duì)成員變量的操作只能在方法中
在一個(gè)確定的域中,變量名應(yīng)該是唯一的
1.4.3、成員變量和局部變量的區(qū)別
成員變量 | 局部變量 | |
---|---|---|
訪問(wèn)權(quán)限 | 整個(gè)類(lèi)都可以訪問(wèn) | 只在所屬區(qū)域有效 |
內(nèi)存位置 | 堆內(nèi)存 | 棧內(nèi)存 |
默認(rèn)值 | 有 | 無(wú) |
存在時(shí)間 | 隨著對(duì)象的創(chuàng)建存在,隨著對(duì)象的刪除消失 | 隨著所屬區(qū)域的結(jié)束釋放 |
2、基本操作
2.1、創(chuàng)建對(duì)象的步驟
2.1.1、對(duì)象的聲明
聲明完后,無(wú)實(shí)體,不能調(diào)用,僅僅在棧內(nèi)存中開(kāi)辟了一個(gè)空間
// 格式
類(lèi)名 對(duì)象名;
Mydate data;
2.1.2、實(shí)例化
在堆中開(kāi)辟了空間,可以調(diào)用
// 格式
對(duì)象名 = new 類(lèi)名([參數(shù)列表])
//也可聲明和實(shí)例合成一步
類(lèi)名 對(duì)象名 = new 類(lèi)名([參數(shù)列表])
2.2、使用對(duì)象
對(duì)象時(shí)一種引用型變量,變量中存放著引用,指向堆中的地址
2.3、構(gòu)造方法
創(chuàng)建對(duì)象時(shí)自動(dòng)調(diào)用,名字與所在類(lèi)完全相同,不會(huì)被子類(lèi)繼承
3、成員變量
靜態(tài)成員變量 | 普通成員變量 | |
---|---|---|
別名 | 類(lèi)成員變量 | 實(shí)例成員變量 |
形式區(qū)別 | 有static修飾 | 無(wú)static修飾 |
存儲(chǔ)位置 | 方法區(qū)(共享區(qū)域區(qū))的靜態(tài)區(qū) | 堆內(nèi)存中 |
對(duì)該類(lèi)的所有對(duì)象都一致 | 區(qū)分同一類(lèi)創(chuàng)建的各個(gè)對(duì)象 | |
調(diào)用方式 | 類(lèi)名和對(duì)象都可調(diào)用 | 只能被對(duì)象調(diào)用 |
4、靜態(tài)初始化塊
不包含在任何方法體中
當(dāng)類(lèi)被載入時(shí),靜態(tài)代碼塊被執(zhí)行,且只執(zhí)行一次
可以用來(lái)進(jìn)行初始化
類(lèi)是在第一次被使用時(shí)進(jìn)行載入
class A{
static{
//靜態(tài)代碼塊
}
}
5、成員變量初始化順序
靜態(tài)成員變量定義時(shí)直接給出初始值 > 靜態(tài)初始化 > 實(shí)例成員變量定義時(shí)給出初始值 > 初始化塊 > 構(gòu)造方法
6、方法
實(shí)例方法 | 類(lèi)方法 | |
---|---|---|
區(qū)別 | 除構(gòu)造方法外的其他方法 | 聲明時(shí)使用static修飾 |
調(diào)用 | 可以調(diào)用類(lèi)方法和實(shí)例方法 | 只能調(diào)用類(lèi)方法 |
操作 | 可以操作類(lèi)成員變量和實(shí)例成員變量 | 只能操作類(lèi)成員變量 |
只能被對(duì)象調(diào)用 | 類(lèi)和對(duì)象都可調(diào)用 |
7、匿名對(duì)象
不定義對(duì)象的引用,直接調(diào)用這個(gè)對(duì)象的方法的對(duì)象
new 類(lèi)名().方法名();
用處:
1、該對(duì)象只使用一次
2、將匿名對(duì)象作為實(shí)參傳遞給一個(gè)方法調(diào)用
8、this引用
代指使用當(dāng)前對(duì)象的成員變量
不可以出現(xiàn)在類(lèi)方法中
// 使用this調(diào)用本類(lèi)重載的構(gòu)造方法時(shí),this()必須是第一條語(yǔ)句
class Person{
int age;
Person(int age){
this.age = age;
}
Person(){
this(30);
this.age = 20;
}
}
9、繼承
9.1、基本概念
由已有的類(lèi)創(chuàng)建新的類(lèi)的機(jī)制
Java不支持多重繼承,即一個(gè)類(lèi)只能由一個(gè)父類(lèi)
若沒(méi)有聲明父類(lèi),默認(rèn)繼承Object類(lèi)
// 格式
[修飾符] class 子類(lèi)名 [extends 父類(lèi)名]{
}
9.2、繼承原則
1、子類(lèi)繼承父類(lèi)的成員變量
2、子類(lèi)繼承父類(lèi)除構(gòu)造方法外的方法
3、子類(lèi)可以增加自己的成員變量和方法
4、子類(lèi)可以重新定義父類(lèi)的成員變量賀方法
5、子類(lèi)不能刪除父類(lèi)的成員變量和方法
6、重寫(xiě)時(shí),重寫(xiě)后的方法不能擁有比重寫(xiě)前更嚴(yán)格的訪問(wèn)權(quán)限、不能比被重寫(xiě)前產(chǎn)生更多的異常
9.3、補(bǔ)充
this代表本類(lèi)對(duì)象的引用
super代表一個(gè)父類(lèi)空間
9.4、super
1、調(diào)用被子類(lèi)隱藏的成員變量和方法
2、調(diào)用父類(lèi)的構(gòu)造方法,必須在子類(lèi)的構(gòu)造方法中使用,且必須是子類(lèi)構(gòu)造方法的第一條
,本質(zhì)上來(lái)說(shuō)并不是創(chuàng)建一個(gè)“獨(dú)立的父類(lèi)“,而是為了完成當(dāng)前對(duì)象的父類(lèi)型特征的初始化操作
9.5、訪問(wèn)控制
類(lèi)的訪問(wèn)權(quán)限:public、缺省
public | protected | default | private | |
---|---|---|---|---|
當(dāng)前類(lèi)的方法 | √ | √ | √ | √ |
同一包內(nèi) | √ | √ | √ | × |
其他包內(nèi)的繼承類(lèi) | √ | √ | × | × |
其他包內(nèi)的非繼承類(lèi) | √ | × | × | × |
10、多態(tài)
方法的多態(tài):方法的重寫(xiě)、方法的重載
類(lèi)型的多態(tài):子類(lèi)是一種父類(lèi)類(lèi)型
10.1、類(lèi)型的多態(tài)
父類(lèi)引用能夠被賦值為子類(lèi)對(duì)象,反之則不行
父類(lèi) = 父類(lèi)
父類(lèi) = 子類(lèi)
子類(lèi) = 父類(lèi)
10.2、上轉(zhuǎn)型對(duì)象
zi是fu的子類(lèi)或者間接子類(lèi),當(dāng)用子類(lèi)zi創(chuàng)建一個(gè)對(duì)象,并把這個(gè)對(duì)象的引用放到父類(lèi)聲明的對(duì)象中時(shí),稱(chēng)這個(gè)對(duì)象是子類(lèi)zi對(duì)象的上轉(zhuǎn)型對(duì)象,上轉(zhuǎn)型對(duì)象的實(shí)體是子類(lèi)負(fù)責(zé)創(chuàng)建的,但上轉(zhuǎn)型對(duì)象會(huì)失去原對(duì)象(子類(lèi))的一些成員變量和功能
上轉(zhuǎn)型對(duì)象的成員變量同父類(lèi)
一致
上轉(zhuǎn)型對(duì)象的方法同子類(lèi)
一致
11、abstract類(lèi)和final類(lèi)
// abstract修飾的類(lèi)稱(chēng)為抽象類(lèi)
abstract class A{
}
// final類(lèi)不能被繼承,即不能有子類(lèi)
final class A{
}
11.1、abstract類(lèi)
特點(diǎn):
1、構(gòu)造方法、類(lèi)方法不能被聲明為抽象方法
2、抽象方法只允許聲明,不允許實(shí)現(xiàn),而且不允許同時(shí)使用final和abstract
3、不能用new運(yùn)算符創(chuàng)建對(duì)象:如果一個(gè)非抽象類(lèi)是某個(gè)抽象類(lèi)的子類(lèi),則必須重寫(xiě)全部抽象方法為不使用abstract修飾的方法
11.2、final關(guān)鍵字
修飾類(lèi) | 不能被繼承 |
---|---|
修飾成員變量 | 不能改變,通常與static同時(shí)使用,定義一個(gè)常量 |
修飾方法 | 不能被重寫(xiě) |
11.3、final類(lèi)
// 聲明最終類(lèi)
public final class 類(lèi)名
// 聲明最終方法
public final 返回類(lèi)型 方法名([參數(shù)列表])
12、接口
12.1、基本操作
可以增加很多類(lèi)都需要實(shí)現(xiàn)的功能,使用相同的接口不一定有繼承關(guān)系
通過(guò)interface
聲明一個(gè)接口
interface 接口名 [extends 父接口]
接口只允許有方法體,不允許實(shí)現(xiàn)
如果一個(gè)類(lèi)實(shí)現(xiàn)了某個(gè)接口,必須實(shí)現(xiàn)這個(gè)接口的所有方法,即為這些方法提供方法體
// 使用implements表示實(shí)現(xiàn)了一個(gè)或多個(gè)接口
interface A implements B,C……{
}
接口是引用類(lèi)型
12.2、接口回調(diào)
把使用某一接口的類(lèi)創(chuàng)建的對(duì)象的引用賦給該接口聲明的接口變量,那么該接口變量就可以調(diào)用貝類(lèi)實(shí)現(xiàn)的接口中的方法
interface A{
void shout();
}
class dog implements A{
void shout(){
System.out.println("Wang!");
}
}
public class Main{
public static void main(String[] args){
A a;
a = new dog();
a.shout(); //Wang!
}
}
13、接口和抽象類(lèi)的比較
接口 | 抽象類(lèi) |
---|---|
抽象方法 | 抽象方法和非抽象方法 |
只能有常量 | 常量變量都有 |
沒(méi)有構(gòu)造方法 | 可以有構(gòu)造方法 |
接口是特殊的抽象類(lèi)
14、內(nèi)部類(lèi)
14.1、基本概念
內(nèi)部類(lèi)同外部類(lèi)一樣,在外部類(lèi)中相當(dāng)于外部類(lèi)的一個(gè)成員
外部類(lèi)的成員變量在內(nèi)部類(lèi)仍有效
內(nèi)部類(lèi)的方法也可以調(diào)用外部類(lèi)的方法
14.2、內(nèi)部類(lèi)分類(lèi)
定義位置 | 說(shuō)明 | |
---|---|---|
成員內(nèi)部類(lèi) | 類(lèi)的內(nèi)部 | 外部類(lèi)的實(shí)例成員;在沒(méi)有外部類(lèi)的實(shí)例的情況下,內(nèi)部類(lèi)不能實(shí)例化;可以用任何修飾符修飾 |
局部?jī)?nèi)部類(lèi) | 方法或語(yǔ)句塊內(nèi) | 只能在他的方法內(nèi)使用 |
匿名類(lèi) | 沒(méi)有類(lèi)名的局部?jī)?nèi)部類(lèi) | |
嵌套頂級(jí)類(lèi) | 使用static修飾的成員內(nèi)部類(lèi) |
// 局部?jī)?nèi)部類(lèi)的聲明
外部類(lèi)實(shí)例.new 內(nèi)部類(lèi)();
15、淺拷貝與深拷貝
對(duì)于基本數(shù)據(jù)類(lèi)型,可以通過(guò)賦值語(yǔ)句完成復(fù)制
對(duì)于引用型數(shù)據(jù)類(lèi)型,通過(guò)賦值語(yǔ)句不能完成真正意義上的復(fù)制
淺拷貝:僅僅復(fù)制他所考慮的對(duì)象
深拷貝:復(fù)制他所考慮的對(duì)象和扶植的對(duì)象所引用的對(duì)象
六、Java異常處理
1、程序錯(cuò)誤與處理
類(lèi)型 | 發(fā)現(xiàn) | 說(shuō)明 | 舉例 |
---|---|---|---|
語(yǔ)法錯(cuò) | 編譯時(shí)發(fā)現(xiàn) | 違反語(yǔ)法規(guī)范 | 使用未定義的變量 |
邏輯錯(cuò) | 系統(tǒng)無(wú)法發(fā)現(xiàn) | 程序員考慮失誤 | |
語(yǔ)義錯(cuò) | 運(yùn)行時(shí)發(fā)現(xiàn) | 在語(yǔ)義上出現(xiàn)錯(cuò)誤 | 除數(shù)為0 |
2、異常處理機(jī)制
// 格式
try{
}catch(){
}finally{
}
3、Java的錯(cuò)誤和異常
3.1、錯(cuò)誤
程序運(yùn)行時(shí)遇到的硬件、操作系統(tǒng)、其他軟件或操作的錯(cuò)誤
當(dāng)產(chǎn)生錯(cuò)誤時(shí),會(huì)拋出Error類(lèi)對(duì)象
2.3、異常
在硬件操作系統(tǒng)正常時(shí),程序運(yùn)行時(shí)遇到的運(yùn)行錯(cuò)誤
Java的異常處理機(jī)制使程序能夠捕獲和處理異常
4、程序錯(cuò)誤與處理
通過(guò)異常處理機(jī)制,使程序具有處理錯(cuò)誤的能力,運(yùn)行錯(cuò)誤時(shí)也不會(huì)導(dǎo)致程序終止
在沒(méi)有發(fā)生異常的情況下:try—finally
發(fā)生異常的情況下:try—catch—finally
5、java的異常處理
5.1、catch子句捕獲異常的匹配規(guī)則
1、拋出異常對(duì)象與catch子句的參數(shù)類(lèi)型相同
2、拋出對(duì)象為catch子句參數(shù)類(lèi)的子類(lèi)
3、按照先后次序補(bǔ)貨拋出異常對(duì)象,只捕獲一次
建議:
1、多個(gè)catch子句需要按照子類(lèi)到父類(lèi)的次序進(jìn)行排列
2、通常最后一個(gè)catch子句的異常類(lèi)聲明為Exceptuion
5.2、Exception的輸出方法
getMessage()
5.3、方法聲明拋出異常的throws子句
如果一個(gè)方法將產(chǎn)生異常,而該方法不想處理或不能處理該異常,可以在方法聲明時(shí),采用throws子句聲明該方法將拋出異常
拋出后,必須
捕獲并處理該異常
[修飾符] 返回值類(lèi)型 方法([參數(shù)列表])[throws 異常類(lèi)]
拋出自定義異常對(duì)象的throw語(yǔ)句也必須由try語(yǔ)句捕獲并處理
自定義的異常類(lèi)通過(guò)擴(kuò)展Throwable
子類(lèi)來(lái)創(chuàng)建自定義異常類(lèi),但是,通常更多的是擴(kuò)展Exception
類(lèi)
6、注意事項(xiàng)
1、子類(lèi)在覆蓋父類(lèi)方法時(shí),父類(lèi)的方法如果拋出了異常,則子類(lèi)的方法只能拋出父類(lèi)的異?;蛘吒割?lèi)異常的子類(lèi)
2、父類(lèi)拋出多個(gè)異常,則子類(lèi)只能拋出父類(lèi)異常的子集文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-470301.html
3、如果父類(lèi)的方法沒(méi)有拋出異常,則子類(lèi)覆蓋是絕對(duì)不能拋出異常的,只能try文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-470301.html
到了這里,關(guān)于java基礎(chǔ)知識(shí)二的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!