1. 程式人生 > 程式設計 >Java單例模式繼承覆蓋多型原理詳解

Java單例模式繼承覆蓋多型原理詳解

1、單例模式:

1)提出原因

  是由gof 也就是四人組提出來的。為了保證jvm中某一型別的java物件永遠只有一個,同時也是為了節省記憶體的開銷。因為外面程式可以通過new的方法直接呼叫類裡面的構造方法。導致該類的物件不止一個。

2)定義

  單例模式的意思就是隻有一個例項。單例模式確保某一個類只有一個例項,而且自行例項化並向整個系統提供這個例項。這個類稱為單例類。

A、構造方法私有化;

B、對外提供一個公開的、靜態的、獲取當前型別物件的方法

C、提供一個當前型別的靜態變數。

3)分類

A、餓漢式單例模式:在類載入時就完成了初始化,所以類載入較慢,但獲取物件的速度快

public class CustomerSingleton {
  private static CustomerSingleton instance = new CustomerSingleton();//靜態私有成員,已初始化
  
  private CustomerSingleton()
  {
    //私有建構函式
   System.out.println("私有建構函式執行");
  }
  
  public static CustomerSingleton getCustomerInstance()  //靜態,不用同步(類載入時已初始化,不會有多執行緒的問題)
  {
    return instance;
  }
}

B、懶漢式單例:類載入時不初始化

當呼叫getInstance方法的時候,底層的物件才會考慮建立,所以顯得比較懶

public class UserSingleton {
   //提供一個當前型別的靜態變數
   public static UserSingleton intance=null;
 
   //構造方法私有化
   private UserSingleton(){
    System.out.println("建構函式私有化");
   }
 
   //對外提供一個公開獲取Singleton 物件的方法
   public static UserSingleton getInstance(){
     if(intance==null){
      intance=new UserSingleton();
   }
    return intance;
   }
}

2、繼承

1)繼承的語法:java中類只支援單繼承,一個類繼承了A類就無法再繼承B類,繼承是面向物件的重要概念。一個類沒有現實的繼承其他類,預設繼承sun提供的java.lang.object

   [修飾符列表] class 子類名 extends 父類名{
    類體;

  }

備註:

java語言中子類繼承父類,會將父類中所有的資料全部繼承,包括私有的也能繼承過來;

但是在子類中無法直接訪問父類中的私有資料。但是可以間接訪問,構造方法無法被子類繼承。

3、方法的覆蓋

1)什麼時候方法要進行覆蓋?

如果父類中的方法已經無法滿足當前子類的業務需求,需要將父類中的方法進行覆蓋重新子類如果重寫父類的方法之後,子類物件一定呼叫的是重寫之後的方法。覆蓋指的是成員方法和成員變數無關。

2)發生方法覆蓋的條件:

  • 第一:發生在具有繼承關係的兩個類之間
  • 第二:必須具有相同的方法名,相同的返回值型別,相同的引數列表
  • 第三:重寫的方法不能比被重寫的方法擁有更低的訪問許可權
  • 第四:重寫的方法不能比被重寫的方法丟擲更寬泛的異常
  • 第五:私有的方法不能被覆蓋(因為私有方法無法被子類訪問,所以不能重寫;必須是public的方法才能被覆蓋,如果定義成了final是不可以被重寫的)
  • 第六:構造方法無法被覆蓋,因為構造方法無法被繼承。
  • 第七:靜態的方法不存在覆蓋
  • 第八:覆蓋指的是成員方法,和成員變數無關。

4、多型

向上轉型:子轉父(父型別的引用,指向子型別的物件);

向下轉型:父轉子(子型別的引用,指向父型別的物件);

多型編譯期是靜態繫結,而執行期是動態繫結

5、多型的經典例子

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);
   }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。