我有接下来的两个类(片段):
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
方法。为什么?!
答案 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