iT邦幫忙

2022 iThome 鐵人賽

DAY 12
0
Software Development

大學耍廢的我要學Java翻身系列 第 12

Day12: Java物件導向: 介面

  • 分享至 

  • xImage
  •  

抽象複習

  1. 類別中有抽象方法(只有定義方法沒有實作)
  2. 可以混合抽象和非抽象的方法
  3. 子類別要去實作所有抽象方法
  4. 可以作為一種資料型態去做多型
// Main.java
public class Main {
    public static void main(String[] args){
        Animal dog = new Dog();
        Cat cat1 = new Cat();
        Animal cat2 = new Cat();
        // Animal animal = new Animal();   //'Animal is abstract; cannot be instantiated

        // Polymorphism => 生態多樣性的概念
        // 同一個Animal物件可以有Dog,Cat...各種可能性
        dog1.makeSound();
        cat1.makeSound();
        cat2.makeSound();
    }
}
// Animal.java
public abstract class Animal {
    protected String name;
    protected int age;
    // method overloading
    public Animal(){
        this.name = "A animal";
        this.age = 0;
    }
    public Animal(String name, int age){
        this.name = name;
        this.age = age;
    }
    public void eat(){
        System.out.println("Eatting...");
    }
    public void sleep(){
        System.out.println("Sleeping...");
    }
     public abstract void makeSound();
}
// Cat.java
public class Cat extends Animal{
    public Cat(){
        super("Cat"); // super: 讓Cat(子類別)呼叫Animal(父類別)的建構子
    }
    @Override
    public void makeSound(){
        System.out.println("Meow...");
    }
}
// Dog.java
public class Dog extends Animal{
    public Dog(){
        super("Dog");
    }
    @Override
    public void makeSound(){
        System.out.println("Bark...");
    }
}

介面(Interface)

介面在Java中是一個"完全抽象類別",在介面的方法全部都是抽象方法

  1. 因為默認都是抽象方法,所以不用加abstract
  2. 和抽象類別一樣,不能創建物件
  3. 實作時要去覆寫(實作)所有方法(因為都是抽象方法)
  4. 預設屬性為public static final => 變數都是常數
  5. 一個類別可以實作多個介面(解決不能多重繼承的問題)
  6. 不含建構子
  7. 可以作為一種資料型態去做多型
// Main.java
public class Main {
    public static void main(String[] args){
        Dog dog = new Dog();
        Cat cat1 = new Cat();

        // Polymorphism => 生態多樣性的概念
        // 同一個Animal物件可以有Dog,Cat...各種可能性
        System.out.println(dog.isMyFriend());
        System.out.println(cat1.isMyFriend());
    }
}
// Animal.java
public abstract class Animal {
    protected String name;
    protected int age;
    // method overloading
    public Animal(){
        this.name = "A animal";
        this.age = 0;
    }
    public Animal(String name, int age){
        this.name = name;
        this.age = age;
    }
    public void eat(){
        System.out.println("Eatting...");
    }
    public void sleep(){
        System.out.println("Sleeping...");
    }
    public abstract void makeSound();

}

// Cat.java
public class Cat extends Animal implements CanBeFriend {
    public Cat(){
        super("Cat", 3); // super: 讓Cat(子類別)呼叫Animal(父類別)的建構子
    }
    @Override
    public void makeSound(){
        System.out.println("Meow...");
    }
    @Override
    public String isMyFriend(){
        return "You are not my friend!!";
    }
}
// Dog.java
public class Dog extends Animal implements CanBeFriend {
    public Dog(){
        super("Dog", 5);
    }
    @Override
    public void makeSound(){
        System.out.println("Bark...");
    }
    @Override
    public String isMyFriend(){
        return "You are my good friend~";
    }
}

// CanBeFriend.java

public interface CanBeFriend {
    // Interface default properties
    // public static final
    String isMyFriend();
}

抽象類別 vs 介面

兩者性質很相近,有以下幾點的不同

  1. 成員不同

抽象類別可以有抽象和非抽象的方法並存

介面全部都是抽象方法且變數都是常數(因為預設public static final)

  1. 實作和繼承的不同

一般子類別只能繼承一個父類別

一個類別卻能實作很多介面,也就是可以有很多介面的性質

  1. 階層關係不同

只有子類別會繼承父類別

不同階層的類別卻都可以實作一樣的介面

  1. 效率不同

因為介面屬於執行時的動態查詢,效率較差,所以不可以濫用


上一篇
Day11: Java物件導向: 繼承、多型、抽象
下一篇
Day13: Java的封裝和例外處理
系列文
大學耍廢的我要學Java翻身30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言