為了賬號安全,請及時綁定郵箱和手機立即綁定

Java 類的方法總結(目前網上最完整10種方法總結梳理)

2016.05.30 10:18 20547瀏覽

圖片描述

定義一個完整的類方法,需要六個步驟,也就是六大部分。也因為這六個部分的不同而可以大概分為9種方法。
這是我一整天作圖整理出來的。可能有些漏缺錯誤,希望大家能幫忙糾正。讓我明白哪里錯了,這是對我這個初學者最大的幫助,謝謝。

一,一般方法
二,構造方法
三,無參無返回值的方法。
四,無參有返回值的方法。
五,有參無返回值的方法。
六,有參有返回值的方法。
七,靜態方法。
八,非靜態方法。
九,抽象方法。
另外在加上
方法的重載
方法的重寫。
方法的調用。
可能是目前關于java 方法最完整的總結了。當然還有例如有參的構造方法等一些組合,就沒必要一一列舉了。后面會有些許介紹,后期再繼續編輯優化。

第一步,訪問修飾符。參考前面寫的成員變量與局部變量。就不羅嗦了。
圖片描述

第二步,關鍵詞。
關鍵詞主要有static和abstract兩個關鍵詞。
有static修飾的方法叫做靜態方法。沒有的則叫非靜態方法。
其中我們最熟悉的main方法就有static 修飾。這個方法也是我最不熟悉搞不懂的方法。

static方法一般稱作靜態方法,由于靜態方法不依賴于任何對象就可以進行訪問,因此對于靜態方法來說,是沒有this的。因為它不依附于任何對象,既然都沒有對象,就談不上this了。
1.其實可以理解為此類所共有的方法。我理解的就是類方法。所以可以直接用類名調用。至于為何有這種麻煩的靜態方法以及靜態變量的存在,我認為有兩個原因。
第一,
靜態變量/方法只需要初始化一次,而不像其他的每調用一次就要初始化一次。可以減少內存空間的使用。
靜態的可以被直接訪問而不實例化自身再訪問,大型程序考慮內存占用問題 超小程序直接靜態化,更加方便些。

第二,不知道大家注意到main方法以及后面類與對象沒有。
在后面一大堆父子類。都是沒有main方法的。更不會有一大堆的靜態方法,靜態方法常駐內存,會大量消耗內存空間。
所以基本上只有一個測試類有main方法以及static修飾的。這樣的方法可以直接測試。如果你沒有必要去訪問對象的外部,那么就使你的方法成為靜態方法。她會被更快地調用。
這些算是程序的優化吧。
實在沒有找到比慕.課.網更好更方便的圖片了。就用這個了。
圖片描述
2.?靜態方法中可以直接調用同類中的靜態成員,但不能直接調用非靜態成員。
至于原因我感覺還是因為內存原理。非靜態方法/變量只有實例化之后才被放進堆內存,此前在棧內存,而靜態方法與變量則在棧內存。不在一個內存區,所以無法直接調用。也不知道對不對。希望不會誤導大家。

圖片描述
圖片描述

3.?靜態方法中不能直接調用非靜態方法,需要通過對象來訪問非靜態方法。原理如上,實例如下:

圖片描述

4.
并且由于這個特性,在靜態方法中不能訪問類的非靜態成員變量和非靜態成員方法,因為非靜態成員方法/變量都是必須依賴具體的對象才能夠被調用。

另一個關鍵字。Abstract。被他修飾的方法叫做抽象方法。
抽象方法:在類中沒有方法體的方法,就是抽象方法。

抽象方法必須被實現!也就是被繼承。所以他所在的類必然是父類。一定有一個子類。

如果一個子類沒有實現父類中的抽象方法,則子類也成為了一個抽象類!

抽象方法必須被重寫。從沒有方法體變為有具體的方法體。

抽象類不能被實例化。也就是只能繼承,不能new。這是很少見的。因為new基本上暢通無阻。到了抽象方法這就停了。

