需要澄清静态/动态类型和Vtables

时间:2011-12-14 23:49:26

标签: java vtable

所以我的作业回来说我只有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 -

    • Derived.m(对象)
    • Base.m(类)

    我的印象是Base.m(String s)和Derived.m(String s)都是静态方法;因此他们不会被包括在vtable中。此外,我假设将使用Derived.m(Object)而不是Base.m(Object),因此不会包含在Derived的Vtable中。

1 个答案:

答案 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。

  • Derived.m(Object) 覆盖 Base.m(Object): Derived.m(Object) 是对的
  • Base.m(C类) 重载 Derived.m(对象): Base.m(C类) < / strong>是正确的

如果要考虑静态方法:

  • Derived.m(String s)将 shadow Base.m(String s)。当方法被遮蔽时,该方法完全取决于 静态类型 ;在这种情况下,静态类型是Base,因此将调用Base.m(String s);

以下是一个奇怪的例子:

Derived a = null;
a.m("World");

打印Derived.m(String),为什么?动态类型a为空,但Derived.m(String)仅关注导出的a的静态类型