2019-08-12 java抽象類 接口

目的

學(xué)習(xí):

1.抽象類的定義

2.抽象類的規(guī)則

3.接口的使用

技術(shù)及其使用

一.抽象類

所有的對象都是通過類來描述的愿卸,但不是所有類都能描述完全對象,一個不能具體描述出一個對象的類被稱為抽象類。
/**
 * 抽象類 abstract
 * 模板的作用 模具 -> 玩具(顏色不一樣 材質(zhì)不一樣)
 *          學(xué)習(xí)路線 ——> C語言 -> java -> 界面 網(wǎng)絡(luò) 多線程 數(shù)據(jù)庫
 *
 * */

/**定義一個抽象類 管理學(xué)習(xí)Android 開發(fā)的路線
 * 抽象類里面定義使用這個功能就有必要實現(xiàn)的方法或?qū)傩? * 抽象類不能實例化 不能創(chuàng)建抽象類的對象
 * */
 abstract class AndroidStudy{
     //定義一個代碼塊
    {
        System.out.println("fitness");
    }
     //定義一個屬性 用于保存數(shù)據(jù)
     public String javaBook;
     public Dream dream;

     //提供一個構(gòu)造方法

     public AndroidStudy(String javaBook,String dream){
         this.javaBook = javaBook;
         this.dream = new Dream();
         this.dream.name = dream;
     }

     //定義一個靜態(tài)的常量
     public static  final String cBook = "C premier";
     //定義一個抽象方法 不需要實現(xiàn) 子類來實現(xiàn)
     public abstract void studyC();
     //定義一個普通方法 已經(jīng)確定了這個方法的具體實現(xiàn)
     public void studyJava(){
         System.out.println("參加java培訓(xùn)班");
     }

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

         public void show(){
             System.out.println("my dream is : "+name);
         }
     }
}
如果你想設(shè)計這樣一個類,該類包含一個特別的成員方法,該方法的具體實現(xiàn)由它的子類確定丽猬,那么你可以在父類中聲明該方法為抽象方法宿饱。
Abstract 關(guān)鍵字同樣可以用來聲明抽象方法,抽象方法只包含一個方法名宝鼓,而沒有方法體刑棵。
抽象方法沒有定義巴刻,方法名后面直接跟一個分號愚铡,而不是花括號。

聲明抽象方法會造成以下兩個結(jié)果:

1.如果一個類包含抽象方法胡陪,那么該類必須是抽象類沥寥。
2.任何子類必須重寫父類的抽象方法,或者聲明自身為抽象類柠座。
3.繼承抽象方法的子類必須重寫該方法邑雅。否則,該子類也必須聲明為抽象類妈经。最終淮野,必須有子類實現(xiàn)該抽象方法,否則吹泡,從最初的父類到最終的子類都不能用來實例化對象骤星。

總結(jié):

1. 抽象類不能被實例化(初學(xué)者很容易犯的錯),如果被實例化爆哑,就會報錯洞难,編譯無法通過。只有抽象類的非抽象子類可以創(chuàng)建對象揭朝。
2. 抽象類中不一定包含抽象方法队贱,但是有抽象方法的類必定是抽象類。
3. 抽象類中的抽象方法只是聲明潭袱,不包含方法體柱嫌,就是不給出方法的具體實現(xiàn)也就是方法的具體功能。
4. 構(gòu)造方法屯换,類方法(用 static 修飾的方法)不能聲明為抽象方法编丘。
5. 抽象類的子類必須給出抽象類中的抽象方法的具體實現(xiàn),除非該子類也是抽象類趟径。

二.接口

接口(英文:Interface)瘪吏,在JAVA編程語言中是一個抽象類型,是抽象方法的集合蜗巧,接口通常以interface來聲明掌眠。一個類通過繼承接口的方式,從而來繼承接口的抽象方法幕屹。
接口并不是類蓝丙,編寫接口的方式和類很相似级遭,但是它們屬于不同的概念。類描述對象的屬性和方法渺尘。接口則包含類要實現(xiàn)的方法挫鸽。
除非實現(xiàn)接口的類是抽象類,否則該類要定義接口中的所有方法鸥跟。
接口無法被實例化丢郊,但是可以被實現(xiàn)。一個實現(xiàn)接口的類医咨,必須實現(xiàn)接口內(nèi)所描述的所有方法枫匾,否則就必須聲明為抽象類。另外拟淮,在 Java 中干茉,接口類型可用來聲明一個變量,他們可以成為一個空指針很泊,或是被綁定在一個以此接口實現(xiàn)的對象角虫。

接口與類相似點:

