JavaRush /Blog Java /Random-VI /Các phương thức trong Java

Các phương thức trong Java

Xuất bản trong nhóm
Có một nguyên tắc thú vị mà nhiều người đã nghe nói đến. Nó được gọi là "Chia rẽ và chinh phục." Nguyên tắc này được sử dụng trong nhiều lĩnh vực của đời sống con người, ví dụ như trong chính trị. Nó biểu thị sự phân chia của một số lượng lớn các bộ phận không đồng nhất trong bang, kích động và sử dụng sự thù địch giữa các bộ phận này. Nói cách khác: tạo ra xung đột giữa những người có khả năng đe dọa quyền lực. Nhưng chúng tôi là những lập trình viên nên chúng tôi chỉ quan tâm đến việc giải thích kỹ thuật của nguyên tắc này. Và nó như thế này: “Nguyên tắc của “Chia để trị” là chia một vấn đề lớn thành những vấn đề nhỏ hơn cho đến khi chúng trở nên cơ bản. Sau đó, bạn cần giải quyết chúng một cách tuần tự và kết hợp mọi thứ thành một hệ thống hoàn chỉnh. Chương trình này sẽ giải quyết được vấn đề đã cho”. Nghĩa là, bạn chỉ cần chia một vấn đề lớn thành những vấn đề nhỏ hơn và đây không phải là vấn đề để bạn giải quyết. Và sau đó bạn thu thập giải pháp thành một giải pháp lớn. Để tuân theo nguyên tắc đơn giản và hữu ích này, lập trình Java sử dụng các phương thức. Các phương thức trong Java - 1Ví dụ: chúng tôi đang tạo một võ sĩ robot. Điều quan trọng đối với chúng tôi là anh ấy di chuyển tốt, thực hiện các đòn tấn công chính xác và quan sát kẻ thù để tìm ra điểm yếu. Sẽ thật bất tiện nếu viết tất cả những điều này trong một phương thức chính , phải không? Nếu chúng ta mô tả mọi thứ bằng một phương thức, nó sẽ giống như thế này:
метод main() {
// Описание действий шага вперед
подача напряжения в отдельные модули;
поднятие ноги;
перевод в другую точку;
поставить ногу;
перенести вес на другую ногу;
если (противникАтакует()) {
        	// Описание действий уклонения робота.
        	...
} еслиНет {
        	// Описание действий обманного атакующего удара.
        	...
}
// Описание действий шага назад
...
}
Điều gì sẽ xảy ra nếu chúng ta cần sử dụng bước tiến hoặc đá ở nơi khác trong chương trình? Mô tả lại tất cả các hành động? Không phù hợp. Có quá nhiều dòng lặp đi lặp lại rất dễ bị lạc. Chúng ta cần đặt mô tả chi tiết của hành động trong một mô-đun riêng biệt, mô-đun này sẽ thực hiện bước của robot. Và chúng ta có thể gọi phương thức trong một dòng. Một cái gì đó như thế này:
метод шагВперед() {
// Описание действий шага вперед
  	подача напряжения в отдельные модули;
  	поднятие ноги;
  	перевод в другую точку;
  	поставить ногу;
  	перенести вес на другую ногу;
}

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

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

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

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

метод main() {
	шагВперед();
	если (противникАтакует()) {
        	уклонение();
	} еслиНет {
  	  обманныйАтакующийУдар();
	}
	шагНазад();
}
Bây giờ chúng ta đã tách chức năng của robot cũng như phương thức main() nhỏ gọn và rõ ràng . Các phương pháp còn lại cũng có thể được chia thành bất kỳ chức năng nào, ví dụ: Đòn đánh lừa đảo có thể được chia thành các phương pháp đánh lừa Chuyển động , chuyển động chân , tấn công . Và đến lượt họ, họ được giao những nhiệm vụ đơn giản hơn để cuối cùng có được một tập hợp những nhiệm vụ cơ bản. Được rồi, bây giờ chúng ta hãy viết nó thật đẹp dưới dạng mà Java sẽ chấp nhận.
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;
}
Tôi hiểu rằng hiện tại mã này có thể hơi không rõ ràng đối với bạn, đặc biệt là một số từ như void , return , v.v. Đừng vội ném cà chua, tôi sẽ giải thích mọi chuyện ngay bây giờ. Bạn có thể hiểu rõ ý tưởng chung của mô hình “Chia để trị”. Phương pháp sẽ giúp chúng ta điều này. Cấu trúc chung của các khai báo phương thức như sau:
модификатор_доступа возвращаемое_meaning Name_метода(принимаемые_параметры) {
   	//Тело метода
}

Công cụ sửa đổi quyền truy cập

Công cụ sửa đổi truy cập là một số từ khóa: public , Private , package . Những từ này chỉ ra phạm vi của phương pháp. Tôi sẽ giải thích nó một cách đơn giản: với từ này bạn dường như đang chia sẻ một món ăn ngon với người khác. Yummy là phương pháp của bạn. Nếu nó là riêng tư , bạn không chia sẻ phương thức này với các lớp khác. Nếu gói , bạn chỉ chia sẻ với các lớp trong gói (các lớp được tập hợp thành các gói cụ thể, bạn sẽ học điều này sau). Chà, công chúng cho thấy rằng bản thân bạn là người tử tế và chia sẻ (phương pháp) một món ăn ngon với toàn bộ chương trình. Một cái gì đó như thế này. Sau một vài cấp độ bạn sẽ hiểu rõ hơn về vai trò của những từ này.

Giá trị trả về

Hãy xem ví dụ trên: tất cả các phương thức đều được đánh dấu bằng từ khóa void , ngoại trừ một - isEnemyAttacked , trả về giá trị boolean . Nếu một phương thức được đánh dấu là void , nó có thể không trả về bất cứ thứ gì. Phương pháp này chỉ đơn giản là thực hiện một tập hợp các hành động và thế là xong. Bây giờ hãy chú ý đến phương pháp chính . Những phương thức trả về void được gọi giống như vậy, trong phần nội dung của phương thức. Nhưng phương thức isEnemyAttacked được gọi trong dấu ngoặc đơn của câu lệnh if . Do thực tế là nó trả về một giá trị boolean, chúng ta có cơ hội không sử dụng một biến trung gian mà chèn nó trực tiếp. Trả về một giá trị xảy ra bằng cách sử dụng từ khóa return . Nếu một phương thức trả về kiểu int , chúng ta có thể gọi phương thức đó từ bất kỳ biểu thức nào:
public static int getNumber() {
 	    return 5;
}

public static void main(String[] args) {
    	int result = 5 + 6 + getNumber();
    	System.out.println(result);
}
Phần kết luận:
16
Phương thức getNumber trả về một giá trị int , vì vậy chúng ta có thể gọi nó từ một biểu thức. Ngoài ra, phương thức này có thể trả về bất kỳ loại nào, kể cả những loại bạn tự tạo. Nếu bạn đã chỉ định kiểu trả về cho một phương thức thì bạn phải trả về một cái gì đó. Bạn không thể viết nó như thế này:
public static int findMaxNumber(int a, int b) {
 	if(a>b) {
 	    return a;
 	}
}
Trình biên dịch sẽ mắng bạn rằng khi điều kiện đầu tiên được đáp ứng, bạn sẽ trả về một cái gì đó, nhưng khi điều kiện thứ hai được đáp ứng thì bạn lại không làm như vậy.

Truyền tham số

Bạn có thể truyền tham số cho phương thức được sử dụng trong quá trình hoạt động của nó. Ví dụ nguyên thủy nhất là tổng của hai số. Nhưng chúng ta không phải là người nguyên thủy, phải không? Hãy lấy một ví dụ khác, khá rập khuôn. Giả sử chúng ta có một phương thức Chef() - cook. Chúng ta có thể chuyển các thành phần súp cho phương thức này trong khối tham số và kết quả là phương thức này trả về súp cho chúng ta. Như thế này:
public static void main(String[] args) {
    	String[] ingredients;
    	// Инициализация массива ингредиентов
    	Soup soup = chef(ingredients);

}

public static Soup chef(String[] ingredients) {
    	Soup soup = new Soup();
    	// Процесс варки супа
    	return soup;
}
(Giả sử chúng ta có một lớp Soup được tạo sẵn ) Trong phương thức main , chúng ta tạo ra một mảng nguyên liệu và sau đó “đưa nó cho đầu bếp” (chuyển nó cho phương thức đầu bếp ). “Người đầu bếp nấu món súp” và sau đó trả lại cho chúng ta như một đối tượng của lớp Soup . Mọi thứ đều rất đơn giản. Bạn có thể truyền bất kỳ tham số, kiểu nguyên thủy, đối tượng, mảng, v.v. cho phương thức.

Truyền tham số theo tham chiếu và theo giá trị

Trong ngôn ngữ lập trình Java, mọi tham số đều được truyền cho một phương thức theo giá trị của chúng. Tuy nhiên, cơ chế này khác nhau đối với các kiểu nguyên thủy và đối với các đối tượng. Nếu bạn chuyển bất kỳ kiểu nguyên thủy nào vào một phương thức và thay đổi nó, nó sẽ không thay đổi trong phương thức chính. Bạn chỉ cần chuyển một bản sao của giá trị và biến ban đầu được giữ nguyên. Ví dụ đơn giản nhất:
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;
	}
Phần kết luận:
mười một
Tuy nhiên, trong trường hợp đối tượng, những thay đổi sẽ ảnh hưởng đến đối tượng ban đầu:
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;
	}
}
Phần kết luận:
Nhà thông thái của chúng ta có IR 300 Nhà thông thái của chúng ta có IR 100
Chúng tôi có lớp WiseMan có thuộc tính iq . Và hai phương thức kiểm soát giá trị của trường này. Trong phương thức chính, chúng ta tạo một đối tượng WiseMan , đặt giá trị iq thành 300 . Sau đó, chúng tôi chuyển hiền nhân có iq 300 sang phương thức ChangeObject.Nhưng trong phương thức này, anh ta trở nên ngu ngốc. Chúng ta đặt giá trị của iq thành 100. Sau đó, trong phương thức chính, chúng ta in đối tượng. Bạn có thể thấy rằng trong phương thức ChangeObject chúng ta đang thao tác với một hiền nhân khác trong biến m . Tuy nhiên, chúng tôi đang sửa đổi đối tượng ban đầu của mình. Thực tế là đối tượng WiseMan trong phương thức main và đối tượng m trong phương thức ChangeObject là cùng một đối tượng Wiseman và một tham chiếu đến đối tượng được sao chép vào phương thức dưới dạng tham số. Hãy ghi nhớ điều này khi bạn chỉnh sửa một đối tượng theo các phương thức riêng lẻ.

Cuối cùng, một vài lời về công cụ sửa đổi tĩnh

Nói chung, một vài từ sẽ không phù hợp ở đây, nhưng tôi sẽ cố gắng. Các phương thức thông thường không được đánh dấu bằng công cụ sửa đổi này thuộc về đối tượng lớp. Và các phương thức tĩnh thuộc về chính lớp đó. Các phương pháp thông thường có thể được sử dụng trên các đối tượng riêng lẻ. Nhìn vào lớp WiseMan từ ví dụ trên. Mỗi hiền nhân sẽ có phương thức getIqsetIq riêng , vì mức IQ của mỗi người là khác nhau. Nếu chúng ta thêm một phương thức tĩnh generateAWisePhrase vào lớp này thì chúng ta có thể gọi một phương thức như vậy mà không cần đối tượng:
WiseMan.generateAWisePhrase();
Nói chung, hiện tại thông tin này là đủ vì có thể viết một số bài giảng về tĩnh . Thực hiện theo một số quy tắc khi viết phương pháp để duy trì trật tự trong mã của bạn:
  • Đặt cho các phương thức của bạn những cái tên có ý nghĩa để bạn có thể hiểu rõ chúng làm gì.
  • Cố gắng không viết các phương thức quá dài. Độ dài tối ưu là 8-15 dòng.
  • Số lượng tham số của phương pháp không được vượt quá 4-5.
  • Nếu bạn có chức năng tương tự hai lần trong mã của mình, hãy nghĩ: có lẽ nó đáng để khái quát hóa nó và đưa nó vào một phương thức riêng biệt?
Những kỹ thuật này sẽ giúp bạn cải thiện hiệu suất của chương trình và quan trọng nhất là làm cho mã của bạn dễ đọc hơn.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION