匿名類別

Prerequisites:

抽象類別的匿名子類別

建立抽象類別Human,與抽象方法speak()

Human.java

1
2
3
abstract class Human {
  abstract void speak();
}

建立一個簡單的類別TestHuman,類別中有一個test()方法,參數是Human類別,用來測試多型,只要是Human的子類別,都可以作為參數傳入。

TestHuman.java

1
2
3
4
5
public class TestHuman {
  void test(Human human) {
    human.speak();
  }
}

建立Main主程式

用new的方式,建立TestHuman物件,並使用test()方法

1
2
3
4
5
6
public class Test {
  public static void main(String[] args) {
    TestHuman testHuman = new TestHuman();
    testHuman.test();
  }
}

匿名的方式建立子類別

所謂的匿名,就是沒有變數名,比如上一個程式碼,testHuman就是變數名,指向TestHuman類別的物件。

建立匿名子類別步驟如下:
1.new 抽象類別() {}
要用 new 抽象類別(),最重重要的是,後面要加上花括號{}

2.在test()方法中,加上步驟1的參數new 抽象類別() {}

1
  testHuman.test(new 抽象類別 () {});

3.在花括號中,覆寫(Override)抽象類別Human的抽象方法speak()

1
2
3
4
5
6
  testHuman.test(new Human() {
    @Override
    void speak() {

    }
  });

4.加上要覆寫的內容

1
2
3
4
5
6
7
  testHuman.test(new Human() {
    @Override
    void speak() {
      // 覆寫的內容
      System.out.println("說中文");
    }
  });
說中文

匿名花括號{}

在上一段程式碼利用花括號{}建立沒有名字的繼承抽象類別的子類別,可以視為花括號{}中的內容是子類別的body。

{
  子類別的body
}

之前的在抽象類別的文章中,以向上轉型物件(Upcasting object)的方式建立子類別,並作為參數傳入方法中,此處以匿名的方式建立子類別物件傳入方法中。

類別的匿名子類別

除了抽象類別建立的匿名類別,一般類別也可以透過匿名的方式建立子類別

建立一個Car類別,裡面有一個print()方法。

1
2
3
4
5
public class Car {
  public void print() {
    System.out.println("car");
  }
}

建立一個測試參數為Car的類別,TestCar.java

1
2
3
4
5
public class TestCar {
  public void test(Car car) {
    car.print();
  }
}

建立「匿名」Car的子類別,注意!加上花括號{},表達的不是Car這個類別,而是繼承Car的子類別,即便{}花括號的內容是空的,這裡的意思是子類別,不是Car這個類別,Car變成父類別,這個沒有名字的子類別擁有父類別繼承來的print()方法。

1
2
3
4
5
public static void main(String[] args) {
  TestCar testCar = new TestCar();
  // 建立Car的子類別
  testCar.test(new Car() {});
}
car

覆寫(重寫)繼承Car的子類別的print()方法

1
2
3
4
5
6
7
8
9
public static void main(String[] args) {
  TestCar testCar = new TestCar();
  testCar.test(new Car() {
    @Override
    public void print() {
      System.out.println("我是Toyota");
    }
  });
}
我是Toyota

實作(implements)介面(Interface)的匿名類別

建立一個Callback介面

1
2
3
public interface Callback {
  void sendMessage();
}

建立測試類別Tester,利用testCallback()方法來測試,參數為Callback介面

1
2
3
4
5
public class Tester {
  public void testCallback(Callback callback) {
    callback.sendMessage();
  }
}

主程式

1
2
3
4
5
6
7
8
9
10
public static void main(String[] args) {
  // 建立測試類別Tester
  Tester tester = new Tester();
  tester.testCallback(new Callback() {
    @Override
    public void sendMessage() {
      System.out.println("這是實作Callback介面的類別送的訊息");
    }
  });
}
這是實作Callback介面的類別送的訊息

其中的new Callback(){}是建立一個沒有名字的類別,去實作(implements)Callback的介面,實作介面時,必須覆寫介面的抽象方法sendMessage()。

1
2
3
4
5
6
tester.testCallback(new Callback() {
      @Override
      public void sendMessage() {
        System.out.println("這是實作Callback介面的類別送的訊息");
      }
    });
這是實作Callback介面的類別送的訊息

results matching ""

    No results matching ""