Java單例模式繼承覆蓋多態(tài)原理詳解
1、單例模式:
1)提出原因
是由gof 也就是四人組提出來的。為了保證jvm中某一類型的java對象永遠只有一個,同時也是為了節(jié)省內存的開銷。因為外面程序可以通過new的方法直接調用類里面的構造方法。導致該類的對象不止一個。
2)定義
單例模式的意思就是只有一個實例。單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例。這個類稱為單例類。
A、構造方法私有化;
B、對外提供一個公開的、靜態(tài)的、獲取當前類型對象的方法
C、提供一個當前類型的靜態(tài)變量。
3)分類
A、餓漢式單例模式:在類加載時就完成了初始化,所以類加載較慢,但獲取對象的速度快
public class CustomerSingleton {
private static CustomerSingleton instance = new CustomerSingleton();//靜態(tài)私有成員,已初始化
private CustomerSingleton()
{
//私有構造函數(shù)
System.out.println("私有構造函數(shù)執(zhí)行");
}
public static CustomerSingleton getCustomerInstance() //靜態(tài),不用同步(類加載時已初始化,不會有多線程的問題)
{
return instance;
}
}
B、懶漢式單例:類加載時不初始化
當調用getInstance方法的時候,底層的對象才會考慮創(chuàng)建,所以顯得比較懶
public class UserSingleton {
//提供一個當前類型的靜態(tài)變量
public static UserSingleton intance=null;
//構造方法私有化
private UserSingleton(){
System.out.println("構造函數(shù)私有化");
}
//對外提供一個公開獲取Singleton 對象的方法
public static UserSingleton getInstance(){
if(intance==null){
intance=new UserSingleton();
}
return intance;
}
}
2、繼承
1)繼承的語法:java中類只支持單繼承,一個類繼承了A類就無法再繼承B類,繼承是面向對象的重要概念。一個類沒有現(xiàn)實的繼承其他類,默認繼承sun提供的java.lang.object
[修飾符列表] class 子類名 extends 父類名{
類體;
}
備注:
java語言中子類繼承父類,會將父類中所有的數(shù)據全部繼承,包括私有的也能繼承過來;
但是在子類中無法直接訪問父類中的私有數(shù)據。但是可以間接訪問,構造方法無法被子類繼承。
3、方法的覆蓋
1)什么時候方法要進行覆蓋?
如果父類中的方法已經無法滿足當前子類的業(yè)務需求,需要將父類中的方法進行覆蓋重新子類如果重寫父類的方法之后,子類對象一定調用的是重寫之后的方法。覆蓋指的是成員方法和成員變量無關。
2)發(fā)生方法覆蓋的條件:
- 第一:發(fā)生在具有繼承關系的兩個類之間
- 第二:必須具有相同的方法名,相同的返回值類型,相同的參數(shù)列表
- 第三:重寫的方法不能比被重寫的方法擁有更低的訪問權限
- 第四:重寫的方法不能比被重寫的方法拋出更寬泛的異常
- 第五:私有的方法不能被覆蓋(因為私有方法無法被子類訪問,所以不能重寫;必須是public的方法才能被覆蓋,如果定義成了final是不可以被重寫的)
- 第六:構造方法無法被覆蓋,因為構造方法無法被繼承。
- 第七:靜態(tài)的方法不存在覆蓋
- 第八:覆蓋指的是成員方法,和成員變量無關。
4、多態(tài)
向上轉型:子轉父(父類型的引用,指向子類型的對象);
向下轉型:父轉子(子類型的引用,指向父類型的對象);
多態(tài)編譯期是靜態(tài)綁定,而運行期是動態(tài)綁定
5、多態(tài)的經典例子
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("貓在吃魚");
}
}
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);
}
}
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
SpringBoot中@PostConstruct 注解的實現(xiàn)
在Spring Boot框架中,?@PostConstruct是一個非常有用的注解,它用于在依賴注入完成后執(zhí)行初始化方法,本文將介紹?@PostConstruct的基本概念、使用場景以及提供詳細的代碼示例,感興趣的可以了解一下2024-09-09
SpringBoot實現(xiàn)接口文檔自動生成的方法示例
在開發(fā)Web應用程序時,接口文檔是非常重要的一環(huán),本文主要介紹了SpringBoot實現(xiàn)接口文檔自動生成的方法示例,具有一定的參考價值,感興趣的可以了解一下2023-10-10
jmeter壓力測試工具簡介_動力節(jié)點Java學院整理
這篇文章主要為大家詳細介紹了jmeter壓力測試工具相關介紹資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08
Springboot整合RabbitMQ實現(xiàn)發(fā)送驗證碼的示例代碼
這篇文章主要介紹了Springboot整合RabbitMQ實現(xiàn)發(fā)送驗證碼的功能,基于AMQP協(xié)議實現(xiàn)的消息隊列,它是一種應用程序之間的通信方法,消息隊列在分布式系統(tǒng)開 發(fā)中應用非常廣泛,需要的朋友可以參考下2022-02-02
SpringMVC4.3?HttpMessageConverter接口實現(xiàn)源碼分析
這篇文章主要為大家介紹了SpringMVC4.3?HttpMessageConverter接口實現(xiàn)源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09

