Public static void main string args là gì năm 2024

Có những tình huống khi chúng ta muốn có nhiều cách gọi một phương thức. Tại sao không tạo ra trí tuệ nhân tạo của riêng chúng ta? Amazon có Alexa, Apple có Siri, vậy tại sao chúng ta không có? :) Trong phim Iron Man, Tony Stark tạo ra trí thông minh nhân tạo đáng kinh ngạc của riêng mình, Jarvis. Hãy vinh danh nhân vật tuyệt vời đó và đặt tên cho AI của chúng ta để vinh danh anh ấy. :) Điều đầu tiên chúng ta cần làm là dạy Jarvis chào những người bước vào phòng (sẽ thật kỳ lạ nếu một trí tuệ tuyệt vời như vậy lại trở nên bất lịch sự).

  
public class Jarvis {
    public void sayHi(String name) {  
        System.out.println("Good evening, " + name + ". How are you?");  
    }
    public static void main(String[] args) {  
        Jarvis jarvis = new Jarvis();  
        jarvis.sayHi("Tony Stark");  
    }  
}  

Đầu ra bảng điều khiển:

Good evening, Tony Stark. How are you?

Rất tốt! Jarvis hiện đã có thể đón khách. Tất nhiên, thường thì đó sẽ là chủ nhân của anh ta, Tony Stark. Nhưng nếu anh ấy không đến một mình thì sao! Phương thức sayHi() của chúng ta chỉ chấp nhận một đối số. Và do đó, nó chỉ có thể chào một người bước vào phòng, và sẽ phớt lờ người kia. Không lịch sự lắm, bạn có đồng ý không? :/

Quá tải phương thức Java

Trong trường hợp này, chúng ta có thể giải quyết vấn đề bằng cách viết 2 phương thức có cùng tên nhưng khác tham số:

Meow!  
Pounce!

0

Điều này được gọi là nạp chồng phương thức. Quá tải phương thức cho phép chương trình của chúng tôi linh hoạt hơn và phù hợp với nhiều cách làm việc khác nhau. Hãy xem lại cách nó hoạt động:

Meow!  
Pounce!

1

Đầu ra bảng điều khiển:

Meow!  
Pounce!

2

Tuyệt vời, cả hai phiên bản đều hoạt động. :) Nhưng chúng tôi đã không giải quyết được vấn đề! Nếu có ba khách thì sao? Tất nhiên, chúng ta có thể nạp chồng phương thức sayHi() một lần nữa để nó chấp nhận ba tên khách. Nhưng có thể có 4 hoặc 5. Cho đến vô tận. Không có cách nào tốt hơn để dạy Jarvis xử lý bất kỳ số lượng tên nào mà không làm quá tải phương thức sayHi() hàng triệu lần sao? :/ Tất nhiên là có! Nếu không, bạn có nghĩ Java sẽ là ngôn ngữ lập trình phổ biến nhất trên thế giới không? ;)

Meow!  
Pounce!

3

Khi ( String... names ) được sử dụng làm tham số, nó chỉ ra rằng một tập hợp các Chuỗi sẽ được truyền cho phương thức. Chúng tôi không phải chỉ định trước sẽ có bao nhiêu, vì vậy bây giờ phương pháp của chúng tôi linh hoạt hơn nhiều:

Meow!  
Pounce!

4

Đầu ra bảng điều khiển:

Meow!  
Pounce!

5

Một số mã ở đây sẽ không quen thuộc với bạn, nhưng đừng lo lắng về nó. Cốt lõi của nó rất đơn giản: phương pháp này lần lượt lấy từng tên và chào đón từng vị khách! Ngoài ra, nó sẽ hoạt động với bất kỳ số lượng chuỗi đã truyền nào! Hai, mười, thậm chí một nghìn—phương pháp này sẽ hoạt động hiệu quả với bất kỳ số lượng khách nào. Bạn có nghĩ rằng thuận tiện hơn là nạp chồng phương thức cho tất cả các khả năng không? :) Đây là một điểm quan trọng khác: thứ tự của các đối số rất quan trọng! Giả sử phương thức của chúng ta nhận một Chuỗi và một số:

Meow!  
Pounce!

6

Nếu phương thức sayYourAge của lớp Person lấy một chuỗi và một số làm đầu vào, thì chương trình phải chuyển chúng theo thứ tự cụ thể đó! Nếu chúng ta chuyển chúng theo một thứ tự khác, trình biên dịch sẽ báo lỗi và người đó sẽ không thể nói tuổi của mình. Nhân tiện, hàm tạo mà chúng ta đã đề cập trong bài trước cũng là phương thức! Bạn cũng có thể quá tải chúng (tức là tạo một số hàm tạo với các bộ tham số khác nhau) và thứ tự của các đối số được truyền về cơ bản cũng rất quan trọng đối với chúng. Chúng là những phương pháp thực sự! :)

Một lần nữa liên quan đến các thông số

Vâng, xin lỗi, chúng tôi chưa hoàn thành với họ. :) Chủ đề mà chúng ta sẽ nghiên cứu bây giờ rất quan trọng. Có 90% khả năng bạn sẽ được hỏi về điều này trong mọi cuộc phỏng vấn trong tương lai! Hãy nói về việc truyền đối số cho các phương thức. Hãy xem xét một ví dụ đơn giản:

Meow!  
Pounce!

7

Cỗ máy thời gian có hai phương pháp. Cả hai đều lấy số đại diện cho năm hiện tại làm đầu vào và tăng hoặc giảm giá trị của nó (tùy thuộc vào việc chúng ta muốn đi về quá khứ hay tương lai). Tuy nhiên, như bạn có thể thấy từ đầu ra của bàn điều khiển, phương pháp này không hoạt động! Đầu ra bảng điều khiển:

Meow!  
Pounce!

8

Chúng ta đã chuyển biến currentYear sang phương thức goToPast() , nhưng giá trị của nó không thay đổi. Chúng tôi đã ở vào năm 2018 và chúng tôi đã ở đây. Nhưng tại sao? :/ Bởi vì các nguyên hàm trong Java được truyền cho các phương thức theo giá trị. Điều đó nghĩa là gì? Khi chúng ta gọi phương thức goToPast() và truyền biến int currentYear (=2018) cho nó, phương thức này không nhận chính biến currentYear mà là một bản sao của nó. Tất nhiên, giá trị của bản sao này cũng là 2018, nhưng mọi thay đổi đối với bản sao không ảnh hưởng đến biến currentYear ban đầu của chúng tôi theo bất kỳ cách nào! Hãy làm cho mã của chúng ta rõ ràng hơn và xem điều gì sẽ xảy ra với currentYear:

Meow!  
Pounce!

9

Đầu ra bảng điều khiển:

  
public class Truck {
    int length;  
    int width;  
    int height;  
    int weight;
    public int getVolume() {  
        int volume = length * width * height;  
        return volume;  
    }  
}  

0

Điều này cho thấy rõ ràng rằng biến được truyền cho phương thức goToPast() chỉ là một bản sao của currentYear . Và việc thay đổi bản sao không ảnh hưởng đến giá trị "gốc". "Chuyển qua tham chiếu" có nghĩa hoàn toàn ngược lại. Hãy thực hành trên mèo! Ý tôi là, hãy xem việc chuyển qua tham chiếu trông như thế nào khi sử dụng một ví dụ về mèo. :)

  
public class Truck {
    int length;  
    int width;  
    int height;  
    int weight;
    public int getVolume() {  
        int volume = length * width * height;  
        return volume;  
    }  
}  

1

Giờ đây, với sự trợ giúp của cỗ máy thời gian, chúng tôi sẽ gửi Smudge , chú mèo du hành thời gian đầu tiên trên thế giới, về quá khứ và tương lai! Hãy sửa đổi lớp TimeMachine để nó hoạt động với các đối tượng Cat ;

  
public class Truck {
    int length;  
    int width;  
    int height;  
    int weight;
    public int getVolume() {  
        int volume = length * width * height;  
        return volume;  
    }  
}  

2

Giờ đây, các phương thức không chỉ thay đổi số đã truyền. Thay vào đó, họ thay đổi trường tuổi Cat cụ thể đó . Bạn sẽ nhớ rằng điều này không hiệu quả đối với chúng tôi với số nguyên thủy, bởi vì số ban đầu không thay đổi. Hãy xem điều gì sẽ xảy ra!

  
public class Truck {
    int length;  
    int width;  
    int height;  
    int weight;
    public int getVolume() {  
        int volume = length * width * height;  
        return volume;  
    }  
}  

3

Đầu ra bảng điều khiển:

  
public class Truck {
    int length;  
    int width;  
    int height;  
    int weight;
    public int getVolume() {  
        int volume = length * width * height;  
        return volume;  
    }  
}  

4

