|
Spec-Zone .ru
спецификации, руководства, описания, API
|
Объявление для метода или конструктора объявляет число и тип параметров за тот метод или конструктора. Например, следующее является методом, который вычисляет ежемесячные платежи за внутренний заем, основанный на количестве ссуды, процентной ставки, длины ссуды (число периодов), и будущее значение ссуды:
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;
}
У этого метода есть четыре параметра: количество ссуды, процентная ставка, будущее значение и число периодов. Первые три являются числами с плавающей точкой двойной точности, и четвертым является целое число. Параметры используются в теле метода, и во времени выполнения возьмет значения параметров, в которых передают.
Можно использовать любой тип данных для параметра метода или конструктора. Это включает примитивные типы данных, те, которые удваиваются, плавания, и целые числа, как Вы видели в computePayment метод, и типы справочных данных, такие как объекты и массивы.
Вот пример метода, который принимает массив как параметр. В этом примере метод создает новое Polygon возразите и инициализирует это от массива Point объекты (принимают это Point class, который представляет x, y координата):
public Polygon polygonFrom(Point[] corners) {
// method body goes here
}
Можно использовать конструкцию, названную 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);
или со все же различным числом параметров.
Когда Вы объявляете параметр к методу или конструктору, Вы обеспечиваете имя для того параметра. Это имя используется в пределах тела метода, чтобы обратиться к переданному - в параметре.
Имя параметра должно быть уникальным в его контексте. Это не может быть то же самое как имя другого параметра для того же самого метода или конструктора, и это не может быть имя локальной переменной в пределах метода или конструктора.
У параметра может быть то же самое имя как одно из полей class. Если это верно, параметр говорится тени поле. Поля затенения могут сделать Ваш код трудным читать и традиционно используются только в пределах конструкторов и методов, которые устанавливают определенное поле. Например, рассмотрите следующий Circle class и setOrigin метод:
public class Circle {
private int x, y, radius;
public void setOrigin(int x, int y) {
...
}
}
Circle У class есть три поля: x, y, и radius. setOrigin у метода есть два параметра, у каждого из которых есть то же самое имя как одно из полей. Каждые тени параметра метода поле, которое совместно использует его имя. Так используя простые имена x или y в пределах тела метода обращается к параметру, не к полю. Чтобы получить доступ к полю, следует использовать полностью определенное имя. Это будет обсуждено позже в этом уроке в разделе, названном "Используя this Ключевое слово."
Примитивные параметры, такой как int или a 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
Параметры типа справочных данных, такие как объекты, также передает в методы значение. Это означает, что, когда метод возвращается, переданный - в ссылке все еще ссылается на тот же самый объект как прежде. Однако, значения полей объекта могут быть изменены в методе, если у них есть надлежащий уровень доступа.
Например, рассмотрите метод в произвольном class, который перемещается 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. Метод изменяет x и y координаты объекта это circle ссылки (то есть, myCircle) 23 и 56, соответственно. Эти изменения сохранятся, когда метод возвратится. Затем circle присваивается ссылка на новое Circle объект с x = y = 0. У этого перевода по службе нет никакого постоянства, однако, потому что в ссылке передало значение и не может измениться. В пределах метода, объект, которым указывают circle изменился, но, когда метод возвращается, myCircle все еще ссылается на то же самое Circle возразите как, прежде, чем метод вызвали.