JavaRush /Blog Java /Random-VI /Phương thức, tham số, tương tác và nạp chồng của chúng

Phương thức, tham số, tương tác và nạp chồng của chúng

Xuất bản trong nhóm
Xin chào lần nữa! Trong bài giảng trước, chúng ta đã làm quen với các lớp và hàm tạo cũng như học cách tạo lớp của riêng mình. Các phương thức, tham số, tương tác và nạp chồng của chúng - 1Hôm nay chúng ta sẽ xem xét kỹ hơn về một phần không thể thiếu của các lớp như các phương thức. Phương thức là một tập hợp các lệnh cho phép bạn thực hiện một số thao tác trong chương trình. Nói cách khác, một phương thức là một hàm; điều gì đó mà lớp của bạn có thể làm. Trong các ngôn ngữ lập trình khác, các phương thức thường được gọi là “hàm”, nhưng trong Java từ “phương thức” đã trở nên phổ biến hơn :) Trong bài giảng trước, nếu bạn còn nhớ, chúng ta đã tạo ra các phương thức đơn giản cho lớp Cat để mèo của chúng ta có thể kêu meo meo và nhảy:
public class Cat {

    String name;
    int age;

    public void sayMeow() {
        System.out.println("Meow!");
    }

    public void jump() {
        System.out.println("Jumping gallop!");
    }

    public static void main(String[] args) {
        Cat barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";

        barsik.sayMeow();
        barsik.jump();
    }
}
sayMeow()jump()là các phương thức của lớp chúng tôi. Kết quả công việc của họ là đầu ra cho bảng điều khiển:
Мяу!
Прыг-скок!
Phương pháp của chúng tôi khá đơn giản: chúng chỉ in văn bản ra bảng điều khiển. Nhưng trong Java, các phương thức có nhiệm vụ chính - chúng phải thực hiện các hành động trên dữ liệu của một đối tượng . Thay đổi giá trị dữ liệu của một đối tượng, biến đổi nó, xuất nó ra bảng điều khiển hoặc làm điều gì đó khác với nó. Các phương thức hiện tại của chúng tôi không làm gì với dữ liệu của đối tượng Cat. Hãy xem một ví dụ rõ ràng hơn:
public class Truck {

    int length;
    int width;
    int height;
    int weight;

    public int getVolume() {
        int volume = length * width * height;
        return volume;
    }
}
Ví dụ: chúng ta có một lớp đại diện cho một chiếc xe tải - Truck. Xe moóc xe tải có chiều dài, chiều rộng, chiều cao và trọng lượng (điều này sẽ cần thiết sau). Trong phương thức này, getVolume()chúng tôi thực hiện các phép tính - chúng tôi chuyển đổi dữ liệu của đối tượng thành một số biểu thị âm lượng (chúng tôi nhân chiều dài, chiều rộng và chiều cao). Đây là con số sẽ là kết quả của phương pháp. Xin lưu ý - nó được viết trong phần mô tả phương pháp public int getVolume. Điều này có nghĩa là kết quả của phương pháp này phải là một số có dạng int. Chúng ta đã tính toán kết quả của phương thức và bây giờ chúng ta phải trả kết quả đó về chương trình được gọi là phương thức đó. Để trả về kết quả của một phương thức trong Java, từ khóa được sử dụng return.
return volume;

Tham số phương pháp

Các phương thức có thể chấp nhận các giá trị làm đầu vào, được gọi là "tham số phương thức". Phương thức hiện tại của chúng ta getVolume()trong lớp Truckkhông chấp nhận bất kỳ tham số nào, vì vậy hãy thử mở rộng ví dụ với xe tải. Hãy tạo một lớp mới - BridgeOfficer. Một sĩ quan cảnh sát đang làm nhiệm vụ trên cầu và kiểm tra tất cả các xe tải đi qua để đảm bảo tải trọng của chúng không vượt quá giới hạn trọng lượng cho phép.
public class BridgeOfficer {

    int maxWeight;

    public BridgeOfficer(int normalWeight) {
        this.maxWeight = normalWeight;
    }

