JavaRush /Blog Java /Random-MS /Kaedah dalam Java

Kaedah dalam Java

Diterbitkan dalam kumpulan
Terdapat satu prinsip menarik yang ramai telah dengar. Ia dipanggil "Divide and Conquer." Prinsip ini digunakan dalam banyak bidang kehidupan manusia, contohnya, dalam politik. Ia menandakan pembahagian sebilangan besar bahagian heterogen di negeri ini, menghasut dan menggunakan permusuhan antara bahagian ini. Dalam erti kata lain: mewujudkan konflik antara mereka yang berpotensi menimbulkan ancaman kepada kuasa. Tetapi kami adalah pengaturcara, jadi kami hanya berminat dengan tafsiran teknikal prinsip ini. Dan ia berlaku seperti ini: "Prinsip "Bahagi dan Takluk" adalah untuk memecahkan masalah besar kepada masalah yang lebih kecil sehingga menjadi asas. Kemudian anda perlu menyelesaikannya secara berurutan dan menggabungkan semuanya ke dalam satu sistem keseluruhan. Program ini sepatutnya menyelesaikan masalah yang diberikan” Iaitu, anda hanya memecahkan masalah yang besar kepada yang lebih kecil, yang bukan masalah untuk anda selesaikan. Dan kemudian anda kumpulkan penyelesaiannya menjadi satu penyelesaian yang besar. Untuk mengikuti prinsip mudah dan berguna ini, pengaturcaraan Java menggunakan kaedah. Kaedah dalam Java - 1Sebagai contoh, kami mencipta petinju robot. Adalah penting bagi kami bahawa dia bergerak dengan baik, melakukan serangan yang tepat, dan juga mengawasi musuh untuk mencari titik lemah. Ia akan menjadi janggal untuk menulis semua ini dalam satu kaedah utama , bukan? Jika kita menerangkan semuanya dalam satu kaedah, ia akan menjadi seperti ini:
метод main() {
// Описание действий шага вперед
подача напряжения в отдельные модули;
поднятие ноги;
перевод в другую точку;
поставить ногу;
перенести вес на другую ногу;
если (противникАтакует()) {
        	// Описание действий уклонения робота.
        	...
} еслиНет {
        	// Описание действий обманного атакующего удара.
        	...
}
// Описание действий шага назад
...
}
Bagaimana jika kita perlu menggunakan langkah ke hadapan atau menendang di tempat lain dalam program? Terangkan semua tindakan sekali lagi? tak muat. Terdapat terlalu banyak baris berulang yang mudah tersesat. Kita perlu meletakkan perihalan butiran tindakan dalam modul berasingan, yang akan melaksanakan langkah robot. Dan kita boleh memanggil kaedah dalam satu baris. Sesuatu seperti ini:
метод шагВперед() {
// Описание действий шага вперед
  	подача напряжения в отдельные модули;
  	поднятие ноги;
  	перевод в другую точку;
  	поставить ногу;
  	перенести вес на другую ногу;
}

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

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

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

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

метод main() {
	шагВперед();
	если (противникАтакует()) {
        	уклонение();
	} еслиНет {
  	  обманныйАтакующийУдар();
	}
	шагНазад();
}
Kini kami telah memisahkan fungsi robot, serta kaedah main() yang padat dan jelas . Selebihnya kaedah juga boleh dibahagikan kepada mana-mana fungsi, sebagai contoh, deceptiveAttackingStrike boleh dibahagikan kepada kaedah deceptiveMovement , Pergerakan kaki , serangan . Dan mereka, pada gilirannya, ditugaskan kepada tugas yang lebih mudah untuk akhirnya mendapatkan satu set tugasan asas. Baiklah, sekarang mari kita tulis semuanya dengan indah dalam bentuk yang akan diterima oleh 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;
}
Saya faham bahawa kod ini mungkin agak kurang jelas kepada anda sekarang, terutamanya beberapa perkataan seperti void , return dan sebagainya. Jangan tergesa-gesa membuang tomato, saya akan menerangkan segala-galanya sekarang. Idea umum paradigma "Divide and Conquer" harus jelas kepada anda. Kaedah akan membantu kami dengan ini. Struktur umum pengisytiharan kaedah adalah seperti berikut:
модификатор_доступа возвращаемое_meaning Name_метода(принимаемые_параметры) {
   	//Тело метода
}

