上一節我們說了靜態使用細節時提到了main函數是靜態的,其實,對于我們初學者,真是對main函數是什么樣認識還很模糊,那么這一節我們就解析一下main函數.
main函數的固定格式:**public static void main(String[] args)**
java語言中主函數有兩個特殊之處:
**1.格式是固定的.**
**2.被jvm所識別和調用.**
**
**
那么它們第一個單詞都有什么意義呢,我們下面就學習一下:
public:因為權限必須是最大的.
static:虛擬機對運行main函數是不需要對象的,直接用主函數所屬類名調用即可.
void:主函數沒有具體的返回值.虛擬機調用主函數.
main:函數名,不是關鍵字,只是一個jvm識別的固定名字.
String[] args:這是主函數的參數列表,是一個數組類型的參數,而且元素都是字條串類型.
那么我們關鍵點來了,我們知道,任何一個函數被調用,如果它有參數,那么就要傳遞相對應的實參.
那么對于主函數,傳遞的實參是什么?誰來調用主函數,虛擬機調用,只要有參數,我們就必須傳遞對應實參.
那么到底傳的實參是什么呢?
我們看下面的例子:
~~~
class MainTest
{
public static void main(String[] args) //其實虛擬機傳的參數是 new String[0]
{
System.out.println(args);
}
}
~~~
我們看一下運行結果:

我們運行并看到了 ?[Ljava.lang.String;@139a55,說明確實有個字符串數組的實體,那么這個字符串數組有長度是多少呢?我們再來測試:
~~~
class MainTest
{
public static void main(String[] args) //其實虛擬機傳的參數是 new String[0]
{
System.out.println(args);
System.out.println(args.length);
}
}
~~~
結果:

我們看實體的長度,結果為0.
所以主函數實際傳遞的參數是創建了一個String類型的數組對象實體,即 new String[0]
這就是java語言中main函數為我們傳遞參數提供了可能,我們可以把我們想要傳遞的參數傳遞進去.為我們留下了余地.
那么我們又會問,為什么參數是字符串類型呢?
我們知道,字符串類型可以與其他數據類型進行轉換,所以,無論我們傳什么,傳進去的都是字符串.那為什么是字符串呢,這是因為字符串具有通用性,我們只需要根據實際進行字符串轉換.
那么什么時候傳值呢?當然是虛擬機調用主函數時傳值.我們接著看下面例子:
~~~
class MainTest
{
public static void main(String[] args) //其實虛擬機傳的參數是 new String[0]
{
System.out.println(args);
System.out.println(args.length);
System.out.println(args[0]);
}
}
~~~
這個例子中是打印出實參數組中的第一個元素.
我們可以這樣傳值:java MainTest haha xixi hehe

我們看到了打印出字符中數組參數的長度為3,第一個元素內容是haha,既然我們能夠把我們想要傳入的參數傳入main函數,那么我們把所有的參數打印出來:
~~~
class MainTest
{
public static void main(String[] args) //其實虛擬機傳的參數是 new String[0]
{
System.out.println(args);
System.out.println(args.length);
for(int x=0;x<args.length;x++)
System.out.println(args[x]);
}
}
~~~
結果:

這樣就很清晰了,我們可以在jvm調用main函數的時候傳入我們想要運行的參數并進行處理.
我們再來看一個小細節,那就形式參數args,其實我們args就是main函數的形式參數變量名,那么它可不可以用其它的名字呢?我們看一例子:
~~~
class MainTest
{
public static void main(String[] x) //其實虛擬機傳的參數是 new String[0]
{
System.out.println("運行正常!");
}
}
~~~
結果:

我們可以看到,對于這個參數名是可以換成其他名字,這也是主函數中唯一一個可以變化的地方.并且,其實在早期時,這個名字其實是arguments,意思是參數,由于是字符串的數組,所以是復數.
同時我們再來看一個小細節:
~~~
class MainTest
{
public static void main(String[] x) //其實虛擬機傳的參數是 new String[0]
{
System.out.println("運行正常!");
}
public static void main(int[] x)
{}
}
~~~
結果:

我們會發現程序正常運行,這更加說了main就是一個函數名,并且兩個main方法之間是重載關系,而jvm只會找格式固定的main函數.
所以當我們這樣做時:
~~~
class MainTest
{
public static void main(String[] args) //其實虛擬機傳的參數是 new String[0]
{
System.out.println("運行正常!");
}
public static void main(String[] x)
{}
}
~~~
結果:

這時編譯直接拋出異常,其實這兩個函數,只是參數名不相同,實際是同一函數.
我們在以后的編程過程中多注意這兩個小細節。
- 前言
- 1.1 基本常識
- 1.2 Java語言概述
- 1.3 Java語言的環境搭建
- 1.4 Java程序開發之初體驗--Hello World
- 2.1 關鍵字
- 2.2 標識符
- 2.3 注釋
- 2.4 常量
- 2.5 進制掃盲
- 2.6 變量和數據類型(1)
- 2.7 變量和數據類型(2)
- 2.8 運算符
- 3.1 if語句
- 3.2 switch語句
- 3.3 while和do-while語句
- 3.4 for語句
- 3.5 for循環的嵌套
- 3.6 break語句與continue語句
- 4.1 函數的定義
- 4.2 定義函數的兩個明確
- 4.3 函數的內存加載過程
- 4.4 函數的重載
- 5.1 數組的定義
- 5.2 數組的內存分配及特點
- 5.3 數組操作中常見問題
- 5.4 數組常用操作(1)
- 5.5 數組常用操作(2)
- 5.6 二維數組
- 6.1 面向對象的概述
- 6.2 類與對象的關系
- 6.3 對象的內存體現
- 6.4 成員變量與局部變量
- 6.5 類類型參數與匿名對象
- 6.6 基本數據類型參數與引用數據類型參數的傳遞過程
- 6.7 封裝
- 7.1 構造函數概述與默認構造函數
- 7.2 構造函數與一般函數的區別
- 7.3 構造函數的重載
- 7.4 構造函數的內存加載
- 7.5 構造函數需要注意的幾個細節
- 7.6 this關鍵字的原理
- 7.7 this關鍵字的細節與應用
- 8.1 static關鍵字之特點
- 8.2 成員變量與靜態變量的區別
- 8.3 static關鍵字使用的注意細節
- 8.4 main函數的解析與細節
- 8.5 static關鍵字的使用場景
- 8.6 靜態的內存加載
- 8.7 靜態代碼塊
- 8.8 構造代碼塊
- 9.1 繼承
- 9.2 單繼承與多重繼承
- 9.3 子父類中成員變量特征體現