抽象方法只需聲明,而不需實現某些功能。就好像大蒙古國的海軍一樣。只需要有名頭,不需要有艦隊。

第三步,返回值有否?
如果有返回值就是有返回值方法。
有返回值,則寫具體返回類型,比如string int 等返回的類型,這就是java強類型的一個表現。

而且方法體里面要有return 符合返回類型的變量名。內外一致。而且只能返回一個數據。
如果是多個數據的話,還是多種類型的數據的話,第一拆分這個方法成為更加簡單的精簡方法。第二就是用數組來接受這些數據。

為何有反回類型的方法呢,因為他返回的數據將要被被其他方法采用,甚至多次采用。加工處理。所以就需要這個數據,他不是最終的輸出結果。所以要有返回類型,而且必須用變量來進行接受,然后傳遞給其他方法進行處理。

沒有就是無返回值方法。用void修飾。
因為這是最終的處理結果。所以無需再接受處理,直接用println輸出就行。這樣的結果不能再被println再次輸出,不然就會報錯。

返回類型與無返回值類型的方法的使用

public String display(){
String aa="影片名字:"+name+"\n類型:"+type+"\n導演:"+daoyan+"\n主演:"+zhuyan;
return aa;}
/*反回string類型aa。方法名前面必須添加想要返回的類型。這種方法有些限制。比如一次只能返回一種類型。不可能在string 后面加一個int,或者再加一個其他類型。/
下面的一句就是創建的對象中調用的方法。
System.out.println(f.display());
}
public void display1(){
System.out.println("影片名字:"+name+"\n類型:"+type+"\n導演:"+daoyan);
}
//方法名前面的void就意味著沒有返回值,也就不用設置返回的類型。下面一句是就是創建的對象中調用的方法:
f.display1();

前面帶有返回類型的方法只有返回數據,而沒有輸出數據,所以調用的時候還必須添加輸出的方法。后面沒有返回類型的方法已經封裝了輸出的方法,所以創建對象的時候直接調用方法就行。而不能在加上System.out.println(f.display1());輸出方法再套一個輸出方法。

第四步。方法的名稱。

為了見名知意,也就是可以自定義。盡量有意義,第一樣就明白是什么意思,代表了什么,而且盡量用英文,如果是詞組的話,第二個單詞首字母大寫。

既然可以自定義,就有了一個特殊的方法名。與類名相同的方法——構造方法。

構造方法的作用就在于一下子可以一下子調用多個屬性,還省了一一賦值的麻煩,避免了缺漏。對于大型方法非常實用。同樣因為一次性調用多個屬性,必然參數很多。但是連void也沒有。

當然系統還有一個默認的隱藏的無參構造方法。也就是說每一個類中必然有一個無參構造方法。只不過平常隱藏起來了。一旦出現有參的構造方法,就必須將無參的構造方法也寫出來。

構造方法雖然可以和其他方法組合,但是不能被static、final、synchronized、abstract和native修飾。我也不知道這個的意義所在。

當然官方定義說構造方法的主要作用是數據的初始化。我的理解是,既然要被調用,公有的屬性肯定不可能事先賦值,要到子類實例化才能賦值,而只能一一調用,一一賦值,這樣很容易缺漏。而構造方法能在直接new 類名(具體參數)。方便快捷。

圖片描述

通過類創建一個對象。如果類比較龐大,屬性比較多,方法比較多。記憶就會比較困難,很容易落下什么。而且一個個調用屬性和方法很麻煩,能不能一下子全部調用過來。省的拉下了。這就是構造方法帶來的好處。

既然是調用的整個類的屬性與方法,那么方法名就與類名保持一致。
而且因為屬性多種多樣。有int類型,有string類型。這樣你就無法確定返回值是哪個類型,干脆就不定義返回類型。

根據參數的有無可以分為有參方法與無參方法,同樣可以喝返回值方法自由組合,構成有無參數有無返回值類型的方法。當然還有其他的組合。

而且因為需要的參數不同,類型不同,所以構造方法的參數類型就會不同,以適應不同的需要。這樣一來諸多同名的構造方法就構成了方法的重載。刻意這樣理解,重復加載,只不過加載的不一樣而已。這之間最大的區別就是參數列表。

也就是下一步。

第五步,參數列表。

為何要有參數。因為現實是多姿多彩的,需要很多的形容詞來修飾,而在編程中就需要很多的變量來修飾。比如:

public void sleep(){
System.out.println("我在睡覺");
}
需要一個變量來修飾睡覺,于是用一個參數。實際上就是定義一個變量類型。

public void sleep(String i){
System.out.println("我在"+i+"睡覺");
}
需要兩個變量,于是用兩個參數。實際上就是定義兩個變量類型。

public void sleep(String i,int j){
System.out.println("我在"+i+"睡覺"+j+"點起來")

有時需要更多的修飾,于是就有了更多的參數。這就是參數的存在意義。

當然有人會問:直接調用屬性就行,干嘛用參數,還要形參,實參,傳參。很是麻煩。比如:
string name;int time;
public void sleep(){
System.out.println(name+"在睡覺"+time+"點起來")

這樣理解,父類中肯定不會有屬性的具體值。子類中可能有某些屬性的具體屬性賦值,所以就必然要將某些屬性從子類傳遞給父類。用get/set方法可行,不過有些慢,所以就出現了專門的屬性值傳遞的通道。

那就是傳遞參數,傳參。這根前面屬性值賦值一回事,只不過從面向過程的一個類中賦值,變為了多個類之間相互賦值。如此就變成了類之間的傳遞參數。

既然有了傳遞參參。就必然有參與傳遞的雙方,一方就是傳遞者,傳遞了具體的參數,就是實參,一方是接受者,隨時準備接受,但是隨時可能沒有參數,于是叫做形式參數,形參。

所以參數列表可以說是類之間屬性賦值的一個專門通道。是面向對象思路的必然。

第六步。方法體。

主要的區別就在于有無。也就是有具體的方法體以及沒有方法體。甚至都可以沒有大括號。小括號就能組成一個方法。
最簡單的方法就是方法名();

接下來就是方法重載,方法重寫,方法調用了。

方法重載:

從構造方法里面我們發現了方法的重載,方法名相同, 形參不同。

而形參的不同又表示在:??1). 形參的個數不同? 2). 形參的類型不同 3). 形參的順序不同。

其實在調用Scanner的時候很類似,或者就是方法的重載。Input.next()。這后面可以跟不同的數據類型。

與此類似jdk幫助文檔的每一個方法有很多方法名相同,但是因為數據類型不同而生出區別的不同方法,這些只是因為調用接受設置的收據類型不同而成為同名的方法重載。如果一一為這些方法重命名,不僅我們要崩潰,設計者首先就會崩潰。這也跟java是強類型語言有直接關系。

從這里我們也可以明白方法重載的意義了。就是接受不同的數據類型,接受不同數量的數據。這些完全根據具體的需要而定。完全沒必要挨個的定義方法名。在大型類中,方法少了還好說,多了光是起名字就要耗費大量腦細胞。

方法重寫:

出現在父子繼承類當中。類與對象當中,對象是類的實現,實例化。子類是父類的實例化。

父類中的方法只需要一個存在的概念。而到了子類當中就必然要求根據子類的不同而出現不同的方法實現。這就是方法的重寫,不過是為了更好的適用于子類而已。

就好像螞蟻到了中國就必須與中國實際相結合才能發揮出相應的威力,不然不僅不能其正面作用,反而起副作用。必須做出佛.教中國化的改良一樣,現在世界上也沒有了佛.教,也同樣沒了螞蟻,而只有中國才有,呵呵題外話。有助大家理解。放松一下心情。

這樣一來重載出現在同類中,重寫出現在繼承得子類中。知道了這點,明白了存在的意義。才好記憶他們的其他區別。

圖片描述

方法的調用:

方法就好比武.器,屬性就好比子.彈。制造出來就是讓那來用的。不同的槍配不同的子彈,不同的搭配組合出來的效果不一樣。

首先你就要會用。步.槍與機.槍的用法注意事項絕對不一樣。橡膠.彈與穿.甲彈的使用方法也絕對不同。

不同的方法與變量的使用也絕對不同。

就方法的調用來說,基本上就三種。

第一。直接使用。本類中的諸多方法之間一般可以互相直接拿來使用。當然因為修飾符的權限不同。作用域可能不同。被static修飾的方法也可以直接被ststic方法拿來用。

第二種,間接使用。

在本類中用this調用。在父子類中用super調用。

第三,沒有明顯關系的類中。就必須首先創建要用方法所在類的對象,用變量名接受,然后才能調用。

其實就是new關鍵字的妙用。接觸最早的new就是new Scanner(System.in)。當然這是系統的方法,我們一般都是自定義調用。通過實例化進行調用是最廣泛的調用方法,可以說是萬金油式的方法。

第四,其實還有一種調用的方法就是調用系統封裝好的方法,導入系統方法,這個才是精華。就是import java.util.*;這個是重要的方法包。

最后介紹一種最常見最特殊的方法,主方法(主函數),也是常說的main方法。
public static void main(String[] args) {
}。

因為要對所有類公開,所以用public。因為第一時間運行加載,所以用static。因為沒有所謂的具體返回值,所以用void。因為是程序主要入口,所以用main。主要說說main以及參數列表。因為要傳遞各種類型的數據,不可能用特定的類型。所以就用字符串數組類型,接受各種數據。
前面的幾個修飾符跟其他地方的效力一樣,所以不必再介紹了。所以主要說一下main和參數列表。
因為是程序運行的主要入口,所以用main(最重要的)修飾。main不是關鍵詞。所以你定義一個屬性或方法:String main="123";不會報錯,也不知道為何。但沒必要如此。
一個類里面只能有一個main。甚至為了不引起混亂,我們一般的一個小項目也只有一個main方法。也就是一般的測試類。當然你也可以創建兩個測試類,分別測試不同的地方,就好像一個院子一般只有一個大門,你非得再開第二個,第三個大門,肯定有另外的用處。或者項目很大,打到一個城池需要九個城門的地步。
main函數在程序中大多數語言中都有存在。

再來看(String[] args)。意思就是一個String類型的數組參數,數組名,或者形參名叫做args。也不是關鍵字,是arguments的縮寫,只是一個默認名,一般都習慣性照寫。
所有的程序都是這樣的,原生的是int Main(int argc,char** argv)
其中argv[0]是exe的路徑,其他是參數。參數用空格分隔,與exe直接也用空格分隔。無論是c/c++/c#/java/vb等等程序都這樣。這個主函數聽說也是經歷了數次演變才成為了今天的樣子。
public class Demo
{
public static void main(String[] args)
{
System.out.println("打印main方法的輸入參數");
for(int i=0;i<args.length;i++){
System.out.println(args[i]);
}
}
}

大家在cmd編譯后運行的時候 在文件名后面輸入任何數據。這段主函數可以隨即將其輸出。這就是主函數參數的傳入與輸出。
因為eclipse是編譯與運行一體的,辦不了這個小事情,所以只能cmd上場了。呵呵。

一星期的醞釀總結,七八個小時終于寫完了,光一個方法全圖就浪費了我好幾個小時。肯定還有很多知識點沒有涉及到,以后會繼續編輯優化。謝謝。如果還有錯漏,希望大家提出來。謝謝。

點擊查看更多內容
69人點贊

若覺得本文不錯,就分享一下吧!

評論

相關文章推薦

正在加載中
意見反饋 幫助中心 APP下載
官方微信

舉報

0/150
提交
取消
lpl竞猜