Java學(xué)習(xí)筆記之面向?qū)ο缶幊叹?/h1>
更新時(shí)間:2021年09月26日 17:29:35 作者:意愿三七
看名字它是注重對(duì)象的。當(dāng)解決一個(gè)問(wèn)題的時(shí)候,面向?qū)ο髸?huì)把事物抽象成對(duì)象的概念,就是說(shuō)這個(gè)問(wèn)題里面有哪些對(duì)象,然后給對(duì)象賦一些屬性和方法,然后讓每個(gè)對(duì)象去執(zhí)行自己的方法,問(wèn)題得到解決
面向?qū)ο缶幊蹋ò⒗^承、組合、多態(tài) 、抽象類(lèi)、接口)
包
包其實(shí)就是類(lèi)的集合,其本質(zhì)上其實(shí)就是一個(gè)文件夾,里面存放的. java 文件里面有我們寫(xiě)的代碼,并且包的存在還可以有效解決在實(shí)際開(kāi)發(fā)過(guò)程中程序員. java文件命名重疊問(wèn)題,其實(shí)就是,一個(gè)包里面是能有兩個(gè)名字相同的.java文件,但是如果是不同的包下就允許這樣的情況存在。
我們創(chuàng)建一個(gè)包只需要在 src 目錄底下去創(chuàng)建就行了,公司里面給報(bào)的命名一般都是用公司的域名的倒過(guò)來(lái)的形式,總而言之,要讓別人看出來(lái)是這個(gè)包的作用。
還有就是,包中的權(quán)限問(wèn)題,一個(gè)包或者包之中的內(nèi)容壓實(shí)有權(quán)限的我們先前已經(jīng)了解的 private 和 public 權(quán)限區(qū)別是前者只能在當(dāng)前類(lèi)里面用,后者則可以在整個(gè)工程里面使用。但是如果一個(gè)包中的類(lèi)或者類(lèi)中的內(nèi)容沒(méi)有任何修飾符,那么即為默認(rèn)權(quán)限。這種權(quán)限下面僅限在當(dāng)前包中使用,想要跨包調(diào)用是不可能的。
繼承
繼承其實(shí)就是抽象和具體的關(guān)系,關(guān)鍵的地方就是將共性提取出來(lái)放在一個(gè)類(lèi)里面,隨后在交給下面具體的類(lèi)去使用,譬如:貓,狗,這兩個(gè)類(lèi)的共性就是會(huì)吃飯,會(huì)叫,會(huì)跑,那么我們就將這三個(gè)共性抽象出來(lái),創(chuàng)建一個(gè)類(lèi) :動(dòng)物,讓這個(gè)類(lèi)里面包含前面那三種行為,這樣的話,貓,狗兩個(gè)類(lèi)直接就寫(xiě)自己繼承那個(gè)名叫動(dòng)物的類(lèi),這樣的話就可以省去大量重復(fù)的代碼,大大減少我們的代碼量。當(dāng)然自己的類(lèi)里面也可寫(xiě)上自己的獨(dú)特行為,比如:貓的類(lèi)里面可以寫(xiě)貓可以上樹(shù),這是貓所特有的。。下面看具體的代碼示例。
class Animal {
public void eat {
System.out.println("吃飯");
}
public void shout {
System.out.println("吼叫");
}
pubic void run {
System.out.println("跑步");
}
}
class Dog extends Animal{
}
class Cat extends Animal {
public void climbtree {
System.out.println("爬樹(shù)");
}
}
public class Test {
}
總而言之,可以把繼承這種關(guān)系理解成 is a ,cat is a animal( 語(yǔ)法不要在意)。
super 關(guān)鍵字
super關(guān)鍵字與this的用法非常相似,super用于引用當(dāng)前父類(lèi)的對(duì)象的引用,使用super可在子類(lèi)里面引用父類(lèi)里面的字段和方法。
并且當(dāng)我們想要給子類(lèi)對(duì)象賦值的時(shí)候,我們是通過(guò)構(gòu)造方法來(lái)賦值的,但是值是在父類(lèi)里面的,因此,我們必須要先有父類(lèi)的構(gòu)造才能有子類(lèi)構(gòu)造,所以我們要使用 super來(lái)調(diào)用父類(lèi)的構(gòu)造方法(原理一如 this 調(diào)用 構(gòu)造方法一樣)。
此外,繼承還可層層繼承下去,套好幾層,當(dāng)然不推薦這樣做,這個(gè)時(shí)候再使用super 引用的就是其最直接的那個(gè)父類(lèi)。
class Animal {
public String name;
public Animal(String name) {
this.name = name;
System.out.println(this.name);
}
}
class Cat extends Animal {
public Cat (String name) {//此處為cat這個(gè)類(lèi)的構(gòu)造方法
super(name);//此處即為聲明調(diào)用父類(lèi)那個(gè)只有一個(gè)參數(shù)的構(gòu)造方法
}
}
public class Test {
public static void main(String[] args) {
Cat cat = new Cat("咪咪");
}
}
//最后打印結(jié)果為 咪咪
其實(shí)在我們正常繼承中也會(huì)有第八至十行這樣的代碼,但是一般來(lái)說(shuō)都是省略的,看不見(jiàn)的,就像是默認(rèn)構(gòu)造方法一樣,里面沒(méi)有參數(shù)。
下面便是我們的普通默認(rèn)情況。
class Cat extends Animal {
public Cat () {
super();
}
}
final
被 final 修飾的類(lèi)是不可以繼承的,一如被 final 修飾的變量不可以被改變一樣,只要記住 final 修飾的東西就意味著不靈活,不能隨意更改即可。
protected關(guān)鍵字
protected 是一種權(quán)限,使用了他之后可以在同一個(gè)包的同類(lèi)或者不同類(lèi)下面引用,或者不同的包的子類(lèi)。
protected 與其他幾種包的子類(lèi):

組合
類(lèi)似于上面的,組合就是 has a 的關(guān)系。一輛小轎車(chē)在組裝的時(shí)候,其自身含有四個(gè)輪子,兩個(gè)后視鏡,一個(gè)車(chē)標(biāo),等等。
其實(shí)就是講一個(gè)類(lèi)的示例當(dāng)成里一個(gè)類(lèi)的字段。
public class Student {
...
}
public class Teacher {
...
}
public class School {
public Student[] students;
public Teacher[] teacher;
}
多態(tài)
多態(tài)的發(fā)生條件是在,父類(lèi)和子類(lèi)當(dāng)中的函數(shù)重寫(xiě),且發(fā)生向上轉(zhuǎn)型的的時(shí)候才會(huì)產(chǎn)生,而重寫(xiě)的條件則是要求兩個(gè)函數(shù)的參數(shù)條件,函數(shù)內(nèi)容完全一致。
(重寫(xiě)特點(diǎn):函數(shù)名相同,返回值相同,函數(shù)列表相同;
重載的特點(diǎn):函數(shù)名相同,函數(shù)的參數(shù)列表不同,返回值不做要求)
步驟:我們先通過(guò) 把子類(lèi)對(duì)象的引用傳給父類(lèi)對(duì)象的引用 (或者其他方法,總之要保證讓父類(lèi)對(duì)象的引用指向子類(lèi)對(duì)象的引用所指向的),這樣我們便發(fā)生了向上轉(zhuǎn)型,之后再用父類(lèi)對(duì)象的引用來(lái)引用父子類(lèi)公有的函數(shù),這個(gè)時(shí)候就會(huì)發(fā)現(xiàn),結(jié)果出來(lái)為子類(lèi)。這就是由于編譯時(shí)程序引用的是父類(lèi)當(dāng)中的函數(shù),但是當(dāng)運(yùn)行時(shí)就改引 子類(lèi)當(dāng)中的函數(shù)了,這也就是所謂的動(dòng)態(tài)綁定,在父類(lèi)基礎(chǔ)上又綁了子類(lèi),這樣,我們每次給父類(lèi)對(duì)象的引用附上不同的子類(lèi)對(duì)象的引用,就會(huì)導(dǎo)致最后產(chǎn)生不同的結(jié)果,這便是所謂多態(tài),多種狀態(tài)。
下面看代碼示例:
class Animal {
public String name;
public Animal (String name) {
this.name = name;
}
public void running() {
System.out.println(this.name + "正在跑(animal)");
}
}
class Rabits extends Animal {
public Rabits(String name) {
super(name);
}
public void running() {
System.out.println(this.name + "正在跑(rabits)");
}
}
class Cat extends Animal {
public Cat (String name) {
super(name);
}
public void running() {
System.out.println(this.name + "正在跑(Cat)");
}
}
class Pig extends Animal {
public Pig (String name) {
super(name);
}
public void running() {
System.out.println(this.name + "正在跑(Pig)");
}
}
public class TestDemo {
public static void main(String[] args) {
Animal animal = new Rabits("兔兔");
animal.running();
Animal animal2 = new Cat("貓貓");
animal2.running();
Animal animal3 = new Cat("豬豬");
animal3.running();
}
}
執(zhí)行結(jié)果,可以很明顯看到,雖然是用 animal 來(lái)引用的,但是最后打印的都是子類(lèi)自己的

