本文是橙子出于兴趣爱好对Java官方教程的尝试翻译,几乎每日更新,感兴趣的朋友可以关注一下橙子;翻译过程中尽可能多的对一些关键词保留了英文原文,如果你想看最纯正的英文原版教材却又看不懂,可以试着来看一下橙子的翻译版啊,欢迎大家留言讨论,冲鸭!
更多相关文章点击阅读
Java官方教程目录2021最新版
在声明(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),包括基本数据类型和引用数据类型。下面示例中,方法接受数组作为参数(argument),方法创建一个新的Ploygon对象,并且从Point对象的数组对其进行实例化(假定Point是一个表示x,y坐标的类)。
public Polygon polygonFrom(Point[] corners) {
// method body goes here
}
注意:如果要将方法传递给方法,可以使用lambda表达式或方法引用。
可以使用一种称为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)的时候,要为参数提供名称。在方法体中,该名称被用来引用(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关键字章节讨论。
基本参数(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
引用数据类型(例如: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对象。
目录 1. C语言文件接口(库函数) 1.1 fopen 1.2 fclose 1.3 fread 1.4 fwrite 1.5...
本文实例为大家分享了vue实现按钮切换图片的具体代码,供大家参考,具体内容如下...
今天看到个不错的网页播放器,感觉不错,大家可以测试 我写的一个播放器网页: ...
首先到这里下载其源码。里面东西挺多的,我们基本上可以把它放到两个文件夹就是...
目录 读者基础 ?微服务架构梳理 https://www.coder4.com/homs_online/ ? ? 读者...
这5个PHP编程中的不良习惯,一定要改掉 PHP世界上最好的语言! 测试循环前数组是...
MFC项目在vs2017编译正常无报错,但是升级vs2019后一打开项目就报如下错误。 项...
本文实例为大家分享了javascript实现倒计时提示框的具体代码,供大家参考,具体...
由于固态驱动器(SSD)的速度比传统的硬盘驱动器(HDD)快得多,并且价格越来越便宜...
在大三的时候,一直就想搭建属于自己的一个博客,但由于各种原因,最终都不了了...