Khi một biến tham chiếu được truyền dưới dạng đối số cho một phương thức

Khai báo cho một phương thức hoặc hàm tạo khai báo số và loại đối số cho phương thức hoặc hàm tạo đó. Ví dụ: sau đây là phương pháp tính khoản thanh toán hàng tháng cho khoản vay mua nhà, dựa trên số tiền vay, lãi suất, thời hạn của khoản vay (số kỳ hạn) và giá trị tương lai của khoản vay

public double computePayment(
                  double loanAmt,
                  double rate,
                  double futureValue,
                  int numPeriods) {
    double interest = rate / 100.0;
    double partial1 = Math.pow((1 + interest), 
                    - numPeriods);
    double denominator = (1 - partial1) / interest;
    double answer = (-loanAmt / denominator)
                    - ((futureValue * partial1) / denominator);
    return answer;
}

Phương pháp này có bốn tham số. số tiền cho vay, lãi suất, giá trị tương lai và số kỳ hạn. Ba số đầu tiên là số dấu phẩy động có độ chính xác kép và số thứ tư là số nguyên. Các tham số được sử dụng trong thân phương thức và trong thời gian chạy sẽ nhận các giá trị của các đối số được truyền vào


Ghi chú. Tham số đề cập đến danh sách các biến trong khai báo phương thức. Đối số là các giá trị thực được truyền vào khi phương thức được gọi. Khi bạn gọi một phương thức, các đối số được sử dụng phải khớp với các tham số của khai báo về loại và thứ tự

Loại thông số

Bạn có thể sử dụng bất kỳ kiểu dữ liệu nào cho tham số của phương thức hoặc hàm tạo. Điều này bao gồm các kiểu dữ liệu nguyên thủy, chẳng hạn như double, float và số nguyên, như bạn đã thấy trong phương thức

public Polygon polygonFrom(Point[] corners) {
    // method body goes here
}
1 và các kiểu dữ liệu tham chiếu, chẳng hạn như đối tượng và mảng

Đây là một ví dụ về phương thức chấp nhận một mảng làm đối số. Trong ví dụ này, phương thức tạo một đối tượng

public Polygon polygonFrom(Point[] corners) {
    // method body goes here
}
2 mới và khởi tạo nó từ một mảng các đối tượng
public Polygon polygonFrom(Point[] corners) {
    // method body goes here
}
3 (giả sử rằng
public Polygon polygonFrom(Point[] corners) {
    // method body goes here
}
3 là một lớp đại diện cho tọa độ x, y)

public Polygon polygonFrom(Point[] corners) {
    // method body goes here
}

Bạn có thể sử dụng một cấu trúc gọi là varargs để chuyển một số lượng giá trị tùy ý cho một phương thức. Bạn sử dụng varargs khi bạn không biết có bao nhiêu loại đối số cụ thể sẽ được truyền cho phương thức. Đó là một lối tắt để tạo một mảng theo cách thủ công (phương pháp trước đó có thể đã sử dụng các biến thể thay vì một mảng)

Để sử dụng varargs, bạn theo dõi loại tham số cuối cùng bằng dấu chấm lửng (ba dấu chấm,. ), sau đó là khoảng trắng và tên tham số. Sau đó, phương thức có thể được gọi với bất kỳ số lượng nào của tham số đó, kể cả không

public Polygon polygonFrom(Point.. corners) {
    int numberOfSides = corners.length;
    double squareOfSide1, lengthOfSide1;
    squareOfSide1 = (corners[1].x - corners[0].x)
                     * (corners[1].x - corners[0].x) 
                     + (corners[1].y - corners[0].y)
                     * (corners[1].y - corners[0].y);
    lengthOfSide1 = Math.sqrt(squareOfSide1);

    // more method body code follows that creates and returns a 
    // polygon connecting the Points
}

Bạn có thể thấy rằng, bên trong phương thức,

public Polygon polygonFrom(Point[] corners) {
    // method body goes here
}
5 được coi như một mảng. Phương thức có thể được gọi bằng một mảng hoặc bằng một chuỗi các đối số. Mã trong nội dung phương thức sẽ coi tham số là một mảng trong cả hai trường hợp

Bạn sẽ thường thấy các varargs với các phương pháp in;

public PrintStream printf(String format, Object.. args)

cho phép bạn in một số lượng đối tượng tùy ý. Nó có thể được gọi như thế này

public Polygon polygonFrom(Point[] corners) {
    // method body goes here
}
0

hoặc như thế này

public Polygon polygonFrom(Point[] corners) {
    // method body goes here
}
1

hoặc với một số đối số khác nhau

Tên thông số

Khi bạn khai báo một tham số cho một phương thức hoặc một hàm tạo, bạn cung cấp tên cho tham số đó. Tên này được sử dụng trong nội dung phương thức để chỉ đối số được truyền vào

Tên của một tham số phải là duy nhất trong phạm vi của nó. Nó không thể giống với tên của một tham số khác cho cùng một phương thức hoặc hàm tạo và nó không thể là tên của một biến cục bộ trong phương thức hoặc hàm tạo

Một tham số có thể có cùng tên với một trong các trường của lớp. Nếu đây là trường hợp, tham số được cho là che khuất trường. Các trường tạo bóng có thể làm cho mã của bạn khó đọc và thường chỉ được sử dụng trong các hàm tạo và các phương thức đặt một trường cụ thể. Ví dụ, hãy xem xét lớp

public Polygon polygonFrom(Point[] corners) {
    // method body goes here
}
7 sau đây và phương thức
public Polygon polygonFrom(Point[] corners) {
    // method body goes here
}
8 của nó

public Polygon polygonFrom(Point[] corners) {
    // method body goes here
}
4

Lớp

public Polygon polygonFrom(Point[] corners) {
    // method body goes here
}
7 có ba trường.
public Polygon polygonFrom(Point.. corners) {
    int numberOfSides = corners.length;
    double squareOfSide1, lengthOfSide1;
    squareOfSide1 = (corners[1].x - corners[0].x)
                     * (corners[1].x - corners[0].x) 
                     + (corners[1].y - corners[0].y)
                     * (corners[1].y - corners[0].y);
    lengthOfSide1 = Math.sqrt(squareOfSide1);

    // more method body code follows that creates and returns a 
    // polygon connecting the Points
}
0,
public Polygon polygonFrom(Point.. corners) {
    int numberOfSides = corners.length;
    double squareOfSide1, lengthOfSide1;
    squareOfSide1 = (corners[1].x - corners[0].x)
                     * (corners[1].x - corners[0].x) 
                     + (corners[1].y - corners[0].y)
                     * (corners[1].y - corners[0].y);
    lengthOfSide1 = Math.sqrt(squareOfSide1);

    // more method body code follows that creates and returns a 
    // polygon connecting the Points
}
1 và
public Polygon polygonFrom(Point.. corners) {
    int numberOfSides = corners.length;
    double squareOfSide1, lengthOfSide1;
    squareOfSide1 = (corners[1].x - corners[0].x)
                     * (corners[1].x - corners[0].x) 
                     + (corners[1].y - corners[0].y)
                     * (corners[1].y - corners[0].y);
    lengthOfSide1 = Math.sqrt(squareOfSide1);

    // more method body code follows that creates and returns a 
    // polygon connecting the Points
}
2. Phương thức
public Polygon polygonFrom(Point[] corners) {
    // method body goes here
}
8 có hai tham số, mỗi tham số có cùng tên với một trong các trường. Mỗi tham số phương thức làm mờ trường chia sẻ tên của nó. Vì vậy, việc sử dụng các tên đơn giản
public Polygon polygonFrom(Point.. corners) {
    int numberOfSides = corners.length;
    double squareOfSide1, lengthOfSide1;
    squareOfSide1 = (corners[1].x - corners[0].x)
                     * (corners[1].x - corners[0].x) 
                     + (corners[1].y - corners[0].y)
                     * (corners[1].y - corners[0].y);
    lengthOfSide1 = Math.sqrt(squareOfSide1);

    // more method body code follows that creates and returns a 
    // polygon connecting the Points
}
0 hoặc
public Polygon polygonFrom(Point.. corners) {
    int numberOfSides = corners.length;
    double squareOfSide1, lengthOfSide1;
    squareOfSide1 = (corners[1].x - corners[0].x)
                     * (corners[1].x - corners[0].x) 
                     + (corners[1].y - corners[0].y)
                     * (corners[1].y - corners[0].y);
    lengthOfSide1 = Math.sqrt(squareOfSide1);

    // more method body code follows that creates and returns a 
    // polygon connecting the Points
}
1 trong phần thân của phương thức đề cập đến tham số, không phải trường. Để truy cập trường, bạn phải sử dụng tên đủ điều kiện. Điều này sẽ được thảo luận sau trong bài học này trong phần có tiêu đề "Sử dụng từ khóa
public Polygon polygonFrom(Point.. corners) {
    int numberOfSides = corners.length;
    double squareOfSide1, lengthOfSide1;
    squareOfSide1 = (corners[1].x - corners[0].x)
                     * (corners[1].x - corners[0].x) 
                     + (corners[1].y - corners[0].y)
                     * (corners[1].y - corners[0].y);
    lengthOfSide1 = Math.sqrt(squareOfSide1);

    // more method body code follows that creates and returns a 
    // polygon connecting the Points
}
6. "

Truyền các đối số kiểu dữ liệu nguyên thủy

Các đối số nguyên thủy, chẳng hạn như một

