将信息传递给方法或构造函数
方法或构造函数的声明声明该方法或构造函数的参数的数量和类型。例如,以下是一种基于房屋贷款额,利率,贷款期限(期数)和贷款终值来计算房屋贷款的每月还款额的方法:
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;
}
该方法有四个参数:贷款额,利率,终值和期数。前三个是 Double 精度浮点数,第四个是整数。这些参数在方法主体中使用,并且在运行时将采用传入的参数的值。
Note:
参数是指方法声明中的变量列表。参数是调用该方法时传递的实际值。调用方法时,使用的参数必须在类型和 Sequences 上与声明的参数匹配。
Parameter Types
您可以将任何数据类型用作方法或构造函数的参数。这包括在computePayment
方法中看到的原始数据类型(例如,Double 精度,浮点型和整数),以及引用数据类型(例如,对象和数组)。
这是一个接受数组作为参数的方法的示例。在此示例中,该方法创建一个新的Polygon
对象,并从Point
对象的数组中对其进行初始化(假设Point
是表示 x,y 坐标的类):
public Polygon polygonFrom(Point[] corners) {
// method body goes here
}
Note:
如果要将方法传递给方法,请使用lambda expression或method reference。
任意参数
您可以使用称为* varargs *的构造将任意数量的值传递给方法。当您不知道将向该方法传递多少特定类型的参数时,可以使用 varargs。这是手动创建数组的快捷方式(以前的方法可能使用了 varargs 而不是数组)。
要使用 varargs,请在最后一个参数的类型后加上省略号(三个点,...),然后加上一个空格和参数名称。然后可以使用任意数量的该参数(包括无)调用该方法。
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
被视为数组。可以使用数组或参数序列调用该方法。在任何一种情况下,方法主体中的代码均会将参数视为数组。
您通常会在打印方法中看到 varargs。例如,此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);
或使用其他数量的参数。
Parameter Names
在为方法或构造函数声明参数时,请为该参数提供名称。在方法主体中使用此名称来引用传入的参数。
参数名称在其范围内必须是唯一的。它不能与相同方法或构造函数的另一个参数的名称相同,也不能与方法或构造函数中的局部变量的名称相同。
参数可以与类的字段之一具有相同的名称。如果是这种情况,则称该参数遮蔽了该字段。shade 字段会使您的代码难以阅读,并且通常仅在设置特定字段的构造函数和方法中使用。例如,考虑以下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
分配给具有x = y = 0
的新Circle
对象的引用。但是,这种重新分配没有永久性,因为引用是按值传递的并且不能更改。在该方法中,circle
指向的对象已更改,但是,当方法返回时,myCircle
仍引用与调用该方法之前相同的Circle
对象。