1. 程式人生 > 實用技巧 >學習Java的Day04

學習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);
}
}

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

多型的表現形式:讓父類的變數去指向子類物件的地址

條件:必須有繼承關係

多型的表達形式: 父介面/父類 變數 = 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();

子類會繼承父類中的內容,所以子類在初始化時,必須先到父類中去執行父類的初始化動作。這樣,才可以使用父類中的內容。

如果子類會預設呼叫父類的無參構造方法,如果父類中又沒有無參的構造方法,程式會出現什麼問題?編譯器 會自動去找到對應的有參的構造方法麼?????

  如果父類中沒有空參構造方法,那麼子類的的構造方法 就會報錯,需要我們顯示的呼叫父類的有引數的構造方法。