物件導向 03 - Interface

December 17, 2020

static

編寫一個類時,只有透過 new 關鍵字才會產生出物件,此時系統才會分配記憶體空間給該物件,這樣才能供外部調用。但某些特定數據在記憶體空間只有一份。台灣是個國家名稱,每一個台灣人都共享此國家名稱,不必每一個人的實例都分配一個代表國家名稱的變量。

代碼塊

public class Person {
    String name;
    int age;
    static String des = "Hello";
    
    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    // 隨著類加載而執行
    static {
        System.out.println("Hello Static block");
    }
    // 隨著物件的建立而執行
    {
        System.out.println("Hello block");
    }
    public void eat(){
        System.out.print("eat...");
    }
    public void sleep(){
        System.out.print("sleep...");
    }

    // 隨著類加載而加載
    public static void info(){
        System.out.print("info...");
    }
}

創建抽像類的匿名子類對象

public class PersonTest{
    public static void main(String[] args){
        method(new Student()); // 匿名物件
        Worker worker = new Worker();
        method1(worker);// 非匿名的類非匿名的物件
        method1(new worker()); // 非匿名的類匿名的物件
        
        Person p = new Person(){ // 創建匿名子類的對象
            /**
             * 當成子類,只有子類才能覆寫
             * */
            @Override
            public void eat(){
            
            }
            @Override
            public void breath(){
            
            }
        };
    }
    public static void method1(Person p){
        p.eat();
        p.walk();
    }
    public static void method(Student s){
        
    }
}
class Worker extends Prson{
    ...
    ...
}

interface

interface AA {

}
interface BB {

}
interface CC extends AA, BB {

}

定義的結構

abstract 和 interface 差異

interface 應用

除錯

interface A {
    int x = 0;
}
class B {
    int x = 1;
}
class C extends B implements A {
    public void px(){
        System.out.println(x); // 不知道是哪一個
    }
    public static void main(String[] args){
        new C().pX();
    }
}

JAVA8 interface

public interface CompareA{
    public static void method1(){
        System.out.println("...");
    }
    public default void method2(){
        System.out.println("...");
    }
    default void method3(){
        System.out.println("...");
    }
}
public void myMethod() {
    method3();
    super.method3();
    // 調用 interdace 中默認方法
    CompareA.super.method3();
    CompareB.super.method3()
}

內部類

類別中的類別

public static void main(String [] args) {
    Person.Dog dog = new Person.Dog(); // 靜態 Dog 實例
    dog.method();
    Person p = new Person();
    Person.Cat cat = p.new Cat(); // 非靜態實例
    cat.method();
}
class Person {
    String name;
    // 成員內部類
    static class Dog {
        
    }
    class Cat{
        String name;
        Person.this.method(); // 調用外部類方法
        public void display(String name) {
            System.out.println(name); // 參數
            System.out.println(this.name); // 內部類
            System.out.println(Person.this.name);// 外部類
        }
    }
    public Person(){
        class CC {
        
        }
    }
    public void method() {
        class AA {
            
        }
    }
    {
        class BB {
        
        }
    }
}
public class InnerClass {
    public void method(){
        class AA{
            
        }
    }
    public Comparable getComparable(){
        // 局部內部類
        class MyComparable implement Comparable{
            @Override
            public int compareTo(Object o){
                return 0;
            }
        }
        return new MyComparable();
    }
}

內部類使用注意點