public void 修飾是非靜態方法,該類方法屬於對象,在對象初始化(new Object())后才能被調用;
public static void 修飾是靜態方法,屬於類,使用類名.方法名直接調用。
正如答主 @小透明 所說,非靜態方法之間可以互相調用,非靜態方法也可以調用靜態方法;但是靜態方法不可以直接調用(未初始化的)非靜態方法。由於 public static void main 作靜態方法,所以遵循這個原則。
但是 Java 可以通過對象名調用靜態方法(對象名.靜態方法)。Java 中不會導致語法錯誤(syntax error),但是不推薦這樣使用,靜態方法與非靜態方法調用時應當絕對區分;而且其他 OOP 語言如 C#,Swift,Objective-C 都沒有這樣的語法。