调用方法和构造函数

调用方法和构造函数

向方法或构造函数传递信息

方法或构造函数的声明声明了该方法或构造函数的参数数量和类型。例如,以下是一个根据贷款金额、利率、贷款期限(期限数量)和贷款未来价值计算房屋贷款月供的方法

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;

}

此方法有四个参数:贷款金额、利率、未来价值和期限数量。前三个是双精度浮点数,第四个是整数。参数在方法体中使用,并在运行时将采用传入参数的值。

注意:参数是指方法声明中变量的列表。参数是调用方法时传入的实际值。调用方法时,使用的参数必须在类型和顺序上与声明的参数匹配。

参数类型

您可以为方法或构造函数的参数使用任何数据类型。这包括基本数据类型,例如双精度数、浮点数和整数,如您在 computePayment() 方法中所见,以及引用数据类型,例如对象和数组。

以下是一个接受数组作为参数的方法示例。在此示例中,该方法创建一个新的 Polygon 对象,并使用 Point 对象数组对其进行初始化(假设 Point 是一个表示 x、y 坐标的类)

public Polygon polygonFrom(Point[] corners) {

// method body goes here

}

任意数量的参数

您可以使用称为可变参数的构造来向方法传递任意数量的值。当您不知道将传递给方法的特定类型参数的数量时,可以使用可变参数。它是手动创建数组的快捷方式(之前的方法可以使用可变参数而不是数组)。

要使用可变参数,您需要在最后一个参数的类型后面加上省略号(三个点,...),然后是一个空格,以及参数名称。然后,该方法可以使用任意数量的该参数进行调用,包括没有参数。

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

}

您可以看到,在方法内部,corners 被视为数组。该方法可以使用数组或一系列参数进行调用。方法体中的代码将在这两种情况下都将参数视为数组。

您最常在打印方法中看到可变参数;例如,此 printf() 方法

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

允许您打印任意数量的对象。它可以像这样调用

System.out.printf("%s: %d, %s%n", name, idnum, address);

或像这样

System.out.printf("%s: %d, %s, %s, %s%n", name, idnum, address, phone, email);

或使用其他数量的参数。

参数名称

声明方法或构造函数的参数时,您需要为该参数提供一个名称。此名称在方法体中用于引用传入的参数。

参数的名称在其作用域内必须是唯一的。它不能与同一方法或构造函数的另一个参数的名称相同,也不能是方法或构造函数内局部变量的名称。

参数可以与类的某个字段具有相同的名称。如果是这种情况,则该参数被认为是隐藏了该字段。隐藏字段会使您的代码难以阅读,并且通常仅在构造函数和设置特定字段的方法中使用。例如,考虑以下 Circle 类及其 setOrigin() 方法

public class Circle {

private int x, y, radius;

public void setOrigin(int x, int y) {

...

}

}

Circle 类有三个字段:x、y 和 radius。setOrigin() 方法有两个参数,每个参数的名称都与其中一个字段相同。每个方法参数都隐藏了与其名称相同的字段。因此,在方法体中使用简单的名称 x 或 y 指的是参数,而不是字段。要访问字段,您必须使用限定名称。这将在本课的“使用 this 关键字”部分中进行讨论。

传递基本数据类型参数

基本参数(例如 int 或 double)是按值传递给方法的。这意味着对参数值的任何更改仅存在于方法的作用域内。方法返回时,参数将消失,对它们的任何更改都会丢失。以下是一个示例

public class PassPrimitiveByValue {

public static void main(String[] args) {

int x = 3;

// invoke passMethod() with

// x as argument

passMethod(x);

// print x to see if its

// value has changed

System.out.println("After invoking passMethod, x = " + x);

}

// change parameter in passMethod()

public static void passMethod(int p) {

p = 10;

}

}

运行此程序时,输出为

After invoking passMethod, x = 3

传递引用数据类型参数

引用数据类型参数(例如对象)也是按值传递给方法的。这意味着当方法返回时,传入的引用仍然引用与之前相同的对象。但是,如果对象字段具有适当的访问级别,则可以在方法中更改对象字段的值。

例如,考虑任意类中移动 Circle 对象的方法

public void moveCircle(Circle circle, int deltaX, int deltaY) {

// code to move origin of circle to x+deltaX, y+deltaY

circle.setX(circle.getX() + deltaX);

circle.setY(circle.getY() + deltaY);

// code to assign a new reference to circle

circle = new Circle(0, 0);

}

让该方法使用以下参数调用

moveCircle(myCircle, 23, 56)

在方法内部,circle 最初引用 myCircle。该方法将 circle 引用的对象(即 myCircle)的 x 和 y 坐标分别更改为 23 和 56。这些更改将在方法返回时保留。然后,circle 被分配给一个新的 Circle 对象的引用,该对象的 x = y = 0。但是,此重新分配没有持久性,因为引用是按值传递的,并且不能更改。在方法内部,circle 指向的对象已更改,但是,当方法返回时,myCircle 仍然引用与调用方法之前相同的 Circle 对象。

相关推荐

JavaScript 参考
365打水账号怎么防止封号

JavaScript 参考

⌛ 08-26 👁️ 7031
向幻灯片添加边框
皇冠365bet体育投

向幻灯片添加边框

⌛ 07-22 👁️ 1064
DNF2025春节宠物装备属性一览
皇冠365bet体育投

DNF2025春节宠物装备属性一览

⌛ 10-04 👁️ 3138
DNF甜甜巧克力装扮外观一览 甜甜巧克力装扮礼盒怎么获得
京东金条借钱审批多久通过?详细流程与影响因素解析
365打水账号怎么防止封号

京东金条借钱审批多久通过?详细流程与影响因素解析

⌛ 10-17 👁️ 3196
空调遥控器被锁住的解锁技巧与注意事项总结
365打水账号怎么防止封号

空调遥控器被锁住的解锁技巧与注意事项总结

⌛ 09-17 👁️ 5233
创造世界杯历史!巴西连续17场世界杯小组赛不败
365打水账号怎么防止封号

创造世界杯历史!巴西连续17场世界杯小组赛不败

⌛ 07-09 👁️ 6891
世界杯和性|足球运动的性隐喻
皇冠365bet体育投

世界杯和性|足球运动的性隐喻

⌛ 08-25 👁️ 8759
四种实用的记忆方法:从数字定桩到记忆宫殿
365bet官方下载

四种实用的记忆方法:从数字定桩到记忆宫殿

⌛ 11-03 👁️ 9051