1. 程式人生 > >7月21日---關鍵字、抽象方法、抽象類、介面、多型及總結、設計模式

7月21日---關鍵字、抽象方法、抽象類、介面、多型及總結、設計模式

static關鍵字

static 靜態的 用來定義該類中物件共有的屬性
靜態的變數和方法可以通過”類名. “呼叫
靜態只能呼叫靜態 不能使用super 和this

final關鍵字

final最後 最終
用final修飾類 該類不能被繼承
用final修飾方法 該方法不允許被重寫
用final修飾變數 該變數值不允許被修改
全域性變數用final修飾後要立刻賦值
區域性變數可以先聲明後賦值

用static和final修飾後的變數相當於常量
常量命名規則 全部大寫單詞用下劃線隔開
靜態匯入
這裡寫圖片描述

導包
當定義一個String類的變數是 會自動匯入:lang.*

抽象方法

abstract
抽象方法沒有方法體
抽象方法肯定有抽象類
抽象方法必須在子類中實現,除非子類是抽象類

匿名內部類,一般在只使用一個此類物件的時候使用,

    Students s = new Students(){
    @Override
    public void run() {
    // TODO Auto-generated method stub
        }
    };
    //Students是一個抽象類,Schoolboy是Students的子類,Students s = new Students();是使用不了的,可以用Students s = new Schoolboy();,或者用到一個匿名內部類,相當於建立了一個類繼承了Students類,然後用此類建立了一個物件

介面

interface
只有抽象方法的抽象類可以用介面來表示

介面中只允許有常量和抽象方法
介面中的方法是抽象的,沒有方法體
介面中不能有變數
這裡寫圖片描述
這裡寫圖片描述

介面的定義和類的定義很相似,只是關鍵字不同,關鍵字為interface。宣告格式如>下:interface 介面名{}
上面的大括號中為介面體。介面體中包含成員變數定義和方法定義兩部分。
介面體中只進行方法的宣告,不允許提供方法的實現。所以在格式上只存在方法宣告,實際上沒有方法體,而方法體要在實現的類中再去具體定義。
還有一點需要說明的是:如果一個類使用了某個介面,就必須要實現這個介面的所有方法,即使實在沒有內容只是一個空的方法體也不許要寫。而且每個方法都預設是public的,所以實現時程式碼一定要用public做修飾,引數個數,型別以及返回值的型別都必須與介面中的宣告相一致。
例如:
interface Runable { }
介面和抽象類的區別

多型

父類的引用指向子類的物件
多型
例:
Print print = new LGPrint();//LG是Print的子類
Paper paper = new ChenguangPaper();
Ink ink = new BeijingInk();

instanceof
這裡寫圖片描述

內部類

內部類就是建立在內部的類,是指物件包含的類

建立內部類的方法:
這裡寫圖片描述

這裡寫圖片描述

封裝、繼承和多型總結

1、我們可以把JAVA中的類分為以下三種:

類:使用class定義且不含有抽象方法的類。

抽象類:使用abstract class定義的類,它可以含有,也可以不含有抽象方法。

介面:使用interface定義的類。

在這三種類型之間存在下面的繼承規律:

類可以繼承(extends)類,可以繼承(extends)抽象類,可以繼承(implements)介面。

抽象類可以繼承(extends)類,可以繼承(extends)抽象類,可以繼承(implements)介面。

介面只能繼承(extends)介面。

2、繼承(inheritance)
繼承是使用已存在的類的定義作為基礎建立新類的技術,新類的定義可以增加新的資料或新的功能,也可以用父類的功能,但不能選擇性地繼承父類。這種技術使得複用以前的程式碼非常容易,能夠大大縮短開發週期,降低開發費用。

繼承是為了重用父類程式碼,同時為實現多型性作準備。

3、封裝(encapsulation)
類使得資料和對資料的操作整合在一起,從而對使用該類的其他人來說,可以不管它的實現方法,而只管用它的功能,從而實現所謂的資訊隱藏。 封裝隱藏了類的內部實現機制,從而可以在不影響使用者的前提下改變類的內部結構,同時保護了資料。
4、多型(polymorphism)

方法的重寫、過載與動態連線構成多型性。Java之所以引入多型的概念,原因之一是它在類的繼承問題上和C++不同,後者允許多繼承,這確實給其帶來的非常強大的功能,但是複雜的繼承關係也給C++開發者帶來了更大的麻煩,為了規避風險,Java只允許單繼承,派生類與基類間有IS-A的關 系(即“貓”is a “動物”)。這樣做雖然保證了繼承關係的簡單明瞭,但是勢必在功能上有很大的限制,所以,Java引入了多型性的概念以彌補這點的不足,此外,抽象類和介面也是解決單繼承規定限制的重要手段。同時,多型也是面向物件程式設計的精髓所在。
多型又分為設計時多型和執行時多型,例如過載又被稱為設計時多型,而對於覆蓋或繼承的方法,JAVA執行時系統根據呼叫該方法的例項的型別來決定選擇呼叫哪個方法則被稱為執行時多型。總而言之,面向物件的設計的典型特點就是繼承,封裝和多型,這些特點也是面向物件之所以能如此盛行的關鍵所在。

對於多型,可以總結它為:

一、使用父類型別的引用指向子類的物件;該引用只能呼叫父類中定義的方法和變數;

二、如果子類中重寫了父類中的一個方法,那麼在呼叫這個方法的時候,將會呼叫子類中的這個方法;(動態連線、動態呼叫)

三、變數不能被重寫(覆蓋),"重寫"的概念只針對方法。

重寫和過載

過載(Overloading)

(1) 方法過載是讓類以統一的方式處理不同型別資料的一種手段。多個同名函式同時存在,具有不同的引數個數/型別。
過載Overloading是一個類中多型性的一種表現。
(2) Java的方法過載,就是在類中可以建立多個方法,它們具有相同的名字,但具有不同的引數和不同的定義。
呼叫方法時通過傳遞給它們的不同引數個數和引數型別來決定具體使用哪個方法, 這就是多型性。
(3) 過載的時候,方法名要一樣,但是引數型別和個數不一樣,返回值型別可以相同也可以不相同。無法以返回型別作為過載函式的區分標準。

重寫(Overriding)

(1) 父類與子類之間的多型性,對父類的函式進行重新定義。如果在子類中定義某方法與其父類有相同的名稱和引數,我們說該方法被重寫 (Overriding)。
但有時子類並不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要採用方法的重寫。方法重寫又稱方法覆蓋。
(2)若子類中的方法與父類中的某一方法具有相同的方法名、返回型別和引數表,則新方法將覆蓋原有的方法。如需父類中原有的方法,可使用super關鍵字,該關鍵字引用了當前類的父類。
(3)子類函式的訪問修飾許可權不能少於父類的;

設計模式

參考資料

設計模式分為:單例設計模式和共產設計模式

1.單例設計模式

所謂單例設計模式簡單說就是無論程式如何執行,採用單例設計模式的類(Singleton類)永遠只會有一個例項化物件產生。具體實現步驟如下:
(1)先私有構造器
(2)建立靜態得到物件的方法
(3)穿件物件
(4)在靜態方法中加條件語句

package Print;

public class Students {
    private static Students instence;
    private Students(){

    }
    public static Students getInstence(){
        if(instence==null){
            instence=new Students();
        }
        return instence;    
    }

}


package Print;

public class Test {
    public static void main(String[] args) {
        Students zhangsan = Students.getInstence();
        Students lisi = Students.getInstence();
        System.out.println(zhangsan);
        System.out.println(lisi);

    }

}
結果:
[email protected]19e0bfd
[email protected]19e0bfd

2.工廠設計模式

程式在介面和子類之間加入了一個過渡端,通過此過渡端可以動態取得實現了共同介面的子類例項化物件。

例:
要先新建一個File,名稱為config.properties,,在裡面寫ink app或者ink hPP

public Print creatPrint(){
        Properties properties = new Properties();
        String s = "";
        try{
            properties.load(new FileInputStream("config.properties"));
            s = properties.getProperty("ink");
            System.out.println(s);
        }catch(IOException e){
            e.printStackTrace();

        }
        Print print = null;
        if(s.equals("app")){
            print=new HPPrint();

        }else if(s.equals("hPP")){
            print=new ApplePrint();
        }
        //Print print = new HPPrint();
        return print;
    }

相關推薦

no