Java:调用未定义类型的方法

时间:2014-04-08 18:03:23

标签: java

我们来看看这段代码

MyClass object;
object=new MySubClass();

MySubClass扩展了MyClass。 在此之后,我想调用MySubClass的方法 object.myMethod();

我得到一个编译错误,但在运行时它应该工作。如果没有像这样的明确演员,我如何调用myMethod? ((MySubClass)对象).myMethod()

4 个答案:

答案 0 :(得分:2)

  

我如何调用myMethod?

您可以将对象声明为MySubClass的类型:

MySubClass object = new MySubClass();

为什么?因为你做的时候是对象:

MyClass object = new MySubClass();

对象的类型为MyClass,因此只能从MyClass调用方法。

请看这个示例:假设您有一个类Person和一个子类Employee,其中包含一个名为salary的额外字段(及其各自的getter / setter)。如果你声明了一个像这样的对象:

Person p1 = new Employee();

然后您不想调用其方法getSalary(),因为实际上p1的类型为Person。您不能在其上使用“特定”(在子类中声明)方法。

答案 1 :(得分:2)

如果方法是在子类中定义的,那么你需要一个instanceof子类 -

MyClass object; // <-- Make this MySubClass object; **OR**
object=new MySubClass();

// instanceof
if (object instanceof MySubClass) {
  MySubClass msc = (MySubClass) object;
  msc.doSomeMethod(); // <--
}

或者您可以在MyClass -

中使用abstract method
public abstract class MyClass {
  public abstract void doSomeMethod();
}

当然,MySubClass仍必须doSomeMethod()

public class MySubClass extends MyClass {
  public void doSomeMethod() {
    System.out.println("Hello");
  }
}

然后你可以使用

object.doSomeMethod();

答案 2 :(得分:1)

您可以将object声明为MySubClass类型。

MySubClass object = new MySubClass();

或者,您可以测试MyClass是否真的是MySubClass,然后转换为MySubClass,以便您可以调用该方法。

if (object instanceof MySubClass)
{
    MySubClass sub = (MySubClass) object;
    sub.myMethod();
}

或者,您可以在类myMethod中定义MyClass,以便任何MyClass实例都可以调用该方法。

答案 3 :(得分:0)

当您将object声明为类型MyClass时,您告诉编译器忘记object不是MyClass,可能没有任何其他不在MyClass上的方法等。您告诉编译器执行此操作。

您的选择是通过将object声明为类型MySubClass或者进行强制转换来告诉编译器一些不同的东西。还有其他选择。