Java零基礎也看得懂的單例模式與final及抽象類和接口詳解
1.單例模式
1.餓漢式和懶漢式的實現(xiàn)
步驟:
- 將構(gòu)造器私有化
- 類的內(nèi)部創(chuàng)建對象
- 向外暴露一個靜態(tài)的公共方法
2.餓漢式
class School1 { //餓漢式 private String name; //在類的內(nèi)部直接創(chuàng)建對象 private static School1 sc = new School1("清華大學"); //將構(gòu)造器私有化 private School1(String name) { this.name = name; } //提供一個公共的static方法返回對象 public static School getInstance() { return sc; } }
3.懶漢式
class School2 { //懶漢式 private String name; //在類的內(nèi)部直接創(chuàng)建對象 private static School2 sc; //將構(gòu)造器私有化 private School2(String name) { this.name = name; } //提供一個公共的static方法返回對象 //若對象為null創(chuàng)建對象否則直接返回對象 public static School2 getInstance() { if (sc == null) { sc = new School2("清華大學"); } return sc; } }
4.懶漢式和餓漢式的區(qū)別
- 創(chuàng)建對象的時機不同:餓漢式在類加載是就創(chuàng)建了對象,懶漢式是在使用時再創(chuàng)建。
- 餓漢式不存在線程安全問題,懶漢式存在線程安全問題。
- 餓漢式在類加載是就創(chuàng)建了對象所以存在資源浪費的問題,但懶漢式就不存在這個問題。
2.final的使用
1.基本介紹
final可以修飾類,屬性,方法和局部變量。
2.使用場景
①當不希望父類被繼承。
②當不希望父類的方法被子類重寫。
③當不希望類的某個屬性被修改
④當不希望某個局部變量被修改
final class A{};//當不希望父類被繼承。 class B{ public final void display(){};//當不希望父類的方法被子類重寫。 public final int A_B = 10;//當不希望類的某個屬性被修改 public void show(){ final int A_c = 20;//當不希望某個局部變量被修改 } }
3.使用注意事項和細節(jié)討論
1.final修飾的屬性又叫常量,一般用 XX_XX
2.final修飾的屬性定義時,必須在以下位置賦初值
①定義時直接賦值。
②在構(gòu)造器中賦值。
③在代碼塊中賦值。(普通屬性在普通代碼塊初始化,靜態(tài)屬性在靜態(tài)代碼塊初始化)
class A { // 定義時直接賦值。 public final int a = 10; // { // a = 10;//在代碼塊中賦值。 // } // // public A() { // a = 10;//在構(gòu)造器中賦值。 // } }
3.如果final修飾的屬性是static,則初始化的為位置只能是
①定義時直接賦值。
②在靜態(tài)代碼塊中賦值。
class A { // 定義時直接賦值。 public final static int a = 10; // static { // a = 10;//在靜態(tài)代碼塊中賦值。 // } // public A() { // final修飾的屬性是static,則初始化的為位置不能是構(gòu)造器 // a = 10; // } }
4.final類不能繼承,但可以實例化對象。
5.final修飾的方法雖然不能重寫,但可以被繼承。
6.final不能修飾構(gòu)造器。
7.final 和 static 搭配使用,不會導致類的加載,效率更高。
8.包裝類(Integer,Double,Float,Boolean,String等都是final修飾的)
3.抽象類
1.基本介紹
用abstract關鍵字修飾的類叫抽象類,abstract還可以用來修飾一個方法,即抽象類。
abstract class A{ abstract void display(); //當一個類中有一個抽象方法,這個類也要定義為抽象類 }
2.使用注意事項和細節(jié)討論
1.抽象類不能被實例化。
2.抽象類可以沒有abstract方法。
3.當一個類中有一個抽象方法,這個類也要定義為抽象類。
4.abstract只能修飾類和方法,不能修飾屬性和其他。
5.抽象類可以有任意成員,但抽象方法不能有實現(xiàn)主體。
6.如果一個類繼承了抽象類,則必須要實現(xiàn)抽象類的所有方法。
7.抽象方法不能用private,static,final來修飾,因為這些關鍵字與重寫相違背
4.接口
1.基本介紹
interface 接口名{
//屬性
//方法(可以為抽象方法,靜態(tài)方法,默認方法)
//在JDk7.0之前接口的所有方法都為抽象方法
}
class 類名 implements 接口{
自己屬性;
自己方法;
必須實現(xiàn)的接口的抽象方法;}
public interface UsbInterface { int a = 10;//實際上是public final static int a = 10; void connect(); void close();//抽象方法 default public void display(){//默認方法 System.out.println("接口中的方法被調(diào)用~"); } public static void show(){//靜態(tài)方法 System.out.println("接口中的靜態(tài)方法被調(diào)用~"); } }
2.注意事項和細節(jié)討論
1.接口不能被實例化
2.接口中所有的方法時 public 方法,接口中抽象方法,可以不用 abstract 修飾
3.一個普通類實現(xiàn)接口。就必須將該接口的所有方法都實現(xiàn),可以使用alt+enter來解決
4.抽象類去實現(xiàn)接口時,可以不實現(xiàn)接口的抽象方法。
5.當一個類實現(xiàn)了一個接口,這個類就可以調(diào)用接口中的所有屬性和默認方法,但不能調(diào)用接口中的靜態(tài)方法。
public class MySql implements UsbInterface{ @Override public void connect() { System.out.println("MySql被調(diào)用"); display(); System.out.println(a); } @Override public void close() { System.out.println("MySql被關閉"); } }
3.實現(xiàn)接口與繼承的區(qū)別
1.繼承是將父類的所有繼承過來,子類天生就擁有父類的所有屬性,實現(xiàn)接口就像是后天學習其他的沒有的技能。
2.繼承的價值主要在于:解決代碼的復用性和可維護性。
3.接口的價值主要在于:設計規(guī)范。更加靈活。
4.繼承是滿足is-a的關系,接口只需滿足like-a的關系。
5.接口在一定程度上實現(xiàn)了代碼解耦。
4.接口與繼承同時出現(xiàn)如何訪問屬性
public class Interface01 { } interface A{ int x = 10; } class B { int x = 20; } class C extends B implements A{ public void display(){ System.out.println( A.x + "+" + super.x ); } //接口的屬性直接通過接口名訪問,父類通過super訪問 public static void main(String[] args) { new C().display(); } }
5.接口的多態(tài)特性
1.多態(tài)參數(shù)
接口可以接受不同的對象,接口的引用也可以指向?qū)崿F(xiàn)了接口的類的對象。
public class InterfaceDetails { public static void main(String[] args) { MySql mySql = new MySql(); Oracle oracle = new Oracle(); t(mySql); t(oracle); UsbInterface UIf = mySql; } public static void t(UsbInterface mb) { mb.close(); mb.connect(); } }
2.多態(tài)數(shù)組
public interface UsbInterface { void work(); } public class Phone implements UsbInterface{ @Override public void work() { System.out.println("手機正在工作。。。"); } public void call(){ System.out.println("手機正在打電話。。。"); } } public class Camera implements UsbInterface{ @Override public void work() { System.out.println("相機正在工作。。。"); } }
public class Interface02 { public static void main(String[] args) { UsbInterface[] uIF = new UsbInterface[2]; Phone phone = new Phone(); Camera camera = new Camera(); uIF[0]= phone; uIF[1]= camera; for (int i = 0; i < 2; i++) { uIF[i].work(); if(uIF[i] instanceof Phone){ ((Phone) uIF[i]).call(); } } } }
3.接口存在多態(tài)傳遞現(xiàn)象
interface AA{ void display(); } interface BB extends AA{ } class CC implements BB{ @Override public void display() { } }
到此這篇關于Java零基礎也看得懂的單例模式與final及抽象類和接口詳解的文章就介紹到這了,更多相關Java單例模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解Java中NullPointerException異常的原因詳解以及解決方法
這篇文章主要介紹了詳解Java中NullPointerException異常的原因詳解以及解決方法。文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-08-08Java重寫(Override)與重載(Overload)區(qū)別原理解析
這篇文章主要介紹了Java重寫(Override)與重載(Overload)區(qū)別原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-02-02Java語言----三種循環(huán)語句的區(qū)別介紹
下面小編就為大家?guī)硪黄狫ava語言----三種循環(huán)語句的區(qū)別介紹。小編舉得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-07-07SpringBoot+Nacos+Kafka微服務流編排的簡單實現(xiàn)
本文主要介紹了SpringBoot+Nacos+Kafka微服務流編排的簡單實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08