Pengubah suai akses

Pengubah suai akses ialah beberapa kata kunci: public , private , package . Kata-kata ini menunjukkan skop kaedah. Saya akan menerangkannya secara ringkas: dengan perkataan ini anda nampaknya berkongsi hidangan lazat dengan orang lain. Sedap adalah kaedah anda. Jika ia private , anda tidak berkongsi kaedah dengan kelas lain. Jika package , anda hanya berkongsi dengan kelas dalam pakej (kelas dikumpulkan ke dalam pakej tertentu, anda akan mempelajarinya kemudian). Nah, umum menunjukkan bahawa anda adalah baik dan berkongsi hidangan yang lazat (kaedah) dengan keseluruhan program. Sesuatu seperti ini. Selepas beberapa peringkat anda akan memahami peranan perkataan ini dengan lebih baik.

Nilai pulangan

Lihat contoh di atas: semua kaedah ditandakan dengan kata kunci void , kecuali satu - isEnemyAttacked , yang mengembalikan nilai boolean . Jika kaedah ditanda batal , ia mungkin tidak mengembalikan apa-apa. Kaedah ini hanya melakukan satu set tindakan dan itu sahaja. Sekarang perhatikan kaedah utama . Kaedah yang mengembalikan batal dipanggil begitu sahaja, dalam badan kaedah. Tetapi kaedah isEnemyAttacked dipanggil dalam kurungan pernyataan if . Disebabkan fakta bahawa ia mengembalikan nilai boolean, kami mendapat peluang untuk tidak menggunakan pembolehubah perantaraan, tetapi untuk memasukkannya secara langsung. Mengembalikan nilai berlaku menggunakan kata kunci pulangan . Jika kaedah mengembalikan type int , kita boleh memanggil kaedah daripada sebarang ungkapan:
public static int getNumber() {
 	    return 5;
}

public static void main(String[] args) {
    	int result = 5 + 6 + getNumber();
    	System.out.println(result);
}
Kesimpulan:
16
Kaedah getNumber mengembalikan nilai int , jadi kita boleh memanggilnya daripada ungkapan. Selain itu, kaedah ini boleh mengembalikan apa-apa jenis, termasuk yang anda buat sendiri. Jika anda menetapkan jenis pulangan untuk kaedah, maka anda mesti mengembalikan sesuatu. Anda tidak boleh menulisnya seperti ini:
public static int findMaxNumber(int a, int b) {
 	if(a>b) {
 	    return a;
 	}
}
Pengkompil akan memarahi anda bahawa apabila syarat pertama dipenuhi, anda mengembalikan sesuatu, tetapi apabila syarat kedua dipenuhi, anda tidak.

Melepasi parameter

Anda boleh menghantar parameter kepada kaedah yang digunakan semasa operasinya. Contoh yang paling primitif ialah penjumlahan dua nombor. Tetapi kita tidak primitif, bukan? Mari kita ambil contoh lain, agak stereotaip. Katakan kita mempunyai kaedah chef() - masak. Kami boleh menghantar bahan sup kepada kaedah ini dalam blok parameter, dan sebagai hasilnya, kaedah ini mengembalikan sup kepada kami. seperti ini:
public static void main(String[] args) {
    	String[] ingredients;
    	// Инициализация массива ингредиентов
    	Soup soup = chef(ingredients);

}