public Polygon polygonFrom(Point.. corners) {
    int numberOfSides = corners.length;
    double squareOfSide1, lengthOfSide1;
    squareOfSide1 = (corners[1].x - corners[0].x)
                     * (corners[1].x - corners[0].x) 
                     + (corners[1].y - corners[0].y)
                     * (corners[1].y - corners[0].y);
    lengthOfSide1 = Math.sqrt(squareOfSide1);

    // more method body code follows that creates and returns a 
    // polygon connecting the Points
}
7 hoặc một
public Polygon polygonFrom(Point.. corners) {
    int numberOfSides = corners.length;
    double squareOfSide1, lengthOfSide1;
    squareOfSide1 = (corners[1].x - corners[0].x)
                     * (corners[1].x - corners[0].x) 
                     + (corners[1].y - corners[0].y)
                     * (corners[1].y - corners[0].y);
    lengthOfSide1 = Math.sqrt(squareOfSide1);

    // more method body code follows that creates and returns a 
    // polygon connecting the Points
}
8, được truyền vào các phương thức theo giá trị. Điều này có nghĩa là mọi thay đổi đối với giá trị của các tham số chỉ tồn tại trong phạm vi của phương thức. Khi phương thức trả về, các tham số sẽ biến mất và mọi thay đổi đối với chúng sẽ bị mất. Đây là một ví dụ

public Polygon polygonFrom(Point[] corners) {
    // method body goes here
}
5

Khi bạn chạy chương trình này, đầu ra là

public Polygon polygonFrom(Point[] corners) {
    // method body goes here
}
6

Truyền đối số kiểu dữ liệu tham chiếu

Các tham số kiểu dữ liệu tham chiếu, chẳng hạn như các đối tượng, cũng được truyền vào các phương thức theo giá trị. Điều này có nghĩa là khi phương thức trả về, tham chiếu được truyền vào vẫn tham chiếu đến cùng một đối tượng như trước. Tuy nhiên, giá trị của các trường của đối tượng có thể được thay đổi trong phương thức, nếu chúng có cấp độ truy cập phù hợp

Ví dụ, hãy xem xét một phương thức trong một lớp tùy ý di chuyển các đối tượng

public Polygon polygonFrom(Point[] corners) {
    // method body goes here
}
7

public Polygon polygonFrom(Point[] corners) {
    // method body goes here
}
8

Hãy để phương thức được gọi với các đối số này

public Polygon polygonFrom(Point[] corners) {
    // method body goes here
}
0

Bên trong phương thức,

public PrintStream printf(String format, Object.. args)
0 ban đầu đề cập đến
public PrintStream printf(String format, Object.. args)
1. Phương thức thay đổi tọa độ x và y của đối tượng mà
public PrintStream printf(String format, Object.. args)
0 tham chiếu (nghĩa là
public PrintStream printf(String format, Object.. args)
1) lần lượt là 23 và 56. Những thay đổi này sẽ tồn tại khi phương thức trả về. Sau đó,
public PrintStream printf(String format, Object.. args)
0 được gán một tham chiếu đến một đối tượng
public Polygon polygonFrom(Point[] corners) {
    // method body goes here
}
7 mới với
public PrintStream printf(String format, Object.. args)
6. Tuy nhiên, việc gán lại này không có giá trị lâu dài vì tham chiếu được truyền vào theo giá trị và không thể thay đổi. Trong phương thức, đối tượng được trỏ bởi
public PrintStream printf(String format, Object.. args)
0 đã thay đổi, nhưng khi phương thức trả về,
public PrintStream printf(String format, Object.. args)
1 vẫn tham chiếu đến cùng một đối tượng
public Polygon polygonFrom(Point[] corners) {
    // method body goes here
}
7 như trước khi phương thức được gọi

Điều gì xảy ra khi một đối số được truyền theo tham chiếu?

Truyền theo tham chiếu có nghĩa là chuyển tham chiếu của một đối số trong hàm gọi đến tham số hình thức tương ứng của hàm được gọi. Hàm được gọi có thể sửa đổi giá trị của đối số bằng cách sử dụng tham chiếu của nó được truyền vào . Ví dụ sau đây cho thấy cách các đối số được truyền bằng tham chiếu.

Khi bạn chuyển một tham chiếu đối tượng làm đối số cho một cuộc gọi phương thức, điều gì được chuyển?

Truyền theo tham chiếu. Khi một phương thức được gọi, các đối số của phương thức sẽ tham chiếu cùng một biến trong bộ nhớ như người gọi . Pass-by-giá trị. Khi một phương thức được gọi, người gọi sẽ chuyển một bản sao của các biến đối số cho phương thức dẫn đến hai giá trị trong bộ nhớ.

Làm cách nào chúng ta có thể truyền đối số cho phương thức bằng cách tham chiếu?

Để truyền tham chiếu, chúng ta truyền đối tượng của lớp vào vị trí của tham số thực và tham số hình thức của a .

Khi một đối tượng được truyền dưới dạng đối số cho một phương thức?

Khi một đối tượng được truyền dưới dạng đối số cho một phương thức, đối tượng này thực sự được truyền . đây là tên của một biến tham chiếu luôn có sẵn cho một phương thức thể hiện và tham chiếu đến đối tượng đang gọi phương thức đó. Trường mảng này chứa số phần tử mà mảng có.