    public boolean checkTruck(Truck truck) {
        if (truck.weight > maxWeight) {
            return false;
        } else {
            return true;
        }
    }
}
Phương thức này checkTrucklấy một tham số làm đầu vào - một đối tượng xe tải Truckvà xác định xem cảnh sát có cho phép xe tải lên cầu hay không. Logic bên trong phương thức khá đơn giản: nếu trọng lượng của xe vượt quá mức tối đa cho phép, phương thức sẽ trả về false. Bạn sẽ phải tìm con đường khác :( Nếu trọng số nhỏ hơn hoặc bằng giá trị lớn nhất thì bạn có thể vượt qua và phương thức trả về true. Nếu bạn vẫn chưa hiểu rõ cụm từ “return”, “phương thức trả về một giá trị” ” - hãy tạm dừng việc lập trình và xem xét điều này bằng một ví dụ đơn giản từ cuộc sống thực tế :) Giả sử bạn bị ốm và không làm việc trong vài ngày. Bạn đến phòng kế toán trong thời gian nghỉ ốm và bạn phải trả tiền. Nếu chúng ta so sánh các phương pháp, thì người kế toán có một phương pháp paySickLeave()(“trả lương nghỉ ốm”). Bạn chuyển giấy chứng nhận nghỉ ốm cho phương thức này dưới dạng tham số (không có nó, phương thức sẽ không hoạt động và bạn sẽ không được trả bất kỳ khoản nào!). Bên trong phương thức bảng tính, các phép tính cần thiết được thực hiện (kế toán sử dụng nó để tính số tiền công ty phải trả cho bạn) và kết quả công việc sẽ được trả lại cho bạn - một khoản tiền. Chương trình hoạt động theo cách tương tự. Nó gọi một phương thức, truyền dữ liệu đến đó và cuối cùng nhận được kết quả. Đây là phương pháp main()cho chương trình của chúng tôi BridgeOfficer:
public static void main(String[] args) {
    Truck first = new Truck();
    first.weight = 10000;
    Truck second = new Truck();
    second.weight = 20000;

    BridgeOfficer officer = new BridgeOfficer(15000);
    System.out.println("Truck number 1! May I pass, officer?");
    boolean canFirstTruckGo = officer.checkTruck(first);
    System.out.println(canFirstTruckGo);

    System.out.println();

    System.out.println("Truck number 2! May I?");
    boolean canSecondTruckGo = officer.checkTruck(second);
    System.out.println(canSecondTruckGo);
}
Chúng ta đang tạo ra 2 xe tải có tải trọng 10.000 và 20.000, đồng thời trọng lượng tối đa của cây cầu nơi sĩ quan trực ca là 15.000. Chương trình gọi phương thức officer.checkTruck(first), phương thức tính toán mọi thứ và trả về kết quả cho chương trình - true, và chương trình đã lưu nó vào biến boolean canFirstTruckGo. Bây giờ anh ấy có thể làm bất cứ điều gì anh ấy muốn với nó (giống như bạn với số tiền bạn nhận được từ kế toán). Cuối cùng mã
boolean canFirstTruckGo = officer.checkTruck(first);
đi xuống
boolean canFirstTruckGo = true;
Một điểm rất quan trọng: toán tử returnkhông chỉ trả về kết quả của phương thức mà còn chấm dứt công việc của nó ! Tất cả mã được viết sau khi trả về sẽ không được thực thi!
public boolean checkTruck(Truck truck) {

    if (truck.weight > maxWeight) {
        return false;
        System.out.println("Turn around, overweight!");
    } else {
        return true;
        System.out.println("Alright, move on!");
    }
}
Các cụm từ mà sĩ quan nói sẽ không được xuất ra bảng điều khiển, vì phương thức đã trả về kết quả và hoàn thành công việc của nó! Chương trình quay trở lại điểm mà phương thức được gọi. Bản thân bạn không phải lo lắng về điều này - trình biên dịch Java đủ thông minh để đưa ra lỗi nếu bạn cố viết mã sau return.

Avengers: Cuộc chiến lựa chọn

