類實例調用靜態方法(Java)

  • 2020 年 4 月 11 日
  • 筆記

前言

第一次看到在Java中可以通過類實例調用靜態方法,當然不推薦這麼做,避免出現意想不到的問題,接下來會講到,但是在C#中通過類實例調用靜態方法在編譯時就不會通過,這裡做下記錄。

類實例調用靜態方法

首先我們來看一個簡單的例子說明為何不能通過類實例調用靜態方法,我們知道未實例化的對象去調用對應方法或者字段時會拋出空指針異常,比如如下:

public static void main(String[] args) {      Object o = null;      System.out.println(o.toString());  }

但是若將其應用到靜態方法上則會出現意想不到的問題,比如如下例子:

public class Player {      public static final String type = "Human";        private int age;        public static String getType() {          return type;      }        public int getAge() {          return age;      }  }

public static void main(String[] args) {      Player player = null;      System.out.println(player.getType());      System.out.println(player.getAge());  }

上述對象並未實例化,但是調用其變量的靜態方法卻不會拋出異常並能打印出結果,當然答案也很簡單,因為靜態方法是屬於類而非類實例,所以上述調用 player.getType() 本質上肯定是調用 Player.getType() 。 

總結

在Java中通過類實例可以調用靜態方法可能是在最初設計時所產生的缺陷,當然,這只是我個人的揣測,沒有再過多深究,看到居然編譯不出錯而且可以正常運行,認為這一點和C#有很大的區別,故此記錄總結下。