将信息传递给方法或构造函数

方法或构造函数的声明声明该方法或构造函数的参数的数量和类型。例如,以下是一种基于房屋贷款额,利率,贷款期限(期数)和贷款终值来计算房屋贷款的每月还款额的方法:

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;
}
  1. 该方法有四个参数:贷款额,利率,终值和期数。前三个是双精度浮点数,第四个是整数。这些参数在方法主体中使用,并且在运行时将采用传入的参数的值。
  2. - 注意: 参数是指方法声明中的变量列表。参数是调用该方法时传递的实际值。调用方法时,使用的参数必须在类型和顺序上与声明的参数匹配。

参数类型

  1. 您可以将任何数据类型用作方法或构造函数的参数。如在computePayment方法中看到的那样,这包括原始数据类型(例如,双精度数,浮点数和整数),以及引用数据类型(例如,对象和数组)。
  2. 这是一个接受数组作为参数的方法的示例。在此示例中,该方法创建一个新Polygon对象,并从Point对象数组中对其进行初始化(假设这Point是一个表示x,y坐标的类):
public Polygon polygonFrom(Point[] corners) {
     //方法主体在此处
}
  1. 注意: 如果要将方法传递给方法,请使用 lambda表达式或 方法引用。

任意参数

  1. 您可以使用称为varargs的构造将任意数量的值传递给方法。当您不知道将向该方法传递多少特定类型的参数时,可以使用varargs。这是手动创建数组的快捷方式(以前的方法可能使用了varargs而不是数组)。
  2. 要使用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”,名称,idnum,地址);

或像这样

System.out.printf(“%s:%d,%s,%s,%s%n”,名称,idnum,地址,电话,电子邮件);

或使用其他数量的参数。

参数名称

  1. 在为方法或构造函数声明参数时,请为该参数提供名称。在方法主体中使用此名称来引用传入的参数。
  2. 参数名称在其范围内必须是唯一的。它不能与相同方法或构造函数的另一个参数的名称相同,也不能与方法或构造函数中的局部变量的名称相同。
  3. 参数可以与类的字段之一具有相同的名称。如果是这种情况,则称该参数遮蔽了该字段。阴影字段会使您的代码难以阅读,并且通常仅在设置特定字段的构造函数和方法中使用。例如,考虑以下Circle类及其setOrigin方法:
public class Circle {
    private int x, y, radius;
    public void setOrigin(int x, int y) {
        ...
    }
}
  1. 该Circle班有三个字段:x,y,和radius。该setOrigin方法有两个参数,每个参数与一个字段具有相同的名称。每个方法参数遮盖共享其名称的字段。因此,使用简单名称x或y在方法主体内使用的是参数,而不是字段。要访问该字段,必须使用限定名称。本课程稍后将在标题为“使用this关键字”的部分中对此进行讨论。

传递原始数据类型参数

原始参数(例如anint或a)通过valuedouble传递到方法中。这意味着对参数值的任何更改仅存在于方法范围内。方法返回时,参数消失,对它们的任何更改都将丢失。这是一个例子:

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;
    }
}

当您运行该程序时,输出为:

  • 调用passMethod后,x = 3

传递参考数据类型参数

引用数据类型参数(例如对象)也通过value传递到方法中。这意味着当方法返回时,传入的引用仍然引用与以前相同的对象。但是,如果对象的字段的值具有适当的访问级别,则可以在方法中更改它们。
例如,考虑移动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。但是,这种重新分配没有永久性,因为引用是按值传递的并且不能更改。在该方法内,by指向的对象circle已更改,但是当该方法返回时,myCircle仍引用与Circle调用该方法之前相同的对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值