public static Soup chef(String[] ingredients) {
    	Soup soup = new Soup();
    	// Процесс варки супа
    	return soup;
}
(Katakanlah kami mempunyai kelas Sup yang telah dibuat sebelumnya ) Dalam kaedah utama, kami mencipta pelbagai bahan dan kemudian "berikan kepada tukang masak" (luluskan kepada kaedah tukang masak ). "Pemasak membuat sup" dan kemudian mengembalikannya kepada kami sebagai objek kelas Sup . Semuanya sangat mudah. Anda boleh menghantar sebarang parameter, jenis primitif, objek, tatasusunan dan sebagainya kepada kaedah.

Melepasi parameter dengan rujukan dan nilai

Dalam bahasa pengaturcaraan Java, sebarang parameter dihantar ke kaedah mengikut nilainya. Walau bagaimanapun, mekanisme ini berbeza untuk jenis primitif dan untuk objek. Jika anda menghantar mana-mana jenis primitif ke dalam kaedah dan mengubahnya, ia tidak akan berubah dalam kaedah utama. Anda hanya lulus salinan nilai, dan pembolehubah asal telah dikekalkan. Contoh paling mudah:
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;
	}
Kesimpulan:
sebelas
Walau bagaimanapun, dalam kes objek, perubahan mempengaruhi objek asal:
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;
	}
}
Kesimpulan:
Orang bijak kita ada IR 300 Orang bijak kita ada IR 100
Kami mempunyai kelas WiseMan yang mempunyai harta iq . Dan dua kaedah yang mengawal nilai medan ini. Dalam kaedah utama kita mencipta objek wiseMan , tetapkan nilai iq kepada 300 . Kemudian kami meneruskan sage kami dengan iq 300 kepada kaedah changeObject . Tetapi dalam kaedah ini dia menjadi bodoh. Kami menetapkan nilai iq kepada 100. Kemudian dalam kaedah utama kami mencetak objek. Anda boleh melihat bahawa dalam kaedah changeObject kami memanipulasi bijak lain dalam pembolehubah m . Walau bagaimanapun, kami mengubah suai objek asal kami. Hakikatnya ialah objek wiseMan dalam kaedah utama dan objek m dalam kaedah changeObject adalah orang bijak yang sama, dan rujukan kepada objek disalin ke dalam kaedah sebagai parameter. Ingat ini apabila anda mengedit objek dalam kaedah individu.

Akhir sekali, beberapa perkataan tentang pengubah suai statik

Secara umum, beberapa perkataan tidak akan dilakukan di sini, tetapi saya akan cuba. Kaedah biasa yang tidak ditandakan dengan pengubah suai ini tergolong dalam objek kelas. Dan kaedah statik tergolong dalam kelas itu sendiri. Kaedah biasa boleh digunakan pada objek individu. Lihat kelas WiseMan dari contoh di atas. Setiap orang bijak akan mempunyai kaedah getIq dan setIq sendiri , kerana tahap IQ setiap orang adalah berbeza. Jika kita menambah kaedah statik generateAWisePhrase ke kelas ini , maka kita boleh memanggil kaedah sedemikian tanpa objek:
WiseMan.generateAWisePhrase();
Secara umum, maklumat ini sudah cukup buat masa ini, kerana beberapa kuliah boleh ditulis tentang statik . Ikuti beberapa peraturan semasa menulis kaedah untuk mengekalkan ketertiban dalam kod anda:
  • Berikan kaedah anda nama yang bermakna supaya jelas apa yang mereka lakukan.
  • Cuba untuk tidak menulis kaedah yang sangat panjang. Panjang optimum ialah 8-15 baris.
  • Bilangan parameter kaedah tidak boleh melebihi 4-5.
  • Jika anda mempunyai fungsi yang sama dua kali dalam kod anda, fikirkan: mungkin ia patut digeneralisasikan dan meletakkannya dalam kaedah yang berasingan?
Teknik ini akan membantu anda meningkatkan prestasi program anda dan, yang paling penting, menjadikan kod anda lebih mudah dibaca.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION