Концепции OOPS Вызов функции родительского класса, а не дочернего
У меня есть родительский класс.
import java.util.HashMap;
import java.util.Map;
public class Parent {
Map<String,String> map = new HashMap<String, String>();
public void process(){
System.out.println("parent");
this.checkFunction();
}
protected void checkFunction(){
System.out.println("parentC");
System.out.println(map);
}
public void init(){
(map).put("parent","b");
}
}
Теперь, как и ожидалось, у меня есть детский класс.
import java.util.HashMap;
import java.util.Map;
public class Child extends Parent {
Map<String,String> map = new HashMap<String, String>();
public void checkFunction(){
System.out.println(map);
System.out.println("ChildC");
}
public void process(){
super.process();
System.out.println("Child");
}
public void init(){
super.init();
(map).put("child","b");
}
}
Чтобы проверить, что я хочу, у меня есть основной класс.
public class test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Child a = new Child();
a.init();
a.process();
Parent p = a;
p.checkFunction();
}
}
Когда я вызываю a.process (), я предполагаю, что он должен вызвать child.process (), который в свою очередь вызовет super.process (). Все идет нормально. В методе Parent () он должен вызывать checkFunction().
Теперь, насколько я понимаю, он должен вызвать checkFunction () класса Parent. Почему это вызывает Child's checkFunction()?
Мой вывод примерно такой
parent
{child=b}
ChildC
Child
{child=b}
ChildC
Я ожидаю, что это будет
parent
parentC
{parent=b}
Child
{child=b}
ChildC
1 ответ
Это потому, что вы переопределили checkFunction в дочернем классе. поэтому экземпляр child будет вызывать дочернюю функцию checkFunction, даже если вызов сделан из родительского класса.
Если вы хотите вызвать функцию проверки родителей из экземпляра дочернего объекта, вам нужно вызвать super.checkFunction() в дочернем классе. Ключевое слово super по сути "перемещает" цепочку наследования.
Подробное описание супер ключевого слова можно найти здесь