我们来看看这段代码
MyClass object;
object=new MySubClass();
MySubClass扩展了MyClass。 在此之后,我想调用MySubClass的方法 object.myMethod();
我得到一个编译错误,但在运行时它应该工作。如果没有像这样的明确演员,我如何调用myMethod? ((MySubClass)对象).myMethod()
答案 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
-
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
或者进行强制转换来告诉编译器一些不同的东西。还有其他选择。