抽象類(lèi)
抽象類(lèi)專(zhuān)門(mén)就是用來(lái)服務(wù)于多態(tài)的,它沒(méi)有辦法實(shí)例化,并且類(lèi)的前面必須要有一個(gè) abstract 來(lái)修飾它,下圖為抽象類(lèi)的特性整理。

接口
接口是由用來(lái)彌補(bǔ)繼承的不足的,繼承的話只能繼承一個(gè)類(lèi),但是如果是接口的話,一個(gè)類(lèi)就可以 implements 多個(gè)接口 ,而且接口注重的是功能,我們需要在意的是它里面有哪些我們需要的功能,如果有派上用場(chǎng)的就把它 implements 過(guò)來(lái)。


到此這篇關(guān)于Java學(xué)習(xí)筆記之面向?qū)ο缶幊叹獾奈恼戮徒榻B到這了,更多相關(guān)Java 面向?qū)ο?內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
-
Maven 版本管理與 flatten-maven-plugin 插件的使用解析
這篇文章主要介紹了Maven 版本管理與 flatten-maven-plugin 插件的使用解析,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下 2023-07-07
-
JAXB命名空間_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了JAXB命名空間的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下 2017-08-08
-
Java實(shí)現(xiàn)List集合轉(zhuǎn)樹(shù)形結(jié)構(gòu)的示例詳解
在開(kāi)發(fā)中,我們通常需要將從數(shù)據(jù)庫(kù)中查詢(xún)的集合數(shù)據(jù)轉(zhuǎn)換成類(lèi)似文件系統(tǒng)一樣的樹(shù)形集合。本文將利用Java語(yǔ)言實(shí)現(xiàn)這一功能,感興趣的可以了解一下 2022-08-08
-
Java解析xml文件和json轉(zhuǎn)換的方法(DOM4j解析)
相信大家都知道Java解析xml的方法有四種,每種方法都很不錯(cuò),今天通過(guò)本文給大家分享使用DOM4j進(jìn)行解析的方法,文章通過(guò)兩種方法給大家進(jìn)行解析,感興趣的朋友一起看看吧 2021-08-08
-
java實(shí)現(xiàn)水仙花數(shù)的計(jì)算
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)水仙花數(shù)的計(jì)算,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下 2019-08-08
-
Java微信公眾平臺(tái)之群發(fā)接口(高級(jí)群發(fā))
這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺(tái)之群發(fā)接口,高級(jí)群發(fā)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下 2018-05-05
-
解決IDEA創(chuàng)建第一個(gè)spring boot項(xiàng)目提示cannot resolve xxx等
這篇文章主要介紹了解決IDEA創(chuàng)建第一個(gè)spring boot項(xiàng)目提示cannot resolve xxx等錯(cuò)誤問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教 2024-01-01
最新評(píng)論
面向?qū)ο缶幊蹋ò⒗^承、組合、多態(tài) 、抽象類(lèi)、接口)
包
包其實(shí)就是類(lèi)的集合,其本質(zhì)上其實(shí)就是一個(gè)文件夾,里面存放的. java 文件里面有我們寫(xiě)的代碼,并且包的存在還可以有效解決在實(shí)際開(kāi)發(fā)過(guò)程中程序員. java文件命名重疊問(wèn)題,其實(shí)就是,一個(gè)包里面是能有兩個(gè)名字相同的.java文件,但是如果是不同的包下就允許這樣的情況存在。
我們創(chuàng)建一個(gè)包只需要在 src 目錄底下去創(chuàng)建就行了,公司里面給報(bào)的命名一般都是用公司的域名的倒過(guò)來(lái)的形式,總而言之,要讓別人看出來(lái)是這個(gè)包的作用。
還有就是,包中的權(quán)限問(wèn)題,一個(gè)包或者包之中的內(nèi)容壓實(shí)有權(quán)限的我們先前已經(jīng)了解的 private 和 public 權(quán)限區(qū)別是前者只能在當(dāng)前類(lèi)里面用,后者則可以在整個(gè)工程里面使用。但是如果一個(gè)包中的類(lèi)或者類(lèi)中的內(nèi)容沒(méi)有任何修飾符,那么即為默認(rèn)權(quán)限。這種權(quán)限下面僅限在當(dāng)前包中使用,想要跨包調(diào)用是不可能的。
繼承
繼承其實(shí)就是抽象和具體的關(guān)系,關(guān)鍵的地方就是將共性提取出來(lái)放在一個(gè)類(lèi)里面,隨后在交給下面具體的類(lèi)去使用,譬如:貓,狗,這兩個(gè)類(lèi)的共性就是會(huì)吃飯,會(huì)叫,會(huì)跑,那么我們就將這三個(gè)共性抽象出來(lái),創(chuàng)建一個(gè)類(lèi) :動(dòng)物,讓這個(gè)類(lèi)里面包含前面那三種行為,這樣的話,貓,狗兩個(gè)類(lèi)直接就寫(xiě)自己繼承那個(gè)名叫動(dòng)物的類(lèi),這樣的話就可以省去大量重復(fù)的代碼,大大減少我們的代碼量。當(dāng)然自己的類(lèi)里面也可寫(xiě)上自己的獨(dú)特行為,比如:貓的類(lèi)里面可以寫(xiě)貓可以上樹(shù),這是貓所特有的。。下面看具體的代碼示例。
class Animal {
public void eat {
System.out.println("吃飯");
}
public void shout {
System.out.println("吼叫");
}
pubic void run {
System.out.println("跑步");
}
}
class Dog extends Animal{
}
class Cat extends Animal {
public void climbtree {
System.out.println("爬樹(shù)");
}
}
public class Test {
}
總而言之,可以把繼承這種關(guān)系理解成 is a ,cat is a animal( 語(yǔ)法不要在意)。
super 關(guān)鍵字
super關(guān)鍵字與this的用法非常相似,super用于引用當(dāng)前父類(lèi)的對(duì)象的引用,使用super可在子類(lèi)里面引用父類(lèi)里面的字段和方法。
并且當(dāng)我們想要給子類(lèi)對(duì)象賦值的時(shí)候,我們是通過(guò)構(gòu)造方法來(lái)賦值的,但是值是在父類(lèi)里面的,因此,我們必須要先有父類(lèi)的構(gòu)造才能有子類(lèi)構(gòu)造,所以我們要使用 super來(lái)調(diào)用父類(lèi)的構(gòu)造方法(原理一如 this 調(diào)用 構(gòu)造方法一樣)。
此外,繼承還可層層繼承下去,套好幾層,當(dāng)然不推薦這樣做,這個(gè)時(shí)候再使用super 引用的就是其最直接的那個(gè)父類(lèi)。
class Animal {
public String name;
public Animal(String name) {
this.name = name;
System.out.println(this.name);
}
}
class Cat extends Animal {
public Cat (String name) {//此處為cat這個(gè)類(lèi)的構(gòu)造方法
super(name);//此處即為聲明調(diào)用父類(lèi)那個(gè)只有一個(gè)參數(shù)的構(gòu)造方法
}
}
public class Test {
public static void main(String[] args) {
Cat cat = new Cat("咪咪");
}
}
//最后打印結(jié)果為 咪咪
其實(shí)在我們正常繼承中也會(huì)有第八至十行這樣的代碼,但是一般來(lái)說(shuō)都是省略的,看不見(jiàn)的,就像是默認(rèn)構(gòu)造方法一樣,里面沒(méi)有參數(shù)。
下面便是我們的普通默認(rèn)情況。
class Cat extends Animal {
public Cat () {
super();
}
}
final
被 final 修飾的類(lèi)是不可以繼承的,一如被 final 修飾的變量不可以被改變一樣,只要記住 final 修飾的東西就意味著不靈活,不能隨意更改即可。
protected關(guān)鍵字
protected 是一種權(quán)限,使用了他之后可以在同一個(gè)包的同類(lèi)或者不同類(lèi)下面引用,或者不同的包的子類(lèi)。
protected 與其他幾種包的子類(lèi):

