调用子类的方法而不是本地方法

时间:2017-06-07 19:18:57

标签: java android

我有接下来的两个类(片段):

public class FAboutUs extends FDetails {

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        System.out.println("BUBUBU :: AboutUs - onCreate");
        View view = super.onCreateView(inflater, container, savedInstanceState);
        this.init(view, savedInstanceState);
        return view;
    }

    @Override
    protected void init(View view, @Nullable Bundle savedInstanceState) {
        System.out.println("BUBUBU :: AboutUs - init");
        //        super.init(view, savedInstanceState);
    }
}


public class FDetails extends FGlobalBase {

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        System.out.println("BUBUBU :: Details - onCreate");
        View view = inflater.inflate(R.layout.f_details, null);
        FDetails.this.init(view, savedInstanceState);
        return view;
    }


    @Override
    protected void init(View view, @Nullable Bundle savedInstanceState) {
        System.out.println("BUBUBU :: Details - init");
        super.init(view, savedInstanceState);

    }

}

我在日志中打印了这个:

BUBUBU :: AboutUs - onCreate
BUBUBU :: Details - onCreate
BUBUBU :: AboutUs - init
BUBUBU :: AboutUs - init

我实例化FAboutUs,它从onCreateView内的FAboutUs开始。 为什么FDetails调用init内的AboutUs方法而不是自己的方法?我是否遗漏了某种与protected方法有关的面向对象编程事件或者......发生了什么事情?!?!

修改 似乎FDetails.this.init(view, savedInstanceState);init而不是自己的FAboutUs方法调用init方法。为什么?!

1 个答案:

答案 0 :(得分:2)

请考虑以下代码:

FAboutUs aboutUs = new FAboutUs();
FDetails details = aboutUs;

aboutUs.init();
details.init();

最后两个调用调用相同的方法,即FAboutUs#init()方法。

这是因为来自init()的{​​{1}}中的FAboutUs方法被覆盖,并且两个引用引用的对象实际上都有FDetails类。就C ++而言,它将被称为虚拟。

当调用此类方法时,Java虚拟机会查找具有相同签名的最具体的方法(即,在最接近实际对象类的继承级别上定义的方法)。

只能覆盖非私有方法。

更多信息:https://docs.oracle.com/javase/tutorial/java/IandI/override.html