Методы в Java

Метод — это именованный блок кода, который описывает поведение объекта или класса. С помощью методов мы говорим объекту «сделай что-то» или спрашиваем «какое у тебя сейчас значение?».

Сигнатура метода состоит из: модификаторов (public, private, static), типа возвращаемого значения, имени, списка параметров. Если метод ничего не возвращает, тип результата — void. Если возвращает значение — обязателен return.

Внутри метода доступно ключевое слово this — ссылка на текущий объект. Через него обращаются к полям, когда имена параметров совпадают с именами полей.

Синтаксис

модификаторы тип имяМетода(параметры) {
    // тело
    return значение; // если тип не void
}

Пример 1. Метод без параметров и без возврата

public class Led {
    int pin = 13;

    void on() {
        System.out.println("LED " + pin + " -> ON");
    }

    void off() {
        System.out.println("LED " + pin + " -> OFF");
    }

    public static void main(String[] args) {
        Led led = new Led();
        led.on();
        led.off();
    }
}

Output:

LED 13 -> ON
LED 13 -> OFF

Пример 2. Метод с параметрами

public class Motor {
    String name = "Левый";

    void setSpeed(int speed) {
        if (speed < 0) speed = 0;
        if (speed > 255) speed = 255;
        System.out.println(name + ": скорость = " + speed);
    }

    public static void main(String[] args) {
        Motor m = new Motor();
        m.setSpeed(100);
        m.setSpeed(300);
        m.setSpeed(-50);
    }
}

Output:

Левый: скорость = 100
Левый: скорость = 255
Левый: скорость = 0

Пример 3. Метод с возвращаемым значением

public class Sensor {
    int raw = 512;

    double toVoltage() {
        return raw * 5.0 / 1023.0;
    }

    public static void main(String[] args) {
        Sensor s = new Sensor();
        double v = s.toVoltage();
        System.out.println("Напряжение: " + v + " В");
    }
}

Output:

Напряжение: 2.5024437927663734 В

Пример 4. Использование this

public class Servo {
    int pin;
    int angle;

    void configure(int pin, int angle) {
        this.pin = pin;
        this.angle = angle;
    }

    void info() {
        System.out.println("Servo pin=" + this.pin + " angle=" + this.angle);
    }

    public static void main(String[] args) {
        Servo s = new Servo();
        s.configure(9, 90);
        s.info();
    }
}

Output:

Servo pin=9 angle=90

Пример 5. Метод вызывает другой метод

public class Robot {
    int speed;

    void forward(int s) {
        setSpeed(s);
        System.out.println("Едем вперёд");
    }

    void stop() {
        setSpeed(0);
        System.out.println("Стоп");
    }

    private void setSpeed(int s) {
        this.speed = s;
        System.out.println("speed=" + speed);
    }

    public static void main(String[] args) {
        Robot r = new Robot();
        r.forward(150);
        r.stop();
    }
}

Output:

speed=150
Едем вперёд
speed=0
Стоп

Пример 6. Статический метод

public class MathUtils {
    static int clamp(int value, int min, int max) {
        if (value < min) return min;
        if (value > max) return max;
        return value;
    }

    public static void main(String[] args) {
        System.out.println(clamp(300, 0, 255));
        System.out.println(clamp(-10, 0, 255));
        System.out.println(clamp(120, 0, 255));
    }
}

Output:

255
0
120

Подводные камни

  • Если объявить тип результата отличным от void, каждая ветка исполнения должна заканчиваться return.

  • Параметры в Java передаются по значению. Для объектов это значит, что копируется ссылка — поля исходного объекта изменить можно, но саму ссылку — нет.

  • Имя параметра, совпадающее с именем поля, скрывает поле — без this.поле вы будете писать в параметр, а не в поле.

  • Статический метод не имеет доступа к нестатическим полям и this.

  • Длинные методы трудно читать — разбивайте их на маленькие, как в примере 5.

См. также

Примечание

Лицензия и источники

Концепция описана на основе официального Java Tutorial от Oracle (https://docs.oracle.com/javase/tutorial/), Oracle Free Documentation License. Перевод, примеры и пояснения — © AlashEd Wiki.