組合
類(lèi)似于上面的,組合就是 has a 的關(guān)系。一輛小轎車(chē)在組裝的時(shí)候,其自身含有四個(gè)輪子,兩個(gè)后視鏡,一個(gè)車(chē)標(biāo),等等。
其實(shí)就是講一個(gè)類(lèi)的示例當(dāng)成里一個(gè)類(lèi)的字段。
public class Student {
...
}
public class Teacher {
...
}
public class School {
public Student[] students;
public Teacher[] teacher;
}
多態(tài)
多態(tài)的發(fā)生條件是在,父類(lèi)和子類(lèi)當(dāng)中的函數(shù)重寫(xiě),且發(fā)生向上轉(zhuǎn)型的的時(shí)候才會(huì)產(chǎn)生,而重寫(xiě)的條件則是要求兩個(gè)函數(shù)的參數(shù)條件,函數(shù)內(nèi)容完全一致。
(重寫(xiě)特點(diǎn):函數(shù)名相同,返回值相同,函數(shù)列表相同;
重載的特點(diǎn):函數(shù)名相同,函數(shù)的參數(shù)列表不同,返回值不做要求)
步驟:我們先通過(guò) 把子類(lèi)對(duì)象的引用傳給父類(lèi)對(duì)象的引用 (或者其他方法,總之要保證讓父類(lèi)對(duì)象的引用指向子類(lèi)對(duì)象的引用所指向的),這樣我們便發(fā)生了向上轉(zhuǎn)型,之后再用父類(lèi)對(duì)象的引用來(lái)引用父子類(lèi)公有的函數(shù),這個(gè)時(shí)候就會(huì)發(fā)現(xiàn),結(jié)果出來(lái)為子類(lèi)。這就是由于編譯時(shí)程序引用的是父類(lèi)當(dāng)中的函數(shù),但是當(dāng)運(yùn)行時(shí)就改引 子類(lèi)當(dāng)中的函數(shù)了,這也就是所謂的動(dòng)態(tài)綁定,在父類(lèi)基礎(chǔ)上又綁了子類(lèi),這樣,我們每次給父類(lèi)對(duì)象的引用附上不同的子類(lèi)對(duì)象的引用,就會(huì)導(dǎo)致最后產(chǎn)生不同的結(jié)果,這便是所謂多態(tài),多種狀態(tài)。
下面看代碼示例:
class Animal {
public String name;
public Animal (String name) {
this.name = name;
}
public void running() {
System.out.println(this.name + "正在跑(animal)");
}
}
class Rabits extends Animal {
public Rabits(String name) {
super(name);
}
public void running() {
System.out.println(this.name + "正在跑(rabits)");
}
}
class Cat extends Animal {
public Cat (String name) {
super(name);
}
public void running() {
System.out.println(this.name + "正在跑(Cat)");
}
}
class Pig extends Animal {
public Pig (String name) {
super(name);
}
public void running() {
System.out.println(this.name + "正在跑(Pig)");
}
}
public class TestDemo {
public static void main(String[] args) {
Animal animal = new Rabits("兔兔");
animal.running();
Animal animal2 = new Cat("貓貓");
animal2.running();
Animal animal3 = new Cat("豬豬");
animal3.running();
}
}
執(zhí)行結(jié)果,可以很明顯看到,雖然是用 animal 來(lái)引用的,但是最后打印的都是子類(lèi)自己的

