Java 中的虛擬函式

Mohammad Irfan 2023年10月12日
  1. Java 中的虛擬函式
  2. Java Bean 中的虛擬函式
  3. Java 中的非虛擬函式
  4. Java 介面中的虛擬函式
Java 中的虛擬函式

本教程介紹了什麼是 Java 中的虛擬函式/方法以及如何使用 Java 中的虛擬函式。

在基類中定義並且可以在派生類中覆蓋的函式稱為虛擬函式。C++ 和 Java 中預設使用了虛擬函式的概念;所有非私有和非最終方法都是虛方法。

在 C++ 中,我們使用 virtual 關鍵字來建立虛擬函式,但 Java 沒有這樣的關鍵字。除此之外,所有非私有和非最終方法都是虛擬的。

虛擬函式的概念在物件導向程式設計概念和多型性方面很有用。讓我們通過一些例子來理解。

Java 中的虛擬函式

在這個例子中,我們建立了一個類 Human,其中包含一個虛擬的 eat() 方法。因為它是一個虛方法,它可以在派生類/子類中被覆蓋,就像我們在下面的例子中所做的那樣。兩個方法具有相同的簽名,當我們呼叫函式時,只執行子類方法。請參閱下面的示例。

class Human {
  void eat(String choice) {
    System.out.println("I would like to eat - " + choice + " now");
  }
}

public class SimpleTesting extends Human {
  void eat(String choice) {
    System.out.println("I would like to eat - " + choice);
  }
  public static void main(String[] args) {
    SimpleTesting simpleTesting = new SimpleTesting();
    simpleTesting.eat("Pizza");
    simpleTesting.eat("Chicken");
  }
}

輸出:

I would like to eat - Pizza
I would like to eat - Chicken

Java Bean 中的虛擬函式

bean/POJO 類的 getter 函式也是虛擬的,可以被子類覆蓋。請參閱下面的示例。

public class SimpleTesting extends Student {
  public int getId() {
    System.out.println("Id : " + id);
    return id;
  }
  public String getName() {
    System.out.println("Name : " + name);
    return name;
  }
  public int getAge() {
    System.out.println("Age : " + age);
    return age;
  }

  public static void main(String[] args) {
    SimpleTesting student = new SimpleTesting();
    student.setId(101);
    student.setName("Rohan");
    student.setAge(50);
    student.getId();
    student.getName();
    student.getAge();
  }
}
class Student {
  int id;
  String name;
  int age;

  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
}

輸出:

Id : 101
Name : Rohan
Age : 50

Java 中的非虛擬函式

私有或最終的函式是非虛擬的,因此它們不能被子類覆蓋。在這個例子中,我們建立了兩個函式,一個是最終的,第二個是私有的。我們試圖將這些覆蓋到子類中,但是由於非虛擬函式,java 編譯器引發了錯誤。請參閱下面的示例和輸出。

class Human {
  // non-virtual method
  final void eat(String choice) {
    System.out.println("I would like to eat - " + choice);
  }
  // non-virtual method
  private void buy(String item) {
    System.out.println("Buy me a " + item);
  }
}
public class SimpleTesting extends Human {
  // non-virtual method
  void eat(String choice) {
    System.out.println("I would like to eat - " + choice);
  }
  // non-virtual method
  void buy(String item) {
    System.out.println("Buy me a " + item);
  }
  public static void main(String[] args) {
    SimpleTesting simpleTesting = new SimpleTesting();
    simpleTesting.eat("Pizza");
    simpleTesting.buy("Pizza");
    simpleTesting.eat("Chicken");
    simpleTesting.buy("Chicken");
  }
}

輸出:

java.lang.IncompatibleClassChangeError: class SimpleTesting overrides final method Human.eat(Ljava/lang/String;)
---Cannot override the final method from Human---

Java 介面中的虛擬函式

介面的函式/方法預設是虛擬的,因為它們預設是公共的,並且應該被子類覆蓋。在下面的例子中,我們在介面中建立了一個方法,在一個類中重寫了它,併成功呼叫了它。請參閱下面的示例。

interface Eatable {
  void eat(String choice);
}
public class SimpleTesting implements Eatable {
  public void eat(String choice) {
    System.out.println("I would like to eat - " + choice);
  }
  void buy(String item) {
    System.out.println("Buy me a " + item);
  }
  public static void main(String[] args) {
    SimpleTesting simpleTesting = new SimpleTesting();
    simpleTesting.eat("Pizza");
    simpleTesting.buy("Pizza");
    simpleTesting.eat("Chicken");
    simpleTesting.buy("Chicken");
  }
}

輸出:

I would like to eat - Pizza
Buy me a Pizza
I would like to eat - Chicken
Buy me a Chicken

相關文章 - Java Function