Не уверен, если это называется «скрытие метода» или «переопределение метода», или нет, и хотел бы обратиться к некоторым хорошим статьям на эту тему. Особенно, является ли это хорошей практикой, когда и когда ее не использовать, и преимуществами / недостатками ее использования.
public class Animal {
/* constructor */
Animal () { }
/* instance method */
void add(Number n) {
System.out.println("An animal added a number!");
}
/* Main method */
public static void main(String[] args) {
Integer i = 2; // Integer i = new Integer(2);
Double d = 3.14; // Double d = new Double(3.14);
Animal mammal = new Animal();
Cat tom = new Cat();
Mouse jerry = new Mouse();
mammal.add(i); // produces "An animal added a number!"
mammal.add(d); // produces "An animal added a number!"
tom.add(i); // produces "Tom added an integer!"
tom.add(d); // produces "An animal added a number!"
jerry.add(i); // produces "An animal added a number!"
jerry.add(d); // produces "Jerry added a double!"
}
}
class Cat extends Animal {
/* constructor */
Cat () { }
/* instance method */
void add(Integer i) {
// param of type Integer extends Number
System.out.println("Tom added an integer!");
}
}
class Mouse extends Animal {
/* constructor */
Mouse () { }
/* instance method */
void add(Double d) {
// param of type Double extends Number
System.out.println("Jerry added a double!");
}
}
EDIT:
Благодаря @MByD выяснилось, что это называется «перегрузкой метода».
Новый вопрос, связанный с выше:
В классе Animal
я хочу создать метод, который принимает объект Number
и использует один из перегруженных методов add()
в подклассах Cat
и Mouse
. Есть ли лучший способ сделать это, чем показано ниже?
public class Animal {
...
void subtract(Number n) {
if (n instanceof Integer) this.add(-(Integer) n); // from the Cat class
else if (n instanceof Double) this.add(-(Double) n); // from the Mouse class
...
}
...
}
Да, я понимаю, что мог бы просто написать this.add(-n)
, но мне интересно, есть ли способ выбрать реализацию, зависящую от подкласса параметра. Поскольку параметр является абстрактным типом и не может быть создан, I должен передать подкласс в качестве аргумента.