JavaRush /Java Blog /Random-TW /Java 中的方法

Java 中的方法

在 Random-TW 群組發布
許多人都聽說過一個有趣的原則。這就是所謂的「分而治之」。這項原則應用於人類生活的許多領域,例如政治。它意味著國家內部大量異質部分的分裂,煽動和利用這些部分之間的敵意。換句話說:在那些可能對權力構成威脅的人之間製造衝突。但我們是程式設計師,所以我們只對這個原理的技術解釋感興趣。它是這樣的:「分而治之的原則是將一個大問題分解成更小的問題,直到它們變得簡單。然後你需要依次解決它們並將所有內容組合成一個完整的系統。這個程式應該解決給定的問題」也就是說,你只需將一個大問題分解成較小的問題,而這不是你需要解決的問題。然後你將解決方案收集成一個大解決方案。為了遵循這個簡單而有用的原則,Java 程式設計使用了方法。 Java 中的方法 - 1例如,我們正在創建一個機器人拳擊手。對我們來說,重要的是他的移動靈活,打擊準確,並且觀察敵人尋找弱點。將所有這些都寫在一個main方法中會很尷尬,不是嗎?如果我們用一種方法來描述一切,它將是這樣的:
метод main() {
// Описание действий шага вперед
подача напряжения в отдельные модули;
поднятие ноги;
перевод в другую точку;
поставить ногу;
перенести вес на другую ногу;
если (противникАтакует()) {
        	// Описание действий уклонения робота.
        	...
} еслиНет {
        	// Описание действий обманного атакующего удара.
        	...
}
// Описание действий шага назад
...
}
如果我們需要在程序的其他地方向前邁出一步或踢出一步怎麼辦?再描述一下所有的動作?不適合。重複的台詞太多,很容易迷失方向。我們需要將動作細節的描述放在一個單獨的模組中,該模組將執行機器人步驟。我們可以在一行中呼叫該方法。像這樣的東西:
метод шагВперед() {
// Описание действий шага вперед
  	подача напряжения в отдельные модули;
  	поднятие ноги;
  	перевод в другую точку;
  	поставить ногу;
  	перенести вес на другую ногу;
}

метод уклонение() {
  	// Действия для уклонения
  	...
}

метод обманныйАтакующийУдар() {
  	// Действия для удара
  	...
}

метод шагНазад() {
  	// Действия для шага назад
  	...
}

метод противникАтакует() {
	// Робот проверяет атакует ли противник
}

метод main() {
	шагВперед();
	если (противникАтакует()) {
        	уклонение();
	} еслиНет {
  	  обманныйАтакующийУдар();
	}
	шагНазад();
}
現在我們有了獨立的機器人功能,以及緊湊清晰的main()方法。其餘方法也可以分為任意功能,例如deceptiveAttackingStrike可以分為方法deceptiveMovementLeg movingAttack。反過來,他們被分配到更簡單的任務,以便最終獲得一組基本任務。好吧,現在讓我們以 Java 可以接受的形式將其完美地編寫出來。
public static void stepForward() {
  	    // Многострочный code, описывающий
  	    // действия робота для выполнения шага
  	    System.out.println("The robot takes a step forward");
}

public static void evasion() {
  	    // Действия для уклонения
  	    System.out.println("Robot shy of impact");
}

public static void deceptiveAttackBlow() {
  	    // Действия для удара
  	    System.out.println("The robot performs a deceptive strike");
}

public static void stepBack() {
  	    // Действия для шага назад
  	    System.out.println("The robot takes a step backwards");
}

public static void main(String[] args) {
    	stepForward();
    	if (isEnemyAttacked()) {
        		evasion();
    	} else {
  	    	deceptiveAttackBlow();
    	}
    	stepBack();
}

public static boolean isEnemyAttacked() {
    	// Метод проверяет, атакует ли враг. returns логическое meaning.
    	return true;
}
我知道這段程式碼現在對你來說可能有點不清楚,尤其是一些像是voidreturn之類的單字。別急著丟西紅柿,我現在就解釋一切。「分而治之」範式的整體思路你應該很清楚。方法將幫助我們做到這一點。方法宣告的一般架構如下:
модификатор_доступа возвращаемое_meaning Name_метода(принимаемые_параметры) {
   	//Тело метода
}

存取修飾符

存取修飾符是幾個關鍵字:publicprivatepackage。這些字詞顯示了該方法的範圍。我簡單地解釋一下:用這個詞,你似乎在與他人分享美味。美味是你的方法。如果它是private,則不會與其他類別共用該方法。如果是package,則僅與套件內的類別共用(類別被收集到特定的套件中,稍後您將了解這一點)。好吧,公開表明你本身就是善良的,並與整個節目分享美味佳餚(方法)。像這樣的東西。經過幾個級別後,您會更好地理解這些單字的作用。

傳回值

