咱們都知道,除了靜態方法以外的全部方法都只能經過對象調用,沒用對象調用的確定是加了static關鍵字的靜態方法,static方法能夠經過類名調用。直接調用的話有兩種狀況,一是這個方法是包含main方法的類中的static方法,二是其餘類的static方法,但在文件開頭經過靜態導入static import導入了此方法所在的類。
用static修飾的方法或屬性在程序執行時會先被加載到內存
中,因此在main方法中能夠訪問到,而沒有用static修飾的方法或屬性只有在new 類名()的時候纔會在內存中分配地址,在內存中有了地址就能夠訪問了。java
下邊是初學java的朋友常犯的錯誤,也是疑惑最多的地方,現總結以下:算法
一、在本類中調用本身的方法,方法必須爲靜態的,不然報錯;編程
經過遞歸方法,實現N!的算法。數組
public class TestRecursion { public static void main(String[] args) { System.out.println(recursion(4)); //編輯器自動提示:Cannot make a static reference to the non-static method recursion(int) from the type TestRecursion } public int recursion(int n) { if(n == 1) { return 1; }else { return n * recursion(n-1); } } }
必須將recursion()方法定義爲 static方法,才能在main()方法中直接調用。
public class TestRecursion { public static void main(String[] args) { System.out.println(recursion(4)); } public static int recursion(int n) { if(n == 1) { return 1; }else { return n * recursion(n-1); } } }
二、那麼,如何在main()方法中調用非靜態方法呢?
首先,實例化本類的對象,而後經過對象調用方法。編程語言
public class TestRecursion { public static void main(String[] args) { //首先是實例化本類的對象 TestRecursion tr = new TestRecursion(); //經過實例化的對象調用recursion()方法 System.out.println(tr.recursion(4)); } public int recursion(int n) { if(n == 1) { return 1; }else { return n * recursion(n-1); } } }
經過上面兩種方法,能夠解決在編程過程當中遇到的main()調用本類中的方法。編輯器
Main方法是咱們學習Java編程語言時知道的第一個方法,你是否曾經想過爲何main方法是public
、static
、void
的。固然,不少人首先學的是C和C++,可是在Java中main方法與前者有些細微的不一樣,它不會返回任何值,爲何main方式是public、static、void,這篇文章嘗試去找到一些答案。學習
Main方法是Java程序的入口,記住,咱們這裏不會討論Servlet、MIDlet和其餘任何容器管理的java程序,在java核心編程中,JVM會查找類中的public static void main(String[] args)
,若是找不到該方法就拋出錯誤NoSuchMethodError:main
程序終止。線程
Main方法必須嚴格遵循它的語法規則,方法簽名必須是public static void
,參數是字符串數組類型,若是是Java1.5及之後的版本還可使用可變參數:設計
public static void main(String... args)
正由於main方法是靜態的,JVM調用這個方法就不須要建立任何包含這個main方法的實例。
由於C和C++一樣有相似的main方法做爲程序執行的入口。
若是main方法不聲明爲靜態的,JVM就必須建立main類的實例,由於構造器能夠被重載,JVM就無法肯定調用哪一個main方法。
靜態方法和靜態數據加載到內存就能夠直接調用而不須要像實例方法同樣建立實例後才能調用,若是main方法是靜態的,那麼它就會被加載到JVM上下文中成爲可執行的方法。code
Java指定了一些可訪問的修飾符如:private
、protected
、public
,任何方法或變量均可以聲明爲public,Java能夠從該類以外的地方訪問。由於main方法是公共的,JVM就能夠輕鬆的訪問執行它。
由於main返回任何值對程序都沒任何意義,因此設計成void,意味着main不會有任何值返回
public static void main (String[] args)
放法public static void main(String... args)
public strictfp final synchronized static void main(String[] args)