Java語(yǔ)言的學(xué)習(xí)與實(shí)踐6(抽象類,接口,模板設(shè)計(jì)模式)

1.收獲

在今天開始學(xué)習(xí)抽象類的時(shí)候,當(dāng)時(shí)腦子亂的,感覺自己什么都不知道,只能自己一步一步來(lái)理解,但是畢竟是上課,所以就有點(diǎn)跟不上上課的節(jié)奏,以至于后面講的demo都不知道是哪一步是哪一步,當(dāng)時(shí)就是腦子像亂燉一樣,根本沒有一點(diǎn)邏輯,沒有一點(diǎn)思路,當(dāng)時(shí)心里面煩躁,有點(diǎn)學(xué)不下去的感覺,但是自己心頭一熱,不能放棄,我就不相信就不能理解,于是自己先慢慢理解思路,問的同學(xué),最后自己有了一點(diǎn)頭緒,但是還有一些點(diǎn)不能理解,于是就去問東哥,在東哥講解下理解了那些點(diǎn),自己下來(lái)后慢慢分析了一次,最后還是把它理解了。無(wú)論是什么,只要自己不要放棄,就有可能,就有希望!感謝東哥!感謝堅(jiān)持的自己!加油!

2.技術(shù)(知識(shí)點(diǎn))

(1)抽象類的定義和使用
(2)接口的定義和使用
(3)模板設(shè)計(jì)模式的使用

3.技術(shù)(知識(shí)點(diǎn))實(shí)際運(yùn)用

(1)抽象類的定義和使用
什么是抽象類:按照我自己的理解就是就是一個(gè)模板或者是模型,當(dāng)有的類想要有的屬性和方法和那個(gè)模型一樣的時(shí)候,那么這個(gè)類就可以繼承于那個(gè)模板類,那麼這個(gè)子類就有那個(gè)模板類的屬性和方法了。但是并不是像繼承那樣就可以了,還有許多不同的地方。
抽象類的定義:首先要用absract來(lái)修飾這個(gè)父類(模板類),在抽象累中可以實(shí)現(xiàn)代碼塊,構(gòu)造方法,普通方法,內(nèi)部類,定義靜態(tài)的常量。

abstract class BaseAndroidStudy {
            //代碼塊
            {
                System.out.println("鍛煉好身體");
            }

            //定義一個(gè)屬性 用于保存數(shù)據(jù)
            public String Javabook;
            public Dream dream;


            //定義一個(gè)構(gòu)造方法
            public BaseAndroidStudy(String Javabook, String dream) {
                this.Javabook = Javabook;
                this.dream = new Dream();
                this.dream.name = dream;
            }

            //定義一個(gè)靜態(tài)的常量
            public final String CBOOK = "C primier";

            //定義一個(gè)抽象方法 不需要實(shí)現(xiàn) 子類來(lái)實(shí)現(xiàn)
            public abstract void studyC();

            //定義一個(gè)普通的方法 已經(jīng)確定這個(gè)方法的具體實(shí)現(xiàn)
            public void studyJava() {
                System.out.println("參加Java培訓(xùn)班");
            }

            //定義一個(gè)內(nèi)部類用于管理每個(gè)人的夢(mèng)想
            class Dream {
                public String name;

                public void show() {
                    System.out.println("我的夢(mèng)想是:" + name);
                }
            }
        }

注意在抽象類中的抽象方法是不需要實(shí)現(xiàn)的,具體的實(shí)現(xiàn)過程在子類中完成。

class Student extends BaseAndroidStudy{
    String name;
    //實(shí)現(xiàn)抽象方法
    @Override
    public void studyC() {
        System.out.println("看書 看視頻");
    }
    //構(gòu)造方法
    public Student(String name,String bookName,String dream){
        super(bookName,dream);
        this.name=name;

    }
}

使用extends來(lái)繼承一個(gè)抽象類 ,如果繼承一個(gè)抽象類 就必須要實(shí)現(xiàn)抽象類里面的抽象方法, 如果不是實(shí)現(xiàn)抽象方法,也可以把這個(gè)類定義為抽象類。然后再主函數(shù)中創(chuàng)建子類的具體對(duì)象進(jìn)行調(diào)用。

 Student student =new Student("向往", "c語(yǔ)言", "科學(xué)家");

(2)接口的定義和使用
什么接口:按照我自己的理解就是一套規(guī)則,如果你想使用這個(gè)接口的話,就必須要遵守這套規(guī)則,不能違反這套規(guī)則。不要把接口理解為某一個(gè)物理存在的東西,他有的東西實(shí)現(xiàn)不了的,虛擬的,只是一個(gè)模板。
接口的定義:接口前面有interface修飾

interface testInvterface{}

接口里面默認(rèn)變量static final ,常量默認(rèn)情況下不需要自己寫public static final, 不能定義變量

int I =100;
 int COUNT=20;

這就是在接口中定義常量。
注意:接口與抽象類不同,接口里面不能定一個(gè)代碼塊,接口里面不能定義構(gòu)造方法,接口里面不能添加普通/對(duì)象/實(shí)例方法,只有抽象方法,默認(rèn)就是public abstract,而這些在抽象類中是可以實(shí)現(xiàn)的。
例如:

 void test();
     void test1();
      void test2();

這些方法是默認(rèn)的是public abstract。但是在接口中是可以定義內(nèi)部類。
例如:

 class inner{
         String name;
         public  void show(){
             System.out.println("內(nèi)部類");
         }
      }

在接口接口中的內(nèi)部類于在類中的內(nèi)部類有區(qū)別的,在接口內(nèi)的類是 默認(rèn)是靜態(tài)的。
接口可以繼承接口,一個(gè)接口可以繼承多個(gè)接口 interface testInvterface1 extends testInvterface,testInvterface2{}
例如:

interface testInvterface1 extends testInvterface{}

接口的實(shí)現(xiàn):

class PXDClass implements testInvterface,testInvterface1{

     @Override
     public void test() {
         testInvterface.inner in=new testInvterface.inner();
         in.show();
     }

     @Override
     public void test1() {

     }

     @Override
     public void test2() {

     }
 }

使用implements實(shí)現(xiàn)一個(gè)接口,也可以實(shí)現(xiàn)多個(gè)接口,在實(shí)現(xiàn)接口后,要將接口中的抽象方法實(shí)現(xiàn),不然的話會(huì)報(bào)錯(cuò)。一個(gè)類可以實(shí)現(xiàn)多個(gè)接口: class PXDClass implements testInvterface,testInvterface1{}
接口的使用:

class Te{
     public static void main(String[] agrs){
         PXDClass pxd=new PXDClass();
         testInvterface t=new PXDClass();
     }
}

在這里有兩種的使用方法PXDClass pxd=new PXDClass();這種方法都應(yīng)該知道
而 testInvterface t=new PXDClass();因?yàn)?class PXDClass implements testInvterface,與多態(tài)是一個(gè)道理。

(3)模板設(shè)計(jì)模式的使用
希望能夠創(chuàng)建一個(gè)模板,使用這個(gè)模板可以方便地測(cè)出模塊代碼的執(zhí)行的效率
那么我們就可以定義一個(gè)抽象類

abstract class TimeTemplate{
    //通過實(shí)現(xiàn)這個(gè)方法 獲得具體測(cè)量的代碼
    public abstract void code();

    //實(shí)現(xiàn)測(cè)量
    public void calculate(){
        long start=System.currentTimeMillis();
        //測(cè)量代碼
        code();
        long end=System.currentTimeMillis();
        System.out.println(end-start);
    }
}

然后在定義一個(gè)類來(lái)繼承這個(gè)抽象類,并實(shí)現(xiàn)抽象類中的抽象方法

class MyCode extends TimeTemplate{
    @Override
    public void code() {
        //寫自己的測(cè)試代碼
        int total=0;
        for(int i=0;i<1000000;i++){
           total+=1;
        }
    }
}

然后再主函數(shù)定義一個(gè)子類的具體對(duì)象,再來(lái)調(diào)用方法

public class MyClass {
    public static void main(String[] args) {
        MyCode myCode=new MyCode();
        myCode.calculate();
    }
}

最后效果


QQ圖片20190812202621.png

4.知識(shí)點(diǎn)的實(shí)踐

這個(gè)demo是同樣是要進(jìn)行分析的,我們要實(shí)現(xiàn)什么樣的功能,才能進(jìn)行分析。
在這個(gè)demo我們想實(shí)現(xiàn)一個(gè)界面,界面上有一些事件,例如按鈕,圖片,當(dāng)我們點(diǎn)擊圖片或者是按鈕時(shí),會(huì)實(shí)現(xiàn)按鈕被點(diǎn)擊顯示出來(lái)。
分析結(jié)果:


QQ圖片20190812194107.jpg

接下來(lái)我首先要做的就是要實(shí)現(xiàn)Activerty這個(gè)類,在這個(gè)類里面有兩個(gè)方法而這兩個(gè)類我們是不急于實(shí)現(xiàn)的,所以我們用抽象類來(lái)定義

public abstract class Activerty {
    //保存所有控件
    ArrayList<View>childs=new ArrayList();

   public abstract void onCreatk();
    public abstract void onDestroy();
}

在這里用到了view類,我們就要去創(chuàng)建這個(gè)類

public class View {}

然后我們?cè)趘iew 這個(gè)類里面創(chuàng)建一些屬性,在這里我們就要想到事件觸發(fā)來(lái)統(tǒng)一,應(yīng)該一個(gè)接口,當(dāng)事件被觸發(fā)時(shí),我們并不知道是那個(gè)監(jiān)聽者,所以我們需要一個(gè)來(lái)記錄監(jiān)聽者,由于在觸發(fā)事件時(shí),一定會(huì)實(shí)現(xiàn)這個(gè)接口,利用多態(tài)來(lái)定義一個(gè)接口類的監(jiān)聽者。

public class View {
    String backcolor;
    String bordercolor;
    //記錄誰(shuí)想監(jiān)聽
    OnClickLisener lisener;
    //所有控件被監(jiān)聽

    public interface OnClickLisener{
        void OnClick(View v);
    }
}

現(xiàn)在我們來(lái)創(chuàng)建一個(gè)管理主界面的類,在這個(gè)是繼承Activerty,那磨就要去實(shí)現(xiàn)父類里面的抽象方法,創(chuàng)建構(gòu)造方法,當(dāng)在主界面被創(chuàng)建時(shí),就會(huì)被調(diào)用。將抽象方法實(shí)現(xiàn)進(jìn)行創(chuàng)建界面,添加按鈕,添加圖片。

public class MainActiverty extends Activerty implements View.OnClickLisener {
    Botton btn;
    ImageView img;
    //構(gòu)造方法
    public MainActiverty(){
        //當(dāng)界面被創(chuàng)建 就自動(dòng)調(diào)用onCreatk方法
        onCreatk();
    }
    @Override
    public void onCreatk() {
        //添加一個(gè)按鈕
       
        //添加一張圖片
      
        //將創(chuàng)建的控件添加到界面
        
    
    }
 
    @Override
    public void onDestroy() {

    }
}

那麼此時(shí)我們就會(huì)想到要去創(chuàng)建Botton,ImageView,這兩個(gè)類

public class Botton extends View{
    String title;
    String color;

    public Botton(String title,String color){
        this.color=color;
        this.title=title;
    }
}
public class ImageView extends View {
    String picture;
    public ImageView(String picture){
        this.picture=picture;
    }
}

創(chuàng)建完成之后,就要?jiǎng)?chuàng)建一個(gè)添加函數(shù),來(lái)添加控件,空件的添加是每一個(gè)界面要做的,所以將這個(gè)函數(shù)定義在Activerty里面。

 public void addChild(View v){
        if(v instanceof Botton){
            Botton btn=(Botton) v;
            System.out.println(btn.title+"按鈕被添加了");
        }
        if(v instanceof ImageView){
            ImageView img=(ImageView) v;
            System.out.println(img.picture+"圖片被添加了");
        }
        childs.add(v);
    }
}

在添加函數(shù)完成之后,就可以調(diào)用函數(shù)添加了

public void onCreatk() {
        //添加一個(gè)按鈕
       btn=new Botton("分享","紅色");
        //添加一張圖片
        img=new ImageView("周杰倫");
        //將創(chuàng)建的控件添加到界面
        addChild(btn);
        addChild(img);
    }

現(xiàn)在需要來(lái)實(shí)現(xiàn)接口和接口里面的方法

public class MainActiverty extends Activerty implements View.OnClickLisener {
//當(dāng)事件被觸發(fā) 就會(huì)調(diào)用OnClick方法
    @Override
    public void OnClick(View v) {
        if(v==btn){
            System.out.println("按鈕被點(diǎn)擊了");
        }else{
            System.out.println("圖片被點(diǎn)擊了");
        }
    }
}

現(xiàn)在控件被添加上去了那麼就需要告訴控件是誰(shuí)在監(jiān)聽它

//告訴按鈕誰(shuí)在監(jiān)聽
        btn.lisener=this;
        img.lisener=this;

現(xiàn)在這些控件就等著被觸發(fā),當(dāng)被觸發(fā)時(shí),控件就應(yīng)該被告訴他已經(jīng)被觸發(fā)了,現(xiàn)在就創(chuàng)建一個(gè)函數(shù)來(lái)告知控件被觸發(fā)

//用于控件接收觸摸事件
    public void getTouchEvent(){
        //調(diào)用監(jiān)聽者里面的OnClick方法
        lisener.OnClick(this);
    }

現(xiàn)在這些控件就等著被觸發(fā),現(xiàn)在就創(chuàng)建一個(gè)函數(shù)來(lái)觸發(fā)控件

 //模擬觸發(fā)
    public  void touch(){
        btn.getTouchEvent();
        img.getTouchEvent();
    }

現(xiàn)在就需要在主函數(shù)里面創(chuàng)建一個(gè)界面的對(duì)象,來(lái)創(chuàng)建界面,然后調(diào)用觸發(fā)方法,進(jìn)行觸發(fā)

   MainActiverty main=new MainActiverty();
             main.touch();

最后效果


QQ圖片20190812234823.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,639評(píng)論 1 32
  • 面向?qū)ο缶幊蹋∣OP) 在前面的章節(jié)中,我們學(xué)習(xí)了Kotlin的語(yǔ)言基礎(chǔ)知識(shí)、類型系統(tǒng)、集合類以及泛型相關(guān)的知識(shí)。...
    Tenderness4閱讀 4,610評(píng)論 1 6
  • 3. 類設(shè)計(jì)者工具 3.1 拷貝控制 五種函數(shù)拷貝構(gòu)造函數(shù)拷貝賦值運(yùn)算符移動(dòng)構(gòu)造函數(shù)移動(dòng)賦值運(yùn)算符析構(gòu)函數(shù)拷貝和移...
    王偵閱讀 2,071評(píng)論 0 1
  • 一、抽象類 1、抽象類含義的概括: 當(dāng)多個(gè)類出現(xiàn)相同功能時(shí),但功能主體不同,這樣可以向上抽取,抽取時(shí)只抽取功能定義...
    玉圣閱讀 927評(píng)論 0 6
  • 一、學(xué)習(xí)目的 抽象類最核心的作用就是作為模板,接口是定義一套方法,用于對(duì)象之間的通信。抽象類和接口在編寫程序時(shí)有很...
    颵麏閱讀 962評(píng)論 0 2

友情鏈接更多精彩內(nèi)容