所以我的作业回来说我只有15/30分是正确的,但没有解释我错了哪些问题或错误原因。我有一个考试,我想在我必须考虑之前解决这个问题。因此,我希望有人可以帮助我理解我的正确/错误?为什么?
所以这是我的任务:
考虑以下Java程序:
public class Base {
public void m(Object o) { System.out.println("Base.m(Object)"); }
public static void m(String s) { System.out.println("Base.m(String)"); }
public void m(Class c) { System.out.println("Base.m(Class)"); }
}
public class Derived extends Base {
public void m(Object o) { System.out.println("Derived.m(Object)"); }
public static void m(String s) { System.out.println("Derived.m(String)"); }
public static void main(String[] args) {
Base b = new Derived();
b.m(new Object());
b.m(new Integer(5));
b.m("Hello");
b.m(b.getClass());
}
}
问题1(5分):Derived.main()中的静态类型是什么?
我的答案:基础
问题2(5分):Derived.main()中b的动态类型是什么?
我的答案:派生
问题3(20分):Derived的vtable中正确排序的条目是什么 翻译?请使用classname.methodname(typenames)“表示法。 另外,忽略第一个条目,即__isa。
我的答案:派生的vtable -
我的印象是Base.m(String s)和Derived.m(String s)都是静态方法;因此他们不会被包括在vtable中。此外,我假设将使用Derived.m(Object)而不是Base.m(Object),因此不会包含在Derived的Vtable中。
答案 0 :(得分:1)
问题1(5分):Derived.main()中的静态类型是什么?
正确:静态类型始终是声明的类型,在本例中为Base:Base b = new Derived();
问题2(5分):Derived.main()中的动态类型b是什么?
正确:动态类型是变量指向的类型,在本例中为Derived
问题3(20分):Derived vtable中我们翻译的正确排序条目是什么?请使用classname.methodname(typenames)“表示法。另外,忽略第一个条目,即__isa。
如果要考虑静态方法:
Base.m(String s)
; 以下是一个奇怪的例子:
Derived a = null;
a.m("World");
打印Derived.m(String)
,为什么?动态类型a
为空,但Derived.m(String)
仅关注导出的a
的静态类型