看上面的例子:所有方法都用void關鍵字標記,除了一個 - isEnemyAttacked,它傳回一個布林值。如果一個方法被標記為void,它可能不會傳回任何內容。這個方法只是執行一組操作,僅此而已。現在註意main方法。那些傳回void的方法就像在方法體中一樣被呼叫。但isEnemyAttacked方法是在if語句的括號內呼叫的。由於它返回一個布林值,我們有機會不使用中間變量,而是直接插入它。使用return關鍵字傳回一個值。如果方法傳回int類型,我們可以從任何表達式呼叫該方法:
public static int getNumber() {
 	    return 5;
}

public static void main(String[] args) {
    	int result = 5 + 6 + getNumber();
    	System.out.println(result);
}
結論:
16
getNumber 方法傳回一個int值,因此我們可以從表達式中呼叫它。此外,該方法可以傳回任何類型,包括您自己建立的類型。如果您為方法指定了回傳類型,那麼您必須傳回一些內容。你不能這樣寫:
public static int findMaxNumber(int a, int b) {
 	if(a>b) {
 	    return a;
 	}
}
編譯器會責罵你,當滿足第一個條件時,你會回傳一些東西,但當滿足第二個條件時,你不會。

傳遞參數

您可以將參數傳遞給在其操作期間使用的方法。最原始的例子是兩個數字的總和。但我們並不原始,對吧?我們再舉一個例子,這個例子非常典型。假設我們有一個Chef()方法- Cook。我們可以在參數塊中將湯成分傳遞給該方法,結果該方法將湯返回給我們。像這樣:
public static void main(String[] args) {
    	String[] ingredients;
    	// Инициализация массива ингредиентов
    	Soup soup = chef(ingredients);

}

public static Soup chef(String[] ingredients) {
    	Soup soup = new Soup();
    	// Процесс варки супа
    	return soup;
}
(假設我們有一個預先建立的Soup類別)在 main 方法中,我們建立一個配料數組,然後「將其交給廚師」(將其傳遞給廚師方法)。「廚師做湯」然後將其作為Soup類別的物件傳回給我們。一切都很簡單。您可以將任何參數、基本類型、物件、陣列等傳遞給該方法。

透過引用和值傳遞參數

在 Java 程式語言中,任何參數都會以其值傳遞給方法。然而,這種機制對於原始類型和物件來說是不同的。如果將任何基本類型傳遞到方法中並更改它,它不會在 main 方法中更改。您只需傳遞該值的副本,原始變數就會保留。最簡單的例子:
public static void main(String[] args) {
    	int x = 1;
    	System.out.println(x);
    	getNumber(x);
    	System.out.println(x);

	}

	public static void getNumber(int i) {
    	i = i + 100;
	}
結論:
十一
但是,對於對象,變更會影響原始對象:
public class Program
{
	public static void main(String[] args) {
    	WiseMan wiseMan = new WiseMan();
    	wiseMan.setIq(300);
    	System.out.println(wiseMan);
    	changeObject(wiseMan);
    	System.out.println(wiseMan);

	}

	public static void changeObject(WiseMan m) {
    	m.setIq(100);
	}
}

public class WiseMan {
	int iq;

	public void setIq(int iq) {
    	this.iq = iq;
	}

	public int getIq() {
    	return iq;
	}

	public String toString() {
    	return "Our wise man has an IQ "+iq;
	}
}
結論:
我們的智者有 IR 300 我們的智者有 IR 100
我們有一個具有iq屬性的WiseMan類別。以及控制該欄位的值的兩個方法。在main方法中我們建立一個wiseMan對象,將iq值設為300。然後我們將智商為300的聖人傳遞給changeObject方法,但在這個方法中他變得愚蠢了。我們將iq的值設為100。然後在 main 方法中我們印出該物件。您可以看到,在changeObject方法中,我們正在操作變數m中的另一個聖人。但是,我們正在修改原始物件。事實是,main方法中的wiseMan物件和changeObject方法中的m物件是同一個wise man,並且將該物件的參考作為參數複製到方法中。當您在各個方法中編輯物件時請記住這一點。

最後,關於 static 修飾符的幾句話

一般來說,在這裡幾句話是不夠的,但我會嘗試。未用此修飾符標記的常規方法屬於類別物件。而靜態方法屬於類別本身。常規方法可用於單一物件。查看上面範例中的WiseMan類別。每個聖人都會有自己的getIqsetIq方法,因為每個人的 IQ 水平都不同。如果我們在這個類別中加入一個靜態方法generateAWisePhrase,那麼我們就可以在沒有物件的情況下呼叫這樣的方法:
WiseMan.generateAWisePhrase();
一般來說,這些資訊目前已經足夠了,因為可以寫幾篇關於static 的講座。編寫方法來維護程式碼中的順序時,請遵循一些規則:
  • 為您的方法提供有意義的名稱,以便清楚它們的作用。
  • 盡量不要寫很長的方法。最佳長度是 8-15 行。
  • 方法參數的數量不得超過4-5個。
  • 如果您的程式碼中有兩次類似的功能,請想一想:也許值得對其進行概括並將其放入單獨的方法中?
這些技術將幫助您提高程式的效能,最重要的是,使您的程式碼更具可讀性。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION