Подтвердить что ты не робот

Вызов метода внутри другого метода в том же классе

На странице 428 (глава о типе информации) его "Мышление на Java, 4-е изд." Брюс Эккель имеет следующий пример:

public class Staff extends ArrayList<Position> {
    public void add(String title, Person person) {
        add(new Position(title, person));
    }
/* rest of code snipped */

Может быть, я немного устал, но я не вижу, как работает вызов add() внутри метода add(). Я продолжаю думать, что он должен иметь ссылку или быть статическим методом (и я не могу найти статический add() в ArrayList или List). Что мне не хватает?

Я только что проверил для себя и обнаружил, что это работает:

// Test2.java
public class Test2 {
    public void testMethod() {
        testMethod2();
    }

    public void testMethod2() {
        System.out.println("Here");
    }

    public static void main(String[] args) {
        Test2 t = new Test2();
        t.testMethod();
    }
}
4b9b3361

Ответ 1

Java неявно принимает ссылку на текущий объект для методов, называемых так. Так

// Test2.java
public class Test2 {
    public void testMethod() {
        testMethod2();
    }

    // ...
}

Точно так же, как

// Test2.java
public class Test2 {
    public void testMethod() {
        this.testMethod2();
    }

    // ...
}

Я предпочитаю, чтобы вторая версия давала понять, что вы хотите сделать.

Ответ 2

Это не рекурсия, это перегрузка. Два метода add (один в вашем фрагменте и один, "предоставляемый" ArrayList, который вы расширяете) не являются одним и тем же методом, потому что они объявлены с разными параметрами.

Ответ 3

Метод add, который принимает String и a Person, вызывает другой метод add, который принимает Position. Тот, который принимает Position, наследуется от класса ArrayList.

Поскольку ваш класс Staff extends ArrayList<Position>, он автоматически имеет метод add(Position). Новый метод add(String, Person) - это тот, который был написан специально для класса Staff.

Ответ 4

Это просто перегрузка. Метод add относится к классу ArrayList. Посмотрите, что Staff наследует от него.

Ответ 5

Рекурсия - это метод, который вызывает себя. В этом случае это рекурсия. Однако это будет перегрузка, пока вы не установите ограничение внутри метода, чтобы остановить цикл (if-condition).