1.一個接口可以有多個方法。
2.接口文件保存在 .java 結(jié)尾的文件中委造,文件名使用接口名戳鹅。
3.接口的字節(jié)碼文件保存在 .class 結(jié)尾的文件中。
4.接口相應(yīng)的字節(jié)碼文件必須在與包名稱相匹配的目錄結(jié)構(gòu)中争涌。
5.接口與類的區(qū)別:
6.接口不能用于實例化對象粉楚。
7.接口沒有構(gòu)造方法。
8.接口中所有的方法必須是抽象方法亮垫。
9.接口不能包含成員變量模软,除了 static 和 final 變量。
10.接口不是被類繼承了饮潦,而是要被類實現(xiàn)燃异。
11.接口支持多繼承。

接口特性:

1.接口中每一個方法也是隱式抽象的,接口中的方法會被隱式的指定為 public abstract(只能是 public abstract继蜡,其他修飾符都會報錯)回俐。
2.接口中可以含有變量,但是接口中的變量會被隱式的指定為 public static final 變量(并且只能是 public稀并,用 private 修飾會報編譯錯誤)仅颇。
3.接口中的方法是不能在接口中實現(xiàn)的,只能由實現(xiàn)接口的類來實現(xiàn)接口中的方法碘举。

抽象類和接口的區(qū)別

1. 抽象類中的方法可以有方法體忘瓦,就是能實現(xiàn)方法的具體功能,但是接口中的方法不行引颈。
2. 抽象類中的成員變量可以是各種類型的耕皮,而接口中的成員變量只能是 public static final 類型的境蜕。
3. 接口中不能含有靜態(tài)代碼塊以及靜態(tài)方法(用 static 修飾的方法),而抽象類是可以有靜態(tài)代碼塊和靜態(tài)方法凌停。
4. 一個類只能繼承一個抽象類粱年,而一個類卻可以實現(xiàn)多個接口。

測試:

/**
 * 接口 interface 定義一套方法 用于對象之間的通信
 * 接口就是定義一套規(guī)則/規(guī)范
 *
 *
 * 接口里面默認的變量都是static final 常量
 *默認情況下不需要自己寫 public static final
 * 不能定義變量
 *
 * 接口里面不能定義代碼塊
 *
 * 接口里面不能定義構(gòu)造方法
 *
 * 接口里面不能添加普通/對象/實例方法
 * 只有抽象方法
 * 默認就是 public abstract
 *
 * 如果需要定義已經(jīng)有實現(xiàn)的方法
 * 使用default
 *
 * 接口里面可以定義內(nèi)部類
 * 一個類可以實現(xiàn)多個接口
 *
 * 一個接口可以繼承多個接口
 * interface testInterface2 extends testInterface
 * */

interface testInterface{

    public static final int I = 100;
    int COUNT =20;

    void test();
    public void test2();
    public abstract void test3();

    static class inner{
        int name;
        public void show(){
            System.out.println("woo");
        }
    }
}
interface testInterface2 extends testInterface{

    public static final int I = 100;
    int COUNT =20;

    void test();
    public void test2();
    public abstract void test3();

    static class inner{
        int name;
        public void show(){
            System.out.println("woo");
        }
    }
}

class WYClass implements testInterface,testInterface2{
    @Override
    public void test(){
        testInterface2.inner in = new testInterface2.inner();
        in.show();
        }
        @Override
    public void test2(){

        }
        @Override
    public void test3(){

        }
}
class Te{
    public static void main(String[] args){
        WYClass go = new WYClass();
        testInterface t =new WYClass();
    }
}

接口的聲明

接口的聲明語法格式如下:
[可見度] interface 接口名稱 [extends 其他的接口名] {
        // 聲明變量
        // 抽象方法
}

接口的實現(xiàn)

當類實現(xiàn)接口的時候罚拟,類要實現(xiàn)接口中所有的方法台诗。否則,類必須聲明為抽象的類舟舒。
類使用implements關(guān)鍵字實現(xiàn)接口拉庶。在類聲明中,Implements關(guān)鍵字放在class聲明后面秃励。
實現(xiàn)一個接口的語法,可以使用這個公式:
...implements 接口名稱[, 其他接口名稱, 其他接口名稱..., ...] ...

實際使用

用接口實現(xiàn)模擬按鈕的點擊和對代碼運行時間的計算
/**
 * 管理界面的抽象類 定義了一個界面創(chuàng)建到結(jié)束的模板
 *
 * **/
import java.util.ArrayList;
public class Start {
    public static void main(String[] args){

        //啟動程序 創(chuàng)建界面
        MainActivity main = new MainActivity();
        //模擬觸摸
        main.touch();

        MyCode code  =new MyCode();
        code.calculate();

    }

}
public abstract class Activity{
   //保存這個界面的所有子視圖
   public ArrayList<View> childs = new ArrayList<>();
   //界面創(chuàng)建
   public abstract void onCreate();

   //界面銷毀
   public abstract void onDestory();

