当前位置:主页 > 查看内容

Java官方教程(六-5)Passing Information to a Method or a Con

发布时间:2021-05-07 00:00| 位朋友查看

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

前言

本文是橙子出于兴趣爱好对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对象。

;原文链接:https://blog.csdn.net/weixin_42509923/article/details/115438123
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