Có những tình huống khi chương trình của chúng tôi yêu cầu một số tùy chọn về cách hoạt động của một phương thức. Tại sao chúng ta không tạo ra trí tuệ nhân tạo của riêng mình? Amazon có Alexa, Yandex có Alice, vậy tại sao chúng ta lại tệ hơn? :) Trong bộ phim về Iron Man, Tony Stark đã tạo ra trí thông minh nhân tạo xuất sắc của riêng mình - JARVIS Hãy cùng vinh danh nhân vật tuyệt vời này và đặt tên AI của chúng ta để vinh danh anh ấy :) The điều đầu tiên chúng ta phải dạy Jarvis - chào người bước vào phòng (thật lạ nếu một trí tuệ tuyệt vời như vậy lại tỏ ra bất lịch sự).
public class Jarvis {

    public void sayHi(String name) {
        System.out.println("Good evening, " + name + ", How are you doing?");
    }

    public static void main(String[] args) {
        Jarvis jarvis = new Jarvis();
        jarvis.sayHi("Tony Stark");
    }
}
Đầu ra của bảng điều khiển:
Добрый вечер, Тони Старк, How ваши дела?
Tuyệt vời! Jarvis biết cách chào đón người bước vào. Tất nhiên, thông thường nhất sẽ là chủ nhân của anh ấy - Tony Stark. Nhưng anh ấy có thể không đến một mình! Và phương thức của chúng tôi sayHi()chỉ lấy một đối số làm đầu vào. Và theo đó, anh ta sẽ chỉ có thể chào một trong số những người đến và sẽ phớt lờ những người còn lại. Không lịch sự lắm, đồng ý không? :/ Trong trường hợp này, để giải quyết vấn đề, chúng ta chỉ cần viết 2 phương thức trong lớp có cùng tên nhưng có tham số khác nhau:
public class Jarvis {

    public void sayHi(String firstGuest) {
        System.out.println("Good evening, " + firstGuest + ", How are you doing?");
    }

    public void sayHi(String firstGuest, String secondGuest) {
        System.out.println("Good evening, " + firstGuest + ", " + secondGuest + ", How are you doing?");
    }
}
Điều này được gọi là nạp chồng phương thức . Quá tải cho phép chương trình của chúng tôi linh hoạt hơn và đáp ứng các tùy chọn công việc khác nhau. Hãy kiểm tra xem nó hoạt động như thế nào:
public class Jarvis {

    public void sayHi(String firstGuest) {
        System.out.println("Good evening, " + firstGuest + ", How are you doing?");
    }

    public void sayHi(String firstGuest, String secondGuest) {
        System.out.println("Good evening, " + firstGuest + ", " + secondGuest + ", How are you doing?");
    }

    public static void main(String[] args) {
        Jarvis jarvis = new Jarvis();
        jarvis.sayHi("Tony Stark");
        jarvis.sayHi("Tony Stark", "Captain America");
    }
}
Đầu ra của bảng điều khiển:
Добрый вечер, Тони Старк, How ваши дела?
Добрый вечер, Тони Старк, Капитан Америка, How ваши дела?
Tuyệt vời, cả hai lựa chọn đều hoạt động :) Tuy nhiên, 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 lại phương thức sayHi()để chấp nhận tên của ba khách. Nhưng có thể có 4 hoặc 5 người trong số họ, và cứ thế đến vô tận. Có cách nào khác để dạy Jarvis làm việc với bất kỳ số lượng tên nào mà không bị quá tải hàng triệu phương thức không sayHi()? :/ Tất nhiên là có! Nếu không thì liệu Java có phải là ngôn ngữ lập trình phổ biến nhất thế giới không? ;)
public void sayHi(String...names) {

    for (String name: names) {
        System.out.println("Good evening, " + name + ", How are you doing?");
    }
}
Bản ghi ( String...names) được truyền dưới dạng tham số cho phép chúng ta chỉ ra rằng một số chuỗi nhất định được truyền cho phương thức. Chúng tôi không chỉ định trước nên có bao nhiêu, vì vậy hoạt động của phương thức của chúng tôi giờ đây trở nên linh hoạt hơn nhiều:
public class Jarvis {

    public void sayHi(String...names) {
        for (String name: names) {
            System.out.println("Good evening, " + name + ", How are you doing?");
        }
    }

    public static void main(String[] args) {
        Jarvis jarvis = new Jarvis();
        jarvis.sayHi("Tony Stark", "Captain America", "Black Widow", "Hulk");
    }
}
Đầu ra của bảng điều khiển:
Добрый вечер, Тони Старк, How ваши дела?
Добрый вечер, Капитан Америка, How ваши дела?
Добрый вечер, Черная Вдова, How ваши дела?
Добрый вечер, Халк, How ваши дела?
Một số mã ở đây không quen thuộc với bạn, nhưng đừng bận tâm về điều đó. Bản chất của nó rất đơn giản - phương pháp lần lượt duyệt qua tất cả các tên và chào từng vị khách! Hơn nữa, nó sẽ hoạt động với bất kỳ số lượng dòng được chuyển nào! Hai, mười, thậm chí một nghìn - phương pháp này sẽ hoạt động đáng tin cậy với bất kỳ số lượng khách nào. Thuận tiện hơn nhiều so với việc thực hiện quá tải cho tất cả các tùy chọn có thể, bạn có đồng ý không? :) 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 lấy một chuỗi và một số làm đầu vào:
public class Man {

    public static void sayYourAge(String greeting, int age) {
        System.out.println(greeting + " " + age);
    }

    public static void main(String[] args) {
        sayYourAge("My age - ", 33);
        sayYourAge(33, "My age - "); //error!
    }
}
Nếu một phương thức sayYourAgelớp Manlấy một chuỗi và một số làm đầu vào thì đây là thứ tự chúng cần được truyền vào chương trình! 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ể biết được tuổi của mình. Nhân tiện, các hàm tạo mà chúng ta đề cập trong bài giảng trước cũng là các phương thức! Chúng cũng có thể bị quá tải (tạo một số hàm tạo với các bộ đối số khác nhau) và đối với chúng, thứ tự truyền đối số về cơ bản cũng rất quan trọng. Phương pháp thực sự! :)

Và một lần nữa về các thông số

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

    public void goToFuture(int currentYear) {
        currentYear = currentYear+10;
    }

    public void goToPast(int currentYear) {
        currentYear = currentYear-10;
    }

    public static void main(String[] args) {
        TimeMachine timeMachine = new TimeMachine();
        int currentYear = 2020;

        System.out.println("What is the year now?");
        System.out.println(currentYear);

        timeMachine.goToPast(currentYear);
        System.out.println("And now?");
        System.out.println(currentYear);
    }
}
Cỗ máy thời gian có hai phương pháp. Cả hai đều lấy đầu vào là một số đại diện cho năm hiện tại và tăng hoặc giảm giá trị (tùy thuộc vào việc chúng ta muốn quay ngược thời gian hay tới tương lai). Tuy nhiên, như có thể thấy từ đầu ra của bảng điều khiển, phương pháp này không hoạt động! Đầu ra của bảng điều khiển:
Какой сейчас год?
2020
А сейчас?
2020
Chúng ta đã truyền một biến currentYearcho phương thức goToPast()nhưng giá trị của nó không thay đổi. Như năm 2020, nó vẫn như vậy. Nhưng tại sao? :/ Bởi vì các giá trị nguyên thủy trong Java được truyền cho các phương thức theo giá trị. Nó có nghĩa là gì? Khi chúng ta gọi một phương thức goToPast()và truyền biến của mình vào đó int currentYear = 2020, không phải chính biến đó được đưa vào phương thức đó currentYearmà là một bản sao của nó . Tất nhiên, giá trị của bản sao này cũng bằng 2020, nhưng tất cả những thay đổi xảy ra với bản sao không ảnh hưởng đến biến ban đầu của chúng tôi theo bất kỳ cách nàocurrentYear ! Hãy làm cho mã của chúng ta dài dòng hơn và xem điều gì xảy ra với currentYear:
public class TimeMachine {

    public void goToFuture(int currentYear) {
        currentYear = currentYear+10;
    }

    public void goToPast(int currentYear) {
        System.out.println("The goToPast method has started!");
        System.out.println("The currentYear value inside the goToPast method (at the beginning) = " + currentYear);
        currentYear = currentYear-10;
        System.out.println("The currentYear value inside the goToPast method (at the end) = " + currentYear);
    }