   //將一個子控件添加到主界面上
   //接收的時候是用父類去接收子類
   //當需要訪問子類內(nèi)容的時候就要降至轉(zhuǎn)化為對應(yīng)的類
   public void addChild(View v){
       //保存子類控件
       if(v instanceof Button) {
           Button btn = (Button)v;
           System.out.println(btn.title+"按鈕顯示到界面上了");
       }else {
           ImageView img = (ImageView)v;
           System.out.println(((ImageView) v).picture+"的圖片顯示到界面上了");
       }
       childs.add(v);
   }
}
//創(chuàng)建主界面
//管理主界面(程序運行起來的第一個界面)
public class MainActivity extends Activity implements View.onClickListener{
    Button btn;
    ImageView img;
    //構(gòu)造方法
    //當界面被創(chuàng)建 就自動調(diào)用oncreate方法
    public MainActivity(){
        onCreate();
    }
    @Override
    public void onCreate() {

        btn = new Button("share","Red");

        img = new ImageView("jay zhou");

        //將創(chuàng)建的控件添加到當前界面
        addChild(btn);
        addChild(img);

        //如果一個控件需要監(jiān)聽事件 就必須實現(xiàn)監(jiān)聽事件的接口
        //告訴按鈕是誰在監(jiān)聽這個事件
        btn.listener = this;

        //2.
        //給imageview添加一個事件
        img.listener = new View.onClickListener(){
            @Override
            public void onClick(View v){
                System.out.println("圖片被點擊了");
            }
        };



    }
    //模擬觸摸屏幕
    public void touch(){
        //將屏幕觸摸的時間傳遞給按鈕
        btn.getTouchEvent();
        img.getTouchEvent();
    }

    @Override
    public void onDestory() {

    }
    //當事件觸發(fā)了 就會來調(diào)用這個onClick方法
    @Override
    public void onClick(View v) {
        System.out.println("按鈕被點擊了");
    }
}
public class                Button extends View{
    String title;
    String titleColor;

    public Button(String title,String titleColor){
        this.title = title;
        this.titleColor =titleColor;

    }

}
public class ImageView extends View{
    String picture;

    public ImageView(String picture){
        this.picture = picture;
    }
}
//管理一個視圖顯示和事件監(jiān)聽
//什么情況下需要將一個父類做成抽象類(模板)
//1.不能直接創(chuàng)建這個類的對象
//2.這個類里面的某些方法 還不確定如何實現(xiàn)
//
public class View{
    //所有視圖都共有的屬性

    String backogoundColor;
    String borderColor;

    //所有的視圖都要監(jiān)聽事件
    //定義內(nèi)部接口 封裝
    //暫時我不確定是誰要監(jiān)聽 但是要監(jiān)聽事件的人肯定實現(xiàn)了這個接口

    onClickListener listener;


    public interface onClickListener{

        //定義一套方法 約束外部使用這些方法來監(jiān)聽事件

         public abstract void onClick(View v);


    }
    public void getTouchEvent(){
        //調(diào)用監(jiān)聽者里面的onclick方法
        listener.onClick(this);

    }
}
public abstract class TimeTemplate {
    public abstract void code();

    public void calculate(){
        long start  = System.currentTimeMillis();
        code();
        long end = System.currentTimeMillis();

        System.out.println(end - start);
    }
}
class MyCode extends TimeTemplate{

    @Override
    public void code() {
        //寫自己的測試代碼
        int[] nico =new int[10000000];
        for (int nicos:nico){
            System.out.println("1314521"+nicos);
        }
    }
}

運行結(jié)果

result

Be better

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吉捶,一起剝皮案震驚了整個濱河市夺鲜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌呐舔,老刑警劉巖币励,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異珊拼,居然都是意外死亡食呻,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門澎现,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仅胞,“玉大人,你說我怎么就攤上這事剑辫「删桑” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵妹蔽,是天一觀的道長椎眯。 經(jīng)常有香客問我,道長胳岂,這世上最難降的妖魔是什么编整? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮乳丰,結(jié)果婚禮上掌测,老公的妹妹穿的比我還像新娘。我一直安慰自己成艘,他們只是感情好赏半,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布贺归。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赏迟,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天糊饱,我揣著相機與錄音,去河邊找鬼氏身。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的赵颅。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼暂刘,長吁一口氣:“原來是場噩夢啊……” “哼饺谬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谣拣,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤募寨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后森缠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拔鹰,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年贵涵,在試婚紗的時候發(fā)現(xiàn)自己被綠了列肢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡宾茂,死狀恐怖瓷马,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情刻炒,我是刑警寧澤决采,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站坟奥,受9級特大地震影響树瞭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜爱谁,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一晒喷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧访敌,春花似錦凉敲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽势决。三九已至,卻和暖如春蓝撇,著一層夾襖步出監(jiān)牢的瞬間果复,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工渤昌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留虽抄,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓独柑,卻偏偏與公主長得像迈窟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子忌栅,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容