AP计算机科学:当成员函数可以运行时

时间:2016-04-04 22:30:21

标签: java

所以我给出了以下代码,我应该找到代码将编译的情况:

VariableType var = new ObjectType();
var.doStuff();

如果(选择所有适用的选项)保证编译此代码:

  • doStuff()是VariableType
  • 的成员函数
  • doStuff()是ObjectType
  • 的成员函数
  • doStuff()是VariableType的超类
  • 的成员函数
  • doStuff()是ObjectType的超类
  • 的成员函数

我标记的唯一一个是第二个,虽然我真的不确定其他情况是否也有效。这个问题也没有答案,我有点难过。因此,如果你们中的任何一个人能解释每个案例以及他们为什么工作或不工作,那将会有很大帮助。

2 个答案:

答案 0 :(得分:1)

当编译器看到方法调用时,它只关心调用该方法的变量或表达式的声明的类型。在这种情况下,变量为var,其声明的类型为VariableType。因此,只能调用在VariableType或其超类型中声明的方法。

注意,赋值VariableType var = new ObjectType();仅在ObjectTypeVariableType的子类时编译,所以我想我们应该假设情况就是这样。但这并没有改变答案 - ObjectType中声明的方法不是“VariableType”。即使在ObjectType的超类中声明了一个方法,也可能是该超类仍然是VariableType的子类 - 例如,如果你有class FooType extends VariableTypeclass ObjectType extends FooType

所有这一切的目的是确保编译的调用保证在运行时成功。如果我们允许var.methodThatOnlyExistsInObjectType()进行编译,那么如果var实际上没有引用ObjectType,它将在运行时失败。

答案 1 :(得分:1)

首先,有一些未说明的要求。要编译此语句:

VariableType var = new ObjectType();
  1. ObjectType必须是具有合适构造函数的非抽象类
  2. VariableType必须是类或接口,
  3. ObjectType必须是VariableType的直接或间接子类型。
  4. 如果不满足任何这些要求,则上述语句将无法编译。

    现在问你的问题。

      如果doStuff()是VariableType

    的成员函数,则

    [此代码保证编译]

    真。编译器检查该方法是否存在于VariableType提供的API中。它是。

      如果doStuff()是ObjectType

    的成员函数,则

    [此代码保证编译]

    假。如果在doStuff()中定义ObjectType但在VariableType中未定义,则调用将无法编译。

    虽然在此示例中该方法将在运行时出现,但编译器要求方法调用适用于可以分配给var的所有可能值。一些可能的值可能是VariableType本身的实例,或VariableType

    的其他子类
      如果doStuff()是VariableType超类的成员函数,则

    [此代码保证编译]

    真。在doStuff()的超类中定义VariableType时,它会由VariableType继承,并且是该类API的一部分。

      如果doStuff()是ObjectType的超类的成员函数,则

    [此代码保证编译]

    假。考虑ObjectType扩展AA扩展VariableTypeVariableType未定义doStuff方法的情况。

    在这种情况下,A使用doStuff()方法没有区别。该方法不会通过VariableType API公开,因此无法像这样调用。