Ồ! Bây giờ phương pháp đã làm khác đi: con mèo của chúng tôi già đi đáng kể, nhưng sau đó nó lại trẻ ra! :) Hãy thử tìm hiểu tại sao. Không giống như ví dụ với các nguyên hàm, khi các đối tượng được truyền cho một phương thức, chúng được truyền theo tham chiếu. Một tham chiếu đến đối tượng smudge ban đầu được truyền cho phương thức changeAge() . Vì vậy, khi chúng ta thay đổi smudge.age bên trong phương thức, chúng ta đang tham chiếu đến cùng một vùng bộ nhớ nơi đối tượng của chúng ta được lưu trữ. Đó là một tham chiếu đến cùng một Vết nhòe mà chúng tôi đã tạo ban đầu. Điều này được gọi là "đi qua tham chiếu"! Tuy nhiên, không phải mọi thứ có tham chiếu đều dễ dàng như vậy. :) Hãy thử thay đổi ví dụ của chúng tôi:

  
public class Truck {
    int length;  
    int width;  
    int height;  
    int weight;
    public int getVolume() {  
        int volume = length * width * height;  
        return volume;  
    }  
}  

5

Đầu ra bảng điều khiển:

  
public class Truck {
    int length;  
    int width;  
    int height;  
    int weight;
    public int getVolume() {  
        int volume = length * width * height;  
        return volume;  
    }  
}  

6

Nó không hoạt động trở lại! О_О Hãy tìm hiểu chuyện gì đã xảy ra. :) Nó có mọi thứ liên quan đến các phương thức goToPast / goToFuture và cách hoạt động của các tham chiếu. Bây giờ, chú ý của bạn, xin vui lòng! Đây là điều quan trọng nhất để hiểu về cách thức hoạt động của các tham chiếu và phương thức. Thực tế là, khi chúng ta gọi phương thức goToFuture(Cat cat) , đó là một bản sao của tham chiếu đến đối tượng mèo được truyền, chứ không phải chính tham chiếu đó. Do đó, khi chúng ta truyền một đối tượng cho một phương thức, có hai tham chiếu đến đối tượng. Điều này rất quan trọng để hiểu những gì đang xảy ra. Đây chính xác là lý do tại sao tuổi của con mèo không thay đổi trong ví dụ trước của chúng ta. Trong ví dụ trước, khi thay đổi độ tuổi, chúng ta chỉ cần lấy tham chiếu được truyền cho goToFuture()và sử dụng nó để tìm đối tượng trong bộ nhớ và thay đổi tuổi của nó ( cat.age += 10 ). Nhưng bây giờ, bên trong phương thức goToFuture() , chúng ta đang tạo một đối tượng mới ( cat = new Cat(cat.age) ) và đối tượng này được gán cùng một bản sao tham chiếu đã được truyền cho phương thức. Kết quả là:

  • Tham chiếu đầu tiên ( Cat smudge = new Cat (5) ) trỏ đến con mèo ban đầu (với 5 tuổi)
  • Sau đó, khi chúng ta chuyển biến cat phương thức goToPast() và gán cho nó một đối tượng mới, tham chiếu đã được sao chép.

Và điều này đưa chúng ta đến kết quả cuối cùng: hai tham chiếu trỏ đến hai đối tượng khác nhau. Nhưng chúng tôi chỉ thay đổi tuổi của một trong số chúng (cái được tạo bên trong phương thức).

  
public class Truck {
    int length;  
    int width;  
    int height;  
    int weight;
    public int getVolume() {  
        int volume = length * width * height;  
        return volume;  
    }  
}  

7

Và tất nhiên, trong phương thức main(), chúng ta có thể thấy trên bảng điều khiển rằng tuổi của con mèo, smudge.age , không thay đổi. Xét cho cùng, smudge là một biến tham chiếu vẫn trỏ đến đối tượng gốc, cũ với 5 tuổi và chúng tôi không làm gì với đối tượng đó. Tất cả các thay đổi về tuổi của chúng tôi đã được thực hiện trên đối tượng mới. Vì vậy, hóa ra các đối tượng được truyền cho các phương thức bằng cách tham chiếu. Bản sao của các đối tượng không bao giờ được tạo tự động. Nếu bạn truyền một đối tượng mèo vào một phương thức và thay đổi tuổi của nó, bạn sẽ thay đổi tuổi của nó. Nhưng các biến tham chiếu được sao chép khi gán giá trị và/hoặc gọi phương thức! Hãy lặp lại ở đây những gì chúng ta đã nói về việc truyền nguyên hàm: "Khi chúng ta gọi phương thức changeInt() và truyền intbiến x (=15) , thì phương thức này không nhận chính biến x mà là một bản sao của nó. Do đó, mọi thay đổi được thực hiện đối với bản sao không ảnh hưởng đến x gốc của chúng tôiCuối cùng, bạn vẫn sẽ tranh cãi nhiều lần về cách các đối số được truyền trong Java (ngay cả với những nhà phát triển có kinh nghiệm). Nhưng, bây giờ bạn biết chính xác làm thế nào nó hoạt động. Giữ nó lên! :) Để củng cố những gì bạn đã học, chúng tôi khuyên bạn nên xem một video bài học từ Khóa học Java của chúng tôi