Принципы OOPS Вызов функции родительского класса, а не дочернего - PullRequest
4 голосов
/ 14 мая 2011

У меня есть родительский класс.

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 Ответ

5 голосов
/ 14 мая 2011

Это потому, что вы переопределили функцию checkFunction в дочернем классе.поэтому экземпляр child будет вызывать дочернюю функцию checkFunction, даже если вызов поступил из родительского класса.

Если вы хотите вызвать функцию проверки родителей из экземпляра дочернего элемента, вам нужно вызвать super.checkFunction () вдетский класс.Ключевое слово super по сути «перемещает» цепочку наследования.

Подробное описание супер ключевого слова можно найти здесь

...