Java單例模式繼承覆蓋多態(tài)原理詳解
1、單例模式:
1)提出原因
是由gof 也就是四人組提出來(lái)的。為了保證jvm中某一類型的java對(duì)象永遠(yuǎn)只有一個(gè),同時(shí)也是為了節(jié)省內(nèi)存的開(kāi)銷(xiāo)。因?yàn)橥饷娉绦蚩梢酝ㄟ^(guò)new的方法直接調(diào)用類里面的構(gòu)造方法。導(dǎo)致該類的對(duì)象不止一個(gè)。
2)定義
單例模式的意思就是只有一個(gè)實(shí)例。單例模式確保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。這個(gè)類稱為單例類。
A、構(gòu)造方法私有化;
B、對(duì)外提供一個(gè)公開(kāi)的、靜態(tài)的、獲取當(dāng)前類型對(duì)象的方法
C、提供一個(gè)當(dāng)前類型的靜態(tài)變量。
3)分類
A、餓漢式單例模式:在類加載時(shí)就完成了初始化,所以類加載較慢,但獲取對(duì)象的速度快
public class CustomerSingleton {
private static CustomerSingleton instance = new CustomerSingleton();//靜態(tài)私有成員,已初始化
private CustomerSingleton()
{
//私有構(gòu)造函數(shù)
System.out.println("私有構(gòu)造函數(shù)執(zhí)行");
}
public static CustomerSingleton getCustomerInstance() //靜態(tài),不用同步(類加載時(shí)已初始化,不會(huì)有多線程的問(wèn)題)
{
return instance;
}
}
B、懶漢式單例:類加載時(shí)不初始化
當(dāng)調(diào)用getInstance方法的時(shí)候,底層的對(duì)象才會(huì)考慮創(chuàng)建,所以顯得比較懶
public class UserSingleton {
//提供一個(gè)當(dāng)前類型的靜態(tài)變量
public static UserSingleton intance=null;
//構(gòu)造方法私有化
private UserSingleton(){
System.out.println("構(gòu)造函數(shù)私有化");
}
//對(duì)外提供一個(gè)公開(kāi)獲取Singleton 對(duì)象的方法
public static UserSingleton getInstance(){
if(intance==null){
intance=new UserSingleton();
}
return intance;
}
}
2、繼承
1)繼承的語(yǔ)法:java中類只支持單繼承,一個(gè)類繼承了A類就無(wú)法再繼承B類,繼承是面向?qū)ο蟮闹匾拍?。一個(gè)類沒(méi)有現(xiàn)實(shí)的繼承其他類,默認(rèn)繼承sun提供的java.lang.object
[修飾符列表] class 子類名 extends 父類名{
類體;
}
備注:
java語(yǔ)言中子類繼承父類,會(huì)將父類中所有的數(shù)據(jù)全部繼承,包括私有的也能繼承過(guò)來(lái);
但是在子類中無(wú)法直接訪問(wèn)父類中的私有數(shù)據(jù)。但是可以間接訪問(wèn),構(gòu)造方法無(wú)法被子類繼承。
3、方法的覆蓋
1)什么時(shí)候方法要進(jìn)行覆蓋?
如果父類中的方法已經(jīng)無(wú)法滿足當(dāng)前子類的業(yè)務(wù)需求,需要將父類中的方法進(jìn)行覆蓋重新子類如果重寫(xiě)父類的方法之后,子類對(duì)象一定調(diào)用的是重寫(xiě)之后的方法。覆蓋指的是成員方法和成員變量無(wú)關(guān)。
2)發(fā)生方法覆蓋的條件:
- 第一:發(fā)生在具有繼承關(guān)系的兩個(gè)類之間
- 第二:必須具有相同的方法名,相同的返回值類型,相同的參數(shù)列表
- 第三:重寫(xiě)的方法不能比被重寫(xiě)的方法擁有更低的訪問(wèn)權(quán)限
- 第四:重寫(xiě)的方法不能比被重寫(xiě)的方法拋出更寬泛的異常
- 第五:私有的方法不能被覆蓋(因?yàn)樗接蟹椒o(wú)法被子類訪問(wèn),所以不能重寫(xiě);必須是public的方法才能被覆蓋,如果定義成了final是不可以被重寫(xiě)的)
- 第六:構(gòu)造方法無(wú)法被覆蓋,因?yàn)闃?gòu)造方法無(wú)法被繼承。
- 第七:靜態(tài)的方法不存在覆蓋
- 第八:覆蓋指的是成員方法,和成員變量無(wú)關(guān)。
4、多態(tài)
向上轉(zhuǎn)型:子轉(zhuǎn)父(父類型的引用,指向子類型的對(duì)象);
向下轉(zhuǎn)型:父轉(zhuǎn)子(子類型的引用,指向父類型的對(duì)象);
多態(tài)編譯期是靜態(tài)綁定,而運(yùn)行期是動(dòng)態(tài)綁定
5、多態(tài)的經(jīng)典例子
public class Person {
public void feed (Animal a){
a.eat();
}
}
public class Animal {
public void eat(){
}
}
public class Dog extends Animal {
public void eat(){
System.out.println("狗在吃肉");
}
}
public class Cat extends Animal {
public void eat(){
System.out.println("貓?jiān)诔贼~(yú)");
}
}
public class Test01 {
public static void main(String[] args) {
Person p1=new Person();
Dog d1=new Dog();
Cat c1=new Cat();
p1.feed(d1);
p1.feed(c1);
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
spring boot jpa寫(xiě)原生sql報(bào)Cannot resolve table錯(cuò)誤解決方法
在本篇文章里小編給大家整理的是關(guān)于spring boot jpa寫(xiě)原生sql報(bào)Cannot resolve table錯(cuò)誤的解決方法,需要的朋友學(xué)習(xí)下。2019-11-11
Java中將base64編碼字符串轉(zhuǎn)換為圖片的代碼
這篇文章主要介紹了Java中將base64編碼字符串轉(zhuǎn)換為圖片,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03
Java 中 Form表單數(shù)據(jù)的兩種提交方式
本文給大家分享java中form表單數(shù)據(jù)的兩種提交方式,分別是get從制定的服務(wù)器中獲取數(shù)據(jù),pos方式提交數(shù)據(jù)給指定的服務(wù)器處理,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧2016-12-12
IDEA中application.properties的圖標(biāo)顯示不正常的問(wèn)題及解決方法
這篇文章主要介紹了IDEA中application.properties的圖標(biāo)顯示不正常的問(wèn)題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
ElasticSearch6.2.3+head插件安裝的方法步驟
這篇文章主要介紹了ElasticSearch6.2.3+head插件安裝的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02
關(guān)于@Controller和@Restcontroller的那點(diǎn)奇葩事
這篇文章主要介紹了關(guān)于@Controller和@Restcontroller的那點(diǎn)奇葩事,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Spring打包jar包時(shí)jsp頁(yè)面無(wú)法訪問(wèn)問(wèn)題解決
這篇文章主要介紹了Spring打包jar包時(shí)jsp頁(yè)面無(wú)法訪問(wèn)問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
解決springboot項(xiàng)目找不到resources目錄下的資源問(wèn)題
這篇文章主要介紹了解決springboot項(xiàng)目找不到resources目錄下的資源問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08

