• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

Java官方教程(六-5)Passing Information to a Method or a Constructor 传信息给方法(2021.4.6)

互联网 diligentman 2周前 (04-07) 6次浏览

前言

本文是橙子出于兴趣爱好对Java官方教程的尝试翻译,几乎每日更新,感兴趣的朋友可以关注一下橙子;翻译过程中尽可能多的对一些关键词保留了英文原文,如果你想看最纯正的英文原版教材却又看不懂,可以试着来看一下橙子的翻译版啊,欢迎大家留言讨论,冲鸭!
更多相关文章点击阅读
Java官方教程目录2021最新版

Passing Information to a Method or a Constructor

在声明(declare)方法或构造方法时,表明了其参数(argument)的数量和类型。例如,下面是一个方法,基于房屋贷款额,利率,贷款期限和贷款终值来计算每月还款额:

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

该方法有四个参数(parameter),the loan amount, the interest rate, the future value 和 the number of periods。前三个是double型,第四个是int型。这些参数(parameter)在方法体中使用,并且在运行时将采用传入的参数(argument)值。

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

Parameter Types

可以将任何数据类型用于方法或构造方法的参数(parameter),包括基本数据类型和引用数据类型。下面示例中,方法接受数组作为参数(argument),方法创建一个新的Ploygon对象,并且从Point对象的数组对其进行实例化(假定Point是一个表示x,y坐标的类)。
public Polygon polygonFrom(Point[] corners) {
    // method body goes here
}

注意:如果要将方法传递给方法,可以使用lambda表达式或方法引用。

Arbitrary Number of Arguments 可变参数

可以使用一种称为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,例如print方法中:

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

在方法或构造方法中声明参数(parameter)的时候,要为参数提供名称。在方法体中,该名称被用来引用(refer)传入的参数。

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

参数(parameter)可以和类的字段(field)具有相同的名称。这种情况称为参数遮蔽(shadow)了字段,会使代码的可读性降低,并且通常仅在构造方法或方法内设置特定字段的时候使用。例如下面Circle类及其setOrigin方法:

public class Circle {
    private int x, y, radius;
    public void setOrigin(int x, int y) {
        ...
    }
}

Circle类有三个字段:x,y和radius。setOrigin方法有两个参数(parameter),每个参数和一个字段有相同的名称,每个参数都遮蔽了和其具有相同名称的字段。因此,在方法主体中,使用x,y引用的是参数,而不是字段。如果要访问字段,必须使用特定名称,将在后面的this关键字章节讨论。

Passing Primitive Data Type Arguments

基本参数(primitive argument)(例如,int,double)按值传递给方法。这意味着任何对参数(parameter)值的修改,仅在方法的作用域内有效。当方法返回时,参数(parameter)消失,对它们的任何修改都将失效。如下所示:

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

Passing Reference Data Type Arguments

引用数据类型(例如:object)也是按值传递到方法中。这意味着,当方法返回时,传入的引用任然引用和之前相同的对象。但是,如果有是当的访问权限,可以在方法中修改对象字段的值。如下所示:

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分配(assign)了一个新的引用,指向x=y=0的新Circle对象。但是这种重新分配没用永久性,因为该引用是按值传递的,并且不能修改。在该方法内,circle指向(point)的对象已经更改,但是当方法返回时,myCircle任然引用方法被调用之前的Circle对象。


喜欢 (0)