1. 程式人生 > >java學習筆記(13-介面、final、多型)

java學習筆記(13-介面、final、多型)

1.介面interface

1.1 介面基本使用

package com.daigua13;

/*
* 介面的成員特點:
*       只能有抽象方法
*       只能有常量
*       預設使用public&abstract修飾方法
*       只能使用public&abstract修飾方法
*       預設使用public static final來修飾成員變數
* 
* 建議:建議大家手動的給上預設修飾符
* 
* 注意:
*       介面不能建立物件(不能例項化)
*       類與介面的關係是實現關係,一個類實現一個介面必須實現它所有的方法

*/
public class InterfaceDemo {
    public static void main(String[] args) {
        Cat c = new Cat();
        c.eat();
        System.out.println(c.num);
        System.out.println(Animal.num);
    }
}

// 定義介面
interface Animal {
    // 介面只能有常量用public static final修飾
    public static final int num = 10;

    // 抽象方法
    public abstract void eat();
}

class Cat implements Animal {

    public void eat() {
        System.out.println("我是你爸爸!");
    }

}

1.2 介面的多繼承

package com.daigua13;

/*
* 
* 類與類:繼承關係,單一繼承,多層繼承
* 類與介面:實現關係,多實現
* 介面與介面的關係:繼承關係,多繼承
*/
public class InterfaceDemo2 {
    public static void main(String[] args) {

    }
}

interface InterA extends InterB {
    public abstract void method();
}

interface InterB {
    public abstract void function();
}

interface InterC extends InterA {

}

class Demo implements InterC {

    @Override
    public void method() {
        // TODO Auto-generated method stub

    }

    @Override
    public void function() {
        // TODO Auto-generated method stub

    }
}

1.3 運動員案例

package com.daigua13;

public class InterfaceTest {
    public static void main(String[] args) {
        Basketball b = new Basketball();
        b.name = "Mike";
        b.age = 50;
        b.gender = "男";
        b.studyEnglish();
        b.study();
    }
}

class Human {
    String name;
    int age;
    String gender;

    public void eat() {
        System.out.println("吃飯");
    }

    public void sleep() {
        System.out.println("睡覺");
    }
}

abstract class Althlete extends Human {
    // 抽象方法 學習
    public abstract void study();
}

abstract class Coach extends Human {
    // 抽象方法 教
    public abstract void teach();
}

interface StudyEnglish {
    public abstract void studyEnglish();
}

class PingPong extends Althlete {
    @Override
    public void study() {
        // TODO Auto-generated method stub
        System.out.println("學習抽球");
    }
}

class Basketball extends Althlete implements StudyEnglish {
    @Override
    public void study() {
        // TODO Auto-generated method stub
        System.out.println("學扣籃");
    }

    @Override
    public void studyEnglish() {
        // TODO Auto-generated method stub

        System.out.println("籃球運動員" + this.name + "學英語");
    }
}

class BasketballCoach extends Coach {
    @Override
    public void teach() {
        // TODO Auto-generated method stub
        System.out.println("教扣籃");
    }
}

class PingPongCoach extends Coach {
    @Override
    public void teach() {
        // TODO Auto-generated method stub
        System.out.println("教抽球");
    }
}

2.final關鍵字

2.1 簡單使用

package com.daigua13;

/*
* final: 修飾符,可以用於修飾類、成員方法和成員變數
* final所修飾的類:不能被繼承,不能有子類
* final所修飾的方法:不能被重寫
* final所修飾的變數:是不可以修改的,是常量
* 
* 常量:
*       字面值常量:1,2,3
*       自定義常量:被final所修飾的成員變數,一旦初始化則不可改變
* 
* 注意:自定義常量必須初始化,可以選擇顯示初始化或者構造初始化 
*/
public class FinalDemo {
    public static void main(String[] args) {
        // Animal a = new Animal();
        // a.eat();

        Dog d = new Dog();
        // d.eat();

//       d.num = 20;
        System.out.println(d.NUM);
    }
}

/* final */ class Animall {
    public final void eat() {
        System.out.println("吃東西");
    }
}

class Dog extends Animall {
    /* public void eat() {} */

    final int NUM;

    public Dog() {
        NUM = 10;
    }
}

3.多型

3.1基本使用

package com.daigua13;

/*
* 多型的前提:
*   子父類的繼承關係
*   方法的重寫
*   父類引用指向子類物件
* 
* 動態繫結:執行期間呼叫的方法,是根據其具體的型別
* 
*/
public class PolymorphismDemo {
    public static void main(String[] args) {
        /*
         * Cat c = new Cat(); c.eat();
         */

        // 父類引用 Animal a
        // 指向 =
        // 子類物件 new Cat()

        Animal3 a = new Cat3();
        a.eat();

    }
}

class Animal3 {
    public void eat() {
        System.out.println("吃東西");
    }
}

class Cat3 extends Animal3 {
    public void eat() {
        System.out.println("貓吃魚");
    }
}

3.2多型成員特點(執行順序)

package com.daigua13;

/*
*   
*   多型的成員特點:
*       成員變數  編譯時看的是左邊,執行時看的左邊
*       成員方法  編譯時看的是左邊,執行時看右邊
*       靜態方法  編譯時看的是左邊,執行時看的也是左邊
* 
* 
* 編譯時看的都是左邊,執行時成員方法看的是右邊,其他(成員變數和靜態的方法)看的都是左邊
* 
*/
public class PolymorphicDemo2 {
    public static void main(String[] args) {
        Dad d = new Kid();
        // System.out.println(d.num);

        d.method();
        d.function();// 使用變數去呼叫靜態方法,其實相當於用變數型別的類名去呼叫
    }
}

class Dad {
    int num = 20;

    public void method() {
        System.out.println("我是父類方法");
    }

    public static void function() {
        System.out.println("我是父類靜態方法");
    }
}

class Kid extends Dad {
    int num = 10;

    public void method() {
        System.out.println("我是子類方法");
    }

    public static void function() {
        System.out.println("我是子類靜態方法");
    }
}

3.3多型中向上轉型與向下轉型

package com.daigua13;

/*
*   
*   多型中的向上轉型和向下轉型:
* 
*  引用型別之間的轉換
*   向上轉型
*       由小到大(子型別轉換成父型別)
*   向下轉型
*       由大到小
*  基本資料型別的轉換
*   自動型別轉換
*       由小到大
*       byte short char --- int --- long --- float --- double
*   強制型別轉換
*       由大到小
*       
*   
* 
*/
public class DuoTailDemo3 {
    public static void main(String[] args) {
        Animal2 a = new Dog1();// 向上轉型
        a.eat();

        Dog1 d = (Dog1) a;// 向下轉型
        d.swim();

    }
}

class Animal2 {
    public void eat() {
        System.out.println("吃東西");
    }
}

class Dog1 extends Animal2 {
    @Override
    public void eat() {
        System.out.println("啃骨頭");
    }

    public void swim() {
        System.out.println("狗刨");
    }
}

3.4 多型的優缺點

  package com.itheima_01;
/*
 *  
 *  多型的優缺點
 *      優點:可以提高可維護性(多型前提所保證的),提高程式碼的可擴充套件性
        缺點:無法直接訪問子類特有的成員
 */
public class PoymorphicDemo4 {
    public static void main(String[] args) {
        MiFactory factory = new MiFactory();
        factory.createPhone(new MiNote());
        
        factory.createPhone(new RedMi());
    }

    
}

class MiFactory {
    /*public void createPhone(MiNote mi) {
        mi.call();
    }
    
    public void createPhone(RedMi mi) {
        mi.call();
    }*/
    
    // 這裡是對多型的體現
    public void createPhone(Phone p) {
        p.call();
    }
    
}

interface Phone {
    public void call();
}

//小米Note
class MiNote implements Phone{
    public void call() {
        System.out.println("小米Note打電話");
    }
}

//紅米
class RedMi implements Phone {
    public void call() {
        System.out.println("紅米打電話");
    }
}