    public static void main(String[] args) {
        TimeMachine timeMachine = new TimeMachine();
        int currentYear = 2020;

        System.out.println("What is the year at the very beginning of the program?");
        System.out.println(currentYear);

        timeMachine.goToPast(currentYear);
        System.out.println("What year is it now?");
        System.out.println(currentYear);
    }
}
Đầu ra của bảng điều khiển:
Какой год в самом начале работы программы?
2020
Метод goToPast начал работу!
Значение currentYear внутри метода goToPast (в начале) = 2020
Значение currentYear внутри метода goToPast (в конце) = 2010
А сейчас Howой год?
2020
Điều này cho thấy rõ rằng biến được truyền cho phương thức goToPast()chỉ là một bản sao currentYear. Và việc thay đổi bản sao cũng không ảnh hưởng gì đến ý nghĩa của “bản gốc”. " Truyền qua tham chiếu " hoàn toàn có ý nghĩa ngược lại. Hãy thực hành trên mèo! Ý tôi là, hãy xem việc truyền qua liên kết trông như thế nào khi sử dụng mèo làm ví dụ :)
public class Cat {

    int age;

    public Cat(int age) {
        this.age = age;
    }
}
Giờ đây, với sự trợ giúp của cỗ máy thời gian, chúng tôi sẽ đưa Barsik, chú mèo du hành thời gian đầu tiên trên thế giới, vào quá khứ và tương lai! Hãy thay đổi lớp TimeMachineđể máy có thể làm việc với các đối tượng Cat;
public class TimeMachine {

    public void goToFuture(Cat cat) {
        cat.age += 10;
    }

    public void goToPast(Cat cat) {
        cat.age -= 10;
    }
}
Các phương thức bây giờ không chỉ thay đổi số được truyền mà còn cả trường agecủa một đối tượng cụ thể Cat. Trong trường hợp nguyên thủy, như bạn nhớ, chúng tôi đã không thành công: số ban đầu không thay đổi. Hãy xem điều gì xảy ra ở đây!
public static void main(String[] args) {

    TimeMachine timeMachine = new TimeMachine();
    Cat barsik = new Cat(5);

    System.out.println("How old is Barsik at the very beginning of the program?");
    System.out.println(barsik.age);

    timeMachine.goToFuture(barsik);
    System.out.println("And now?");
    System.out.println(barsik.age);

    System.out.println("Firs-sticks! Barsik has aged 10 years! Drive back quickly!");
    timeMachine.goToPast(barsik);
    System.out.println("Did it work? Have we returned the cat to its original age?");
    System.out.println(barsik.age);
}
Đầu ra của bảng điều khiển:
Сколько лет Барсику в самом начале работы программы?
5
А теперь?
15
Елки-палки! Барсик постарел на 10 лет! Живо гони назад!
Получилось? Мы вернули коту его изначальный возраст?
5
Ồ! Bây giờ phương pháp này đã hoạt động khác: con mèo của chúng tôi đột nhiên già đi và sau đó trông trẻ lại! :) Hãy thử tìm hiểu lý do tại sao. Không giống như ví dụ với kiểu nguyên thủy, trong trường hợp đối tượng, một tham chiếu đến đối tượng được truyền cho phương thức. Một tham chiếu đến đối tượng ban đầu của chúng ta đã được chuyển goToFuture(barsik)tới các phương thức . Do đó, khi chúng ta thay đổi các phương thức bên trong , chúng ta truy cập vào chính vùng bộ nhớ nơi đối tượng của chúng ta được lưu trữ. Đây là liên kết đến cùng một Barsik mà chúng tôi đã tạo ngay từ đầu. Điều này được gọi là "chuyển qua tham chiếu"! Tuy nhiên, với những liên kết này, mọi thứ không đơn giản như vậy :) Hãy thử thay đổi ví dụ của chúng tôi: goToPast(barsik)barsikbarsik.age
public class TimeMachine {

    public void goToFuture(Cat cat) {
        cat = new Cat(cat.age);
        cat.age += 10;
    }

    public void goToPast(Cat cat) {
        cat = new Cat(cat.age);
        cat.age -= 10;
    }

    public static void main(String[] args) {
        TimeMachine timeMachine = new TimeMachine();
        Cat barsik = new Cat(5);

        System.out.println("How old is Barsik at the very beginning of the program?");
        System.out.println(barsik.age);

        timeMachine.goToFuture(barsik);
        System.out.println("Barsik went to the future! Has his age changed?");
        System.out.println(barsik.age);

        System.out.println("And if you try in the past?");
        timeMachine.goToPast(barsik);
        System.out.println(barsik.age);
    }
}
Đầu ra của bảng điều khiển:
Сколько лет Барсику в самом начале работы программы?
5
Барсик отправился в будущее! Его возраст изменился?
5
А если попробовать в прошлое?
5
Không hoạt động nữa! O_O Hãy cùng tìm hiểu xem điều gì đã xảy ra :) Tất cả đều là về các phương pháp goToPast/ goToFuturevà cơ chế hoạt động của các liên kết. Bây giờ hãy chú ý!Điểm này là quan trọng nhất để hiểu cách các liên kết và phương thức hoạt động. Trong thực tế, khi chúng ta gọi một phương thức, goToFuture(Cat cat)nó không phải là tham chiếu đối tượng được truyền cho nó catmà là một bản sao của tham chiếu này. Tức là khi chúng ta truyền một đối tượng cho một phương thức, sẽ có hai tham chiếu đến đối tượng này . Điều này rất quan trọng để hiểu những gì đang xảy ra. Suy cho cùng, đây là lý do tại sao ví dụ cuối cùng của chúng ta không làm thay đổi tuổi của con mèo. Trong ví dụ trước về việc thay đổi tuổi, chúng ta chỉ cần lấy tham chiếu được truyền vào bên trong phương thức goToFuture(), tìm đối tượng trong bộ nhớ bằng cách sử dụng nó và thay đổi tuổi của nó ( cat.age += 10). Bây giờ bên trong phương thức goToFuture()chúng ta tạo một đối tượng mới
(cat = new Cat(cat.age)),
và cùng một liên kết sao chép đã được truyền cho phương thức sẽ được gán đối tượng này. Kết quả là:
  • Liên kết đầu tiên ( Cat barsik = new Cat(5)) trỏ đến con mèo ban đầu (có 5 tuổi)
  • Sau khi chúng ta truyền biến catcho phương thức goToPast(Cat cat)và gán nó cho một đối tượng mới, tham chiếu sẽ được sao chép.
Sau đó, chúng ta có tình huống cuối cùng: hai liên kết 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 mà chúng tôi đã tạo bên trong phương thức.
cat.age += 10;
Và đương nhiên khi ta xuất nó main()ra console trong phương thức barsik.age, ta thấy tuổi của nó không hề thay đổi. Xét cho cùng barsik, đây là một biến tham chiếu vẫn trỏ đến đối tượng cũ, nguyên bản có 5 tuổi và không có gì xảy ra. Tất cả các thao tác của chúng tôi theo độ tuổi đều được thực hiện trên một đố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ó, nó sẽ thay đổi thành công. Nhưng giá trị của biến tham chiếu được sao chép khi gán và/hoặc gọi phương thức! Ở đây chúng ta hãy lặp lại đoạn về việc truyền các kiểu nguyên thủy: "Khi chúng ta gọi một phương thức changeInt()và truyền biến của mình vào đó int x = 15, không phải chính biến đó được đưa vào phương thức đó xmà là bản sao của nó . Rốt cuộc, tất cả những thay đổi xảy ra với bản sao không ảnh hưởng đến biến ban đầu của chúng tôi theo bất kỳ cách nào x”. Với việc sao chép liên kết, mọi thứ đều hoạt động giống hệt nhau! Bạn truyền đối tượng mèo vào phương thức. Nếu bạn làm điều gì đó với chính con mèo (nghĩa là với đối tượng trong bộ nhớ), tất cả các thay đổi sẽ diễn ra thành công - chúng ta chỉ có một đối tượng và vẫn có nó. Nhưng nếu bên trong một phương thức bạn tạo một đối tượng mới và lưu nó vào một biến tham chiếu, đó là một tham số của phương thức, thì từ bây giờ chúng ta có hai đối tượng và hai biến tham chiếu. Đó là tất cả! Điều đó không hề dễ dàng, thậm chí bạn có thể phải giảng bài nhiều lần. Nhưng điều quan trọng là bạn đã học được chủ đề siêu quan trọng này. Bạn sẽ thường xuyên gặp phải tranh chấp (ngay cả giữa các nhà phát triển có kinh nghiệm) về cách truyền đối số trong Java. Bây giờ bạn biết chính xác nó hoạt động như thế nào. Giữ nó lên! :)
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION