本文目錄一覽:
- 1、在java開發中,為什麼要使用單例模式?
- 2、java中為什麼要使用泛型
- 3、java中為什麼要使用繼承
- 4、我們為什麼要用Java
- 5、java中為什麼要用方法重載?
- 6、java中為什麼要用抽象類和接口
在java開發中,為什麼要使用單例模式?
java單例模式確保一個類只有一個實例,自行提供這個實例並向整個系統提供這個實例。
特點:
一個類只能有一個實例;
自己創建這個實例;
整個系統都要使用這個實例。
Singleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。在很多操作中,比如建立目錄 數據庫連接都需要這樣的單線程操作。一些資源管理器常常設計成單例模式。
外部資源:譬如每台計算機可以有若干個打印機,但只能有一個Printer Spooler,以避免兩個打印作業同時輸出到打印機中。每台計算機可以有若干個通信端口,系統應當集中管理這些通信端口,以避免一個通信端口被兩個請求同時調用。
內部資源,譬如,大多數的軟件都有一個(甚至多個)屬性文件存放系統配置。這樣的系統應當由一個對象來管理這些屬性文件。
單例模式,能避免實例重複創建;
單例模式,應用於避免存在多個實例引起程序邏輯錯誤的場合;
單例模式,較節約內存。
java中為什麼要使用泛型
Java 語言中引入泛型是一個較大的功能增強。
泛型好處:
1,類型安全。 泛型的主要目標是提高 Java 程序的類型安全。通過知道使用泛型定義的變量的類型限制,編譯器可以在一個高得多的程度上驗證類型假設。沒有泛型,這些假設就只存在於程序員的頭腦中(或者如果幸運的話,還存在於代碼注釋中)。
2,消除強制類型轉換。 泛型的一個附帶好處是,消除源代碼中的許多強制類型轉換。這使得代碼更加可讀,並且減少了出錯機會。
3,潛在的性能收益。 泛型為較大的優化帶來可能。在泛型的初始實現中,編譯器將強制類型轉換(沒有泛型的話,程序員會指定這些強制類型轉換)插入生成的位元組碼中。但是更多類型信息可用於編譯器這一事實,為未來版本的 JVM 的優化帶來可能。由於泛型的實現方式,支持泛型(幾乎)不需要 JVM 或類文件更改。所有工作都在編譯器中完成,編譯器生成類似於沒有泛型(和強制類型轉換)時所寫的代碼,更能確保類型安全。
java中為什麼要使用繼承
1)子類繼承父類可以獲zhidao取父類全部的成員變量和方法
2)減少代碼的冗餘,提高類的復用,提升程序員的內開發效率;
3)繼承關係是傳遞的,只有一個直接父類但是可以容有無數個間接父類,每一層都可以根據自身需要,擴展代碼實現功能
4)各種設計模式的基礎之一
我們為什麼要用Java
Java最初是為對家用電器進行集成控制而設計的一種語言,因此它必須簡單明了。Java語言的簡單性主要體現在三個方面:
1、Java的風格類似於C++,因而C++程序員初次接觸Java語言,就會感到很熟悉。從某種意義上講,Java語言是C及C++語言的一個變種,因此,C++程序員可以很快地掌握Java編程技術。
2、Java摒棄了C++中容易引發程序錯誤的一些特性,如指針、結構、枚舉以及內存管理等。
3、Java提供了豐富的類庫,可以幫助我們很方便的開發Java程序。
面向對象的面向對象可以說是Java最重要的特性,所以它支持繼承、重載、多態等面向對象的特性。Java語言的設計是完全面向對象的,它不支持類似C語言那樣的面向過程的程序設計技術。
健壯的Java致力於檢查程序在編譯和運行時的錯誤。Java也是一種強類型的語言,其類型檢查比C++還要嚴格。類型檢查幫助我們檢查出許多開發早期出現的錯誤。Java自己負責內存管理,提供了垃圾內存回收機制,有效的避免了C++中最頭疼的內存泄漏問題。
安全的Java的安全性可從兩個方面得到保證。一方 面,在Java語言里,刪除了指針和釋放內存等C++功能,避免了非法內存操作。另一方面,通過Java的安全體系架構來確保Java代碼的安全性。當我們從網上下載Java代碼在本地執行時,Java的安全架構能確保惡意的代碼不能隨意訪問我們本地計算機的資源,例如:刪除文件,訪問本地網絡資源等操作都是被禁止的。
解釋的Java代碼是解釋執行的,我們使用Java編譯器將Java代碼編譯成位元組碼,這是一種中間代碼,然後由Java解釋器解釋執行。而C++程序是編譯執行的,C++程序代碼被編譯為本地機器指令,然後
與平台無關的
Java作為一種網絡語言,其源代碼被編譯成一種結構中立的中間文件格式。只要有Java運行系統的機器都能執行這種中間代碼。Java源程序被編譯成一種與機器無關的位元組碼格式,在Java虛擬機上運行。
多線程的Java語言的一個重要特性就是在語言級支持多線程的程序設計。多線程就好像我們做一張桌子,如果你一個人完成這張桌子—就好像單線程,那麼你需要先做桌面,做完桌面後,再做4個桌子腿,如果現在有5個人來做桌子—在程序中開闢5個線程,其中1個人做桌面,另外4個人分別做4個桌子腿,那麼這兩種方式效率的高低,相信大家都能區分出來。
動態的Java的動態特性是其面向對象設計方法的擴展。它允許程序動態地裝入運行過程中所需要的類,這是我們採用C++語言進行面向對象程序設計所無法實現的。在C++程序設計過程中,每當在類中增加一個實例變量或一個成員函數後, 引用該類的所有子類都必須重新編譯,否則將導致程序崩潰。Java從以下幾個方面採取措施來解決這個問題。Java編譯器不是將對實例變量和成員函數的引用編譯為數值引用,而是將符號引用信息在位元組碼中保存下來,傳遞給解釋器,再由解釋器在完成動態連接類後,將符號引用信息轉換為數值偏移量。一個在存儲器中生成的對象不在編譯過程中決定,而是延遲到運行時由解釋器確定。這樣,對類中的變量和方法進行更新時就不至於影響現存的代碼。 解釋執行位元組碼時,這種符號信息的查找和轉換過程僅在一個新的名字出現時才進行一次,隨後代碼便可以全速執行。在運行時確定引用的好處是可以使用已被更新的類,而不必擔心會影響原有的代碼。如果程序連接了網絡中另一系統中的某一類,該類的所有者也可以自由地對該類進行更新,而不會使任何引用該類的程序崩潰。Java還簡化了使用一個升級的或全新協議的方法。
java中為什麼要用方法重載?
(1)重載的意義在於擴展父類的功能,如果有兩個類A和B,繼承C,那麼在C的方法只需要定義A和B相同的功能,而在各個子類中擴展子類具體的實現。
(2)方法重載是指在一個類中定義多個同名的方法,但要求每個方法具有不同的參數的類型或參數的個數。調用重載方法時,Java編譯器能通過檢查調用的方法的參數類型和個數選擇一個恰當的方法。方法重載通常用於創建完成一組任務相似但參數的類型或參數的個數不同的方法。
(3)Java的方法重載,就是在類中可以創建多個方法,它們可以有相同的名字,但必須具有不同的參數,即或者是參數的個數不同,或者是參數的類型不同。調用方法時通過傳遞給它們的不同個數和類型的參數來決定具體使用哪個方法。
java中為什麼要用抽象類和接口
對於面向對象編程來說,抽象是它的一大特徵之一。在Java中,可以通過兩種形式來體現OOP的抽象:接口和抽象類。這兩者有太多相似的地方,又有太多不同的地方。很多人在初學的時候會以為它們可以隨意互換使用,但是實際則不然。今天我們就一起來學習一下Java中的接口和抽象類。下面是本文的目錄大綱:
一.抽象類
二.接口
三.抽象類和接口的區別
若有不正之處,請多多諒解並歡迎批評指正,不甚感激。
一.抽象類
在了解抽象類之前,先來了解一下抽象方法。抽象方法是一種特殊的方法:它只有聲明,而沒有具體的實現。抽象方法的聲明格式為:
abstract void fun();
抽象方法必須用abstract關鍵字進行修飾。如果一個類含有抽象方法,則稱這個類為抽象類,抽象類必須在類前用abstract關鍵字修飾。因為抽象類中含有無具體實現的方法,所以不能用抽象類創建對象。
下面要注意一個問題:在《Java編程思想》一書中,將抽象類定義為「包含抽象方法的類」,但是後面發現如果一個類不包含抽象方法,只是用abstract修飾的話也是抽象類。也就是說抽象類不一定必須含有抽象方法。個人覺得這個屬於鑽牛角尖的問題吧,因為如果一個抽象類不包含任何抽象方法,為何還要設計為抽象類?所以暫且記住這個概念吧,不必去深究為什麼。
[public] abstract class ClassName { abstract void fun();}
從這裡可以看出,抽象類就是為了繼承而存在的,如果你定義了一個抽象類,卻不去繼承它,那麼等於白白創建了這個抽象類,因為你不能用它來做任何事情。對於一個父類,如果它的某個方法在父類中實現出來沒有任何意義,必須根據子類的實際需求來進行不同的實現,那麼就可以將這個方法聲明為abstract方法,此時這個類也就成為abstract類了。
包含抽象方法的類稱為抽象類,但並不意味着抽象類中只能有抽象方法,它和普通類一樣,同樣可以擁有成員變量和普通的成員方法。注意,抽象類和普通類的主要有三點區別:
1)抽象方法必須為public或者protected(因為如果為private,則不能被子類繼承,子類便無法實現該方法),缺省情況下默認為public。
2)抽象類不能用來創建對象;
3)如果一個類繼承於一個抽象類,則子類必須實現父類的抽象方法。如果子類沒有實現父類的抽象方法,則必須將子類也定義為為abstract類。
在其他方面,抽象類和普通的類並沒有區別。
二.接口
接口,英文稱作interface,在軟件工程中,接口泛指供別人調用的方法或者函數。從這裡,我們可以體會到Java語言設計者的初衷,它是對行為的抽象。在Java中,定一個接口的形式如下:
[public] interface InterfaceName { }
接口中可以含有 變量和方法。但是要注意,接口中的變量會被隱式地指定為public static final變量(並且只能是public static final變量,用private修飾會報編譯錯誤),而方法會被隱式地指定為public abstract方法且只能是public abstract方法(用其他關鍵字,比如private、protected、static、 final等修飾會報編譯錯誤),並且接口中所有的方法不能有具體的實現,也就是說,接口中的方法必須都是抽象方法。從這裡可以隱約看出接口和抽象類的區別,接口是一種極度抽象的類型,它比抽象類更加「抽象」,並且一般情況下不在接口中定義變量。
要讓一個類遵循某組特地的接口需要使用implements關鍵字,具體格式如下:
class ClassName implements Interface1,Interface2,[….]{}
可以看出,允許一個類遵循多個特定的接口。如果一個非抽象類遵循了某個接口,就必須實現該接口中的所有方法。對於遵循某個接口的抽象類,可以不實現該接口中的抽象方法。
三.抽象類和接口的區別
1.語法層面上的區別
1)抽象類可以提供成員方法的實現細節,而接口中只能存在public abstract 方法;
2)抽象類中的成員變量可以是各種類型的,而接口中的成員變量只能是public static final類型的;
3)接口中不能含有靜態代碼塊以及靜態方法,而抽象類可以有靜態代碼塊和靜態方法;
4)一個類只能繼承一個抽象類,而一個類卻可以實現多個接口。
2.設計層面上的區別
1)抽象類是對一種事物的抽象,即對類抽象,而接口是對行為的抽象。抽象類是對整個類整體進行抽象,包括屬性、行為,但是接口卻是對類局部(行為)進行抽象。舉個簡單的例子,飛機和鳥是不同類的事物,但是它們都有一個共性,就是都會飛。那麼在設計的時候,可以將飛機設計為一個類Airplane,將鳥設計為一個類Bird,但是不能將 飛行 這個特性也設計為類,因此它只是一個行為特性,並不是對一類事物的抽象描述。此時可以將 飛行 設計為一個接口Fly,包含方法fly( ),然後Airplane和Bird分別根據自己的需要實現Fly這個接口。然後至於有不同種類的飛機,比如戰鬥機、民用飛機等直接繼承Airplane即可,對於鳥也是類似的,不同種類的鳥直接繼承Bird類即可。從這裡可以看出,繼承是一個 「是不是」的關係,而 接口 實現則是 「有沒有」的關係。如果一個類繼承了某個抽象類,則子類必定是抽象類的種類,而接口實現則是有沒有、具備不具備的關係,比如鳥是否能飛(或者是否具備飛行這個特點),能飛行則可以實現這個接口,不能飛行就不實現這個接口。
2)設計層面不同,抽象類作為很多子類的父類,它是一種模板式設計。而接口是一種行為規範,它是一種輻射式設計。什麼是模板式設計?最簡單例子,大家都用過ppt裏面的模板,如果用模板A設計了ppt B和ppt C,ppt B和ppt C公共的部分就是模板A了,如果它們的公共部分需要改動,則只需要改動模板A就可以了,不需要重新對ppt B和ppt C進行改動。而輻射式設計,比如某個電梯都裝了某種報警器,一旦要更新報警器,就必須全部更新。也就是說對於抽象類,如果需要添加新的方法,可以直接在抽象類中添加具體的實現,子類可以不進行變更;而對於接口則不行,如果接口進行了變更,則所有實現這個接口的類都必須進行相應的改動。
下面看一個網上流傳最廣泛的例子:門和警報的例子:門都有open( )和close( )兩個動作,此時我們可以定義通過抽象類和接口來定義這個抽象概念:
abstract class Door { public abstract void open(); public abstract void close();}
或者:
interface Door { public abstract void open(); public abstract void close();}
但是現在如果我們需要門具有報警alarm( )的功能,那麼該如何實現?下面提供兩種思路:
1)將這三個功能都放在抽象類裏面,但是這樣一來所有繼承於這個抽象類的子類都具備了報警功能,但是有的門並不一定具備報警功能;
2)將這三個功能都放在接口裏面,需要用到報警功能的類就需要實現這個接口中的open( )和close( ),也許這個類根本就不具備open( )和close( )這兩個功能,比如火災報警器。
從這裡可以看出, Door的open() 、close()和alarm()根本就屬於兩個不同範疇內的行為,open()和close()屬於門本身固有的行為特性,而alarm()屬於延伸的附加行為。因此最好的解決辦法是單獨將報警設計為一個接口,包含alarm()行為,Door設計為單獨的一個抽象類,包含open和close兩種行為。再設計一個報警門繼承Door類和實現Alarm接口。
interface Alram { void alarm();} abstract class Door { void open(); void close();} class AlarmDoor extends Door implements Alarm { void oepn() { //…. } void close() { //…. } void alarm() { //…. }}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/236318.html