標籤:輸出 記憶體 子類 windows 註冊 虛擬 無限 賦值 列印
函 數:為了提高代碼的複用性,可以將其定義成一個單獨的功能,該功能的體現就是java中的函數。函數就是體現之一。
Java的函數寫法為:
修飾符 傳回型別 函數名 (參數列表...){ 方法,函數體 return 傳回值;} 當函數沒有具體的傳回值時,返回的傳回值類型用
void關鍵字表示。如果函數的傳回值類型是void時,return語句可以省略不寫的,系統會幫你自動加上。
return的作用:結束函數。結束功能。注意:
函數中只能調用函數,不能定義函數。
重載的定義是:在一個類中,如果出現了兩個或者兩個以上的同名函數,只要它們的參數的個數,或者參數的類型不同,即可稱之為該函數重載了。
如何區分重載:當函數同名時,只看參數列表。和傳回值類型沒關係。
java中的main函數:
在java中,main()方法是java應用程式的入口方法。java虛擬機器通過main方法找到需要啟動的運行程式,並且檢查main函數所在類是否被java虛擬機器裝載。如果沒有裝載,那麼就裝載該類,並且裝載所有相關的其他類。因此程式在啟動並執行時候,第一個執行的方法就 main()方法。通常情況下, 如果要運行一個類的方法,必須首先執行個體化出來這個類的一個對象,然後通過"對象名.方法名()"的方式來運行方法,但是因為main是程式的入口,這時候類還沒有執行個體化對象,因此將main方法聲明為static的,這樣這個方法就可以直接通過“類名.方法名()”的方式來調用。
java允許類不加public關鍵字約束,當然類的定義只能限制為public或者無限制關鍵字(預設的)。
由於JVM在運行這個Java應用程式的時候,首先會調用main方法,調用時不執行個體化這個類的對象,而是通過類名直接調用因此需要是限制為public static。
對於java中的main方法,jvm有限制,不能有傳回值,因此傳回值類型為void。main方法中還有一個輸入參數,類型為String[],這個也是java的規範,main()方法中必須有一個入參,類細必須String[],至於字串數組的名字,這個是可以自己設定的,根據習慣,這個字串數組的名字一般和sun java規範範例中mian參數名保持一致,取名為args。 main()方法中字串參數數組作用是接收命令列輸入參數的,命令列的參數之間用空格隔開。 java類的編譯調用過程:
D:\Study\basetest\src>javac TestMain.java D:\Study\basetest\src>java TestMain 1 2 3 列印main方法中的輸入參數! 1 2 3
函數參數的值傳遞和引用傳遞:值傳遞:改變變數的記憶體中的值引用傳遞:把變數地址指向另外的值函數參數傳遞其實是一個賦值的過程,基本類型傳遞的是數值,參考型別傳遞的引用對象的記憶體位址。另外一點要特別注意,函數的參數其實是函數內部的局部變數。不要跟外部變數混淆
建構函式(類執行個體化的初始化函數):1.構造器必須與類同名(如果一個源檔案中有多個類,那麼構造器必須與公用類同名)2.每個類可以有一個以上的構造器3.構造器可以有0個、1個或1個以上的參數4.構造器沒有傳回值5.構造器總是伴隨著new操作一起調用 繼承與建構函式:使用super調用父類構造器的語句必須是子類構造器的第一條語句如果子類構造器沒有顯式地調用父類的構造器,則將自動調用父類的預設(沒有參數)的構造器。如果父類沒有不帶參數的構造器,並且在子類的構造器中又沒有顯式地調用父類的構造器,則java編譯器將報告錯誤樣本:A.java
public class A{ public A(){ System.out.println("調用了A的無參建構函式"); } public A(String mess){ System.out.println("調用了A的有參的建構函式\n"+ "參數內容為:"+mess); }}
B.java
public class B extends A{ public B(){ System.out.println("調用了B的無參建構函式"); } public B(String mess){ super(mess); System.out.println("調用了B的有參建構函式\n"+ "參數內容為:"+mess); }}
Test.java
public class Test{ public static void main(String [] args){ B b_01=new B(); B b_02=new B("你好"); }}
輸出結果:
java回呼函數:
C語言中回呼函數解釋:回呼函數(Callback Function)是怎樣一種函數呢?函數是用來被調用的,我們調用函數的方法有兩種:l 直接調用:在函數A的函數體裡通過書寫函數B的函數名來調用之,使記憶體中對應函數B的代碼得以執行。這裡,A稱為“主叫函數”(Caller),B稱為“被叫函數”(Callee)。l 間接調用:在函數A的函數體裡並不出現函數B的函數名,而是使用指向函數B的函數指標p來使記憶體中屬於函數B的代碼片斷得以執行——聽起來很酷,是吧。比起直接調用來,間接調用的確麻煩,那為什麼還要使用間接調用呢?原因很簡單——直接調用把函數名都寫進函數體了,經過編譯器那麼一編譯,板上DingTalk,A註定調用的是B了,這樣的程式只能按照程式員事先設計好的流程執行下去,太呆板了。此時,間接調用的巨大靈活性就顯現出來了。想一想,如果p是函數A的一個參數(參數是變數,是變數就可以變嗎!),那麼程式的終端使用者完全可以通過操作來改變p的指向——這樣,A在通過p調用函數的時候就有機會調用到不同的函數,這樣程式的實用性和擴充性就強多了。
在WINDOWS中,程式員想讓系統DLL調用自己編寫的一個方法,於是利用DLL當中回呼函數(CALLBACK)的介面來編寫程式,使它調用,這個就稱為回調。在調用介面時,需要嚴格的按照定義的參數和方法調用,並且需要處理函數的非同步,否則會導致程式的崩潰。這樣的解釋似乎還是比較難懂,這裡舉個簡單的例子,程式員A寫了一段程式(程式a),其中預留有回呼函數介面,並封裝好了該程式。程式員B要讓a調用自己的程式b中的一個方法,於是,他通過a中的介面回調自己b中的方法。目的達到。在C/C++中,要用回呼函數,被掉函數需要告訴調用者自己的指標地址,但在JAVA中沒有指標,怎麼辦?我們可以通過介面(interface)來實現定義回呼函數正常情況下開發人員使用已經定義好的API,這個過程叫Call。但是有時這樣不能滿足需求,就需要程式員註冊自己的程式,然後讓事先定義好多API在合適的時候調用註冊的方法,這叫CallBack。
提示:定一個介面,在介面中聲明我們想調用的方法。
在另一個方法中註冊剛定義的回調介面
例:
程式員A寫了一段程式(程式a),其中預留有回呼函數介面,並封裝好了該程式。程式員B要讓a調用自己的程式b中的一個方法,於是,他通過a中的介面回調自己b中的方法。目的達到。在C/C++中,要用回呼函數,被掉函數需要告訴調用者自己的指標地址,但在JAVA中沒有指標,怎麼辦?我們可以通過介面(interface)來實現定義回呼函數。
假設我是程式員A,以下是我的程式a:
public class Caller { public MyCallInterface mc; public void setCallfuc(MyCallInterface mc) { this.mc= mc; } public void call(){ this.mc.method(); } }
我還需要定義一個介面,以便程式員B根據我的定義編寫程式實現介面。
public interface MyCallInterface { public void method(); }
於是,程式員B只需要實現這個介面就能達到回調的目的了:
public class B implements MyCallInterface { public void method() { System.out.println("回調"); } public static void main(String args[]) { Caller call = new Caller(); call.setCallfuc(new B()); call.call(); } }
總結:b叫a調用了b實現MyCallInterface介面的method方法
java 函數(方法)