И снова наступаю на грабли, переходя от теории к практике.
Есть абстрактный класс Animal. У этого класса есть метод makeNoise(), который выводит на экран сообщение "Я животное!". Также есть классы Cat и Dog, которые унаследованы от супер-класса Animal. В каждом из них я переопределил метод makeNoise(). Теперь в зависимости от того, кошка была создана, или собака, метод выводит на экран "Мяу" или "Гав".
Но! Допустим, появилась необходимость у объекта типа Cat вызвать метод makeNoise(), но не свой метод, который выдаст нам "Мяу", а метод супер-класса, который скажет нам "Я животное". Как это реализовать? Мои попытки ниже, результата 0, вызывается переопределенный метод :(
public class Main {
public static void main(String[] args) {
/*Объекты типа animal*/
Animal cat = new Cat("Маруся");
Animal dog = new Dog("Шарик");
/*Объекты своих собственных типов*/
Cat cat2 = new Cat("Маруся 2");
Dog dog2 = new Dog("Шарик 2");
System.out.println("-------------------");
cat.makeNoise();
cat2.makeNoise();
}
}
public abstract class Animal {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
name = this.name;
return name;
}
public void makeNoise() {
System.out.println("Я животное!!11!!");
}
}
public class Cat extends Animal {
public Cat(String name) {
this.setName(name);
System.out.println("Новая кошка создана. Ее имя: " + getName());
}
@Override
public void makeNoise() {
System.out.println(getName() + " Сказала: " + "Мяу мяу");
}
}
public class Dog extends Animal {
public Dog(String name) {
this.setName(name);
System.out.println("Новая собака создана. Ее имя: " + getName());
}
@Override
public void makeNoise() {
System.out.println(getName() + " Сказала: " + "Гав гав");
}
}
P.S. Скажите, пожалуйста, присутствует ли в описанном мною примере полиморфизмом?
superможно использовать, только чтобы обратиться к своему классу-родителю, к чужому нельзя. Так что надо это в классе соответствующего животного писать. А "снаружи" можно вызвать только одну версию метода - самую последнюю в смысле переопределения, это называется виртуальные методы (см. c++). – Roman Aug 21 '16 at 08:00