抽象類(lèi)
抽象類(lèi)專(zhuān)門(mén)就是用來(lái)服務(wù)于多態(tài)的,它沒(méi)有辦法實(shí)例化,并且類(lèi)的前面必須要有一個(gè) abstract 來(lái)修飾它,下圖為抽象類(lèi)的特性整理。

接口
接口是由用來(lái)彌補(bǔ)繼承的不足的,繼承的話只能繼承一個(gè)類(lèi),但是如果是接口的話,一個(gè)類(lèi)就可以 implements 多個(gè)接口 ,而且接口注重的是功能,我們需要在意的是它里面有哪些我們需要的功能,如果有派上用場(chǎng)的就把它 implements 過(guò)來(lái)。


到此這篇關(guān)于Java學(xué)習(xí)筆記之面向?qū)ο缶幊叹獾奈恼戮徒榻B到這了,更多相關(guān)Java 面向?qū)ο?內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Maven 版本管理與 flatten-maven-plugin 插件的使用解析
這篇文章主要介紹了Maven 版本管理與 flatten-maven-plugin 插件的使用解析,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
JAXB命名空間_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了JAXB命名空間的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
Java實(shí)現(xiàn)List集合轉(zhuǎn)樹(shù)形結(jié)構(gòu)的示例詳解
在開(kāi)發(fā)中,我們通常需要將從數(shù)據(jù)庫(kù)中查詢(xún)的集合數(shù)據(jù)轉(zhuǎn)換成類(lèi)似文件系統(tǒng)一樣的樹(shù)形集合。本文將利用Java語(yǔ)言實(shí)現(xiàn)這一功能,感興趣的可以了解一下2022-08-08
Java解析xml文件和json轉(zhuǎn)換的方法(DOM4j解析)
相信大家都知道Java解析xml的方法有四種,每種方法都很不錯(cuò),今天通過(guò)本文給大家分享使用DOM4j進(jìn)行解析的方法,文章通過(guò)兩種方法給大家進(jìn)行解析,感興趣的朋友一起看看吧2021-08-08
java實(shí)現(xiàn)水仙花數(shù)的計(jì)算
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)水仙花數(shù)的計(jì)算,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08
Java微信公眾平臺(tái)之群發(fā)接口(高級(jí)群發(fā))
這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺(tái)之群發(fā)接口,高級(jí)群發(fā)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
解決IDEA創(chuàng)建第一個(gè)spring boot項(xiàng)目提示cannot resolve xxx等
這篇文章主要介紹了解決IDEA創(chuàng)建第一個(gè)spring boot項(xiàng)目提示cannot resolve xxx等錯(cuò)誤問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01

