Spec-Zone .ru
спецификации, руководства, описания, API
След: Изучение Языка Java
Урок: Классы и Объекты
Раздел: Классы
Передача информации к Методу или Конструктору
Домашняя страница > Изучение Языка Java > Классы и Объекты

Передача информации к Методу или Конструктору

Объявление для метода или конструктора объявляет число и тип параметров за тот метод или конструктора. Например, следующее является методом, который вычисляет ежемесячные платежи за внутренний заем, основанный на количестве ссуды, процентной ставки, длины ссуды (число периодов), и будущее значение ссуды:

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
}

Отметьте: язык программирования Java не позволяет Вам передавать методы в методы. Но можно передать объект в метод и затем вызвать методы объекта.

Произвольное число Параметров

Можно использовать конструкцию, названную 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 возразите как, прежде, чем метод вызвали.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Обеспечение Конструкторов для Ваших Классов
Следующая страница: Объекты