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
возразите как, прежде, чем метод вызвали.