1. 程式人生 > 其它 >虛方法與非虛方法

虛方法與非虛方法

所謂的虛方法就是java類在繼承中,在上轉型中,java類物件實際呼叫的方法是子類重寫的方法;

也就是編譯器和jvm呼叫的不是同一個類的方法;

虛方法:可以重寫的方法

非虛方法:不可以重寫的方法,包括靜態方法,獨有方法,使用final修飾的方法,構造器

程式碼:

public class Employee {
    private String name;
    private String address;
    private int num;
    /*含參建構函式*/
    public Employee(String name, String address, int number) {
        System.out.println(
"Employee 建構函式"); this.name = name; this.num = number; this.address = address; } public void checkMail() { System.out.println("郵票支票給: "+ this.name +" " + this.address ); } public String toString() { return name + " " + address + " " + num; }
public String getName() { return name; } public String address() { return address; } public void setAddress(String newAddress) { this.address = newAddress; } public int getNumber() { return num; } }
public class Salary extends Employee {

    
private double salary;// 全年工資 public Salary(String name, String address, int number, double salary) { super(name, address, number); setSalary(salary); } /*方法的重寫,返回值,引數不可變*/ public void checkMail() { System.out.println("Salary 類的mailCheckBox方法"); System.out.println("郵票支票給: "+ getName() + ", 工資為: " + salary); } public double getSalary() { return salary; } public void setSalary(double newSalary) { if(newSalary >= 0.0) { salary = newSalary; } } public double computePay() { System.out.println("gongzi :" + getName()); return salary/52; } }

main:

public class Test {

    public static void main(String args[]) {
        Salary s = new Salary("員工 A", "北京", 3, 3600.00);
        Employee e = new Salary("員工 B", "上海", 2, 2400.00);
        System.out.println("使用 Salary 的引用呼叫 mailCheck -- ");
        s.checkMail();
        System.out.println("使用 Employee 的引用呼叫 mailCheck--");
        e.checkMail();
    }
}

輸出

Employee 建構函式
Employee 建構函式
使用 Salary 的引用呼叫 mailCheck
-- Salary 類的mailCheckBox方法 郵票支票給: 員工 A, 工資為: 3600.0
使用 Employee 的引用呼叫 mailCheck-- Salary 類的mailCheckBox方法 郵票支票給: 員工 B, 工資為: 2400.0

解析:

例項中,例項化了兩個 Salary 物件:一個使用 Salary 引用 s,另一個使用 Employee 引用 e。

當呼叫 s.mailCheck() 時,編譯器在編譯時會在 Salary 類中找到 mailCheck(),執行過程 JVM 就呼叫 Salary 類的 mailCheck()。

因為 e 是 Employee 的引用,所以呼叫 e 的 mailCheck() 方法時,編譯器會去 Employee 類查詢 mailCheck() 方法 。

在編譯的時候,編譯器使用 Employee 類中的 mailCheck() 方法驗證該語句, 但是在執行的時候,Java虛擬機器(JVM)呼叫的是 Salary 類中的 mailCheck() 方法。

以上整個過程被稱為虛擬方法呼叫,該方法被稱為虛擬方法。

Java中所有的方法都能以這種方式表現,因此,重寫的方法能在執行時呼叫,不管編譯的時候原始碼中引用變數是什麼資料型別。