Вызов метода внутри другого метода в том же классе
На странице 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();
}
}
Ответы
Ответ 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).