學習Java的Day04

知識點

 

接口:

 

  1.接口是功能的集合,一樣可看作是一種數據類型,是比抽象類更爲抽象的」類

 

  2. 接口中只容許出現抽象方法,不能出現非抽象方法

 

  3. 接口的源文件也是java文件,編譯後的文件也是.class,因此能夠把接口看做一個特殊的類

 

注意:

  • 接口是供別的類去實現的,而且要實現他的抽象方法的,因此接口中方法的訪問修飾符必須定義成public

  • 接口中不能定義普通的成員變量,只能定義成public static final 成員變量

  • 一個類能夠同時實現多個接口,可是須要將抽象方法進行實現,建立接口的時候修飾符能夠省略, 系統會自動加上,實現的時候,就必需要添加public

 

接口的特色:

 

  • 接口不能建立對象

  • 接口的變量使用public static final修飾,若是不寫默認添加

  • 接口的方法爲public abstrict,若是不寫默認添加

  • 子類必須重寫接口中全部的抽象方法後,才能建立對象,

  • 若是子類不不可以重寫全部的抽象方法,那麼子類必須定義成抽象類

 

接口的做用:

 

  • 擴展原有類的功能
  • 設定規則
  • 下降耦合性

 

問題分析:

 

1.爲何接口能夠實現多繼承????

  答:由於接口中的方法都是沒有實現的,因此就算有兩個父接口的方法名稱相同,子類實現接口的時候也不會有什麼影響,

    只要重寫便可,因此接口與接口之間是存在多繼承的。

 

小小練習:

package com.day04;

public interface HDMI {

    //獲取輸入信號名稱
    void  input();

    //獲取設備名稱
    String  getName();
}

///////////////////////////////////////////////////////////

class computer implements HDMI{

    @Override
    public void input() {
        System.out.println("電腦信號輸入。。。。。。");
    }

    @Override
    public String getName() {

        return "電腦設備";
    }
}

/////////////////////////////////////////////////////////////

class GameMachine implements HDMI{
    @Override
    public void input() {
        System.out.println("遊戲機信號輸入。。。。。。");
    }

    @Override
    public String getName() {
        return "遊戲機設備";
    }
}

//////////////////////////////////////////////////////////////////

class  TV {
    public  void output(HDMI hdmi ) {
        //設備錄入
        hdmi.input();
        //獲取設備名稱
        System.out.println("設備名稱爲:" +hdmi.getName());
    }
}

class  TestHDMI{

    public static void main(String[] args) {
        //呈現電腦畫面
        computer com = new computer();
        GameMachine game = new GameMachine();
        //準備終端設備
        TV tv = new TV();
        tv.output(game);
    }
}

 

 

 

多態: 當一個類能表現出多種狀態的時候,咱們稱這種現象爲多態現象


多態的表現形式:讓父類的變量去指向子類對象的地址java

條件:必須有繼承關係

多態的表達形式:  父接口/父類   變量  =   new     子類/父接口的實現類的對象

 

注意:同一個父類的方法會被不一樣的子類重寫。在調用方法時,調用的爲各個子類重寫後的方法。

 

 

多態的特色 

  • 對於成員方法:編譯的時候看=左邊,運行的時候看=右邊

  • 對於成員變量:編譯的時候看=左邊,運行的時候看=左邊

 

instanceof關鍵字

  若是直接進行強制轉換的時候有可能會出現問題,因此可使用instanceof進行判斷如 對象 instanceof 類名  判斷左邊的對象與右邊的變量是否有所屬關係。

 

 練習簡單的多態

package com.day04.work01;

import java.util.Random;

public class People {
    /*
    定義一個類是People,定義兩個類,一個是Man,一個是 Woman,Man中有個屬性是老婆,有一個方法 lol,
    Woman中有個屬性是老公,有一個方法shopping,
    還 有一個方法生孩子,先判斷是否有老公,若是有,就建立 一個對象50%機率是man,50%機率是woman,有一個 返回值,
    最後若是是男的調用lol,若是是nv的調用 shopping
     */
}

class Man extends People {

    Woman laopo;

    void lol() {
        System.out.println("玩LOL。。。。。。");
    }

}

class Woman extends People {

    Man laogong;

    void shopping() {
        System.out.println("購物。。。。。。。");
    }

    public People getBaby() {

        People peo = null;
        if (laogong != null) {
            Random ran = new Random();
            int x = ran.nextInt(2);
            if (x == 0) {
                peo = new Man();
            } else if (x == 1) {
                peo = new Woman();
            }
        }
        return peo;
    }
}

class TestPeople {
    public static void main(String[] args) {
        Man man = new Man();
        Woman woman = new Woman();
        woman.laogong = man;

        People peo = woman.getBaby();
        if (peo == null) {
            System.out.println("沒有老公,不能生孩子");
            return;
        }
        if (peo instanceof Man) {
            Man m = (Man) peo;
            m.lol();
        } else {
            Woman wo = (Woman) peo;
            wo.shopping();
        }

    }
}

  

 

 

構造方法特色:

 

 

  • 構造方法名稱必須和類型保持一致。

  • 構造方法沒有具體的返回值。

 

 

 

 

 

爲何子類的構造方法會去調用父類的構造方法呢????

 

   由於構造方法自己就是初始化對象的成員變量的,父類 的構造方法也是這個目的,若是不去調用,咱們就不知道父類作了什麼操做,因此纔會隱式的去調用super();

 

子類會繼承父類中的內容,因此子類在初始化時,必須先到父類中去執行父類的初始化動做。這樣,纔可使用父類中的內容。

 

 

 

若是子類會默認調用父類的無參構造方法,若是父類中又沒有無參的構造方法,程序會出現什麼問題?編譯器 會自動去找到對應的有參的構造方法麼?????

 

  若是父類中沒有空參構造方法,那麼子類的的構造方法 就會報錯,須要咱們顯示的調用父類的有參數的構造方法

相關文章
相關標籤/搜索