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

Java:调用未定义类型的方法,java,Java,让我们看看这个代码 MyClass object; object=new MySubClass(); 其中MySubClass扩展了MyClass。 在此之后,我想调用MySubClass的一个方法 object.myMethod() 我得到一个编译错误,但在运行时它应该可以工作。如果没有这样的显式强制转换,我如何调用myMethod? ((MySubClass)对象).myMethod() 如何调用myMethod 您可以将对象声明为MySubClass的类型: MySubClass obj

让我们看看这个代码

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

我得到一个编译错误,但在运行时它应该可以工作。如果没有这样的显式强制转换,我如何调用myMethod? ((MySubClass)对象).myMethod()

如何调用myMethod

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

MySubClass object = new MySubClass();
为什么?因为对象在执行以下操作时:

MyClass object = new MySubClass();
对象的类型为
MyClass
,因此只能从
MyClass
调用方法

看看这个例子:假设您有一个类
Person
和一个子类
Employee
,其中有一个名为
salary
的额外字段(及其相应的getter/setter)。如果声明的对象类似于:

Person p1 = new Employee();
然后您不想调用它的方法
getSalary()
,因为实际上,
p1
属于
Person
类型。不能对其使用“specific”(在子类中声明)方法

如何调用myMethod

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

MySubClass object = new MySubClass();
为什么?因为对象在执行以下操作时:

MyClass object = new MySubClass();
对象的类型为
MyClass
,因此只能从
MyClass
调用方法

看看这个例子:假设您有一个类
Person
和一个子类
Employee
,其中有一个名为
salary
的额外字段(及其相应的getter/setter)。如果声明的对象类似于:

Person p1 = new Employee();

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

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

MySubClass object = new MySubClass();
或者,您可以测试您的
MyClass
是否真的是
MySubClass
,然后强制转换到
MySubClass
,以便调用该方法

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

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

您可以将
object
声明为
MySubClass
类型

MySubClass object = new MySubClass();
或者,您可以测试您的
MyClass
是否真的是
MySubClass
,然后强制转换到
MySubClass
,以便调用该方法

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

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

当您将
object
声明为type
MyClass
时,您是在告诉编译器忘记
object
不是
MyClass
,在
MyClass
等上可能没有任何其他方法。您已经告诉编译器这样做


您的选项是通过将
对象
声明为具有类型
MySubClass
,或执行强制转换,来告诉编译器一些不同的内容。实际上没有其他选项。

当您将
对象
声明为具有类型
MyClass
时,您告诉编译器忘记
对象
不是
MyClass
,可能没有任何其他方法不在
MyClass
上,诸如此类。您已经告诉编译器这样做


您的选项是通过将
对象
声明为具有类型
MySubClass
,或执行强制转换,来告诉编译器一些不同的内容。实际上没有其他选项。

如果方法是在子类中定义的,那么您将需要子类的-

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

// instanceof
if (object instanceof MySubClass) {
  MySubClass msc = (MySubClass) object;
  msc.doSomeMethod(); // <--
}
当然,
MySubClass
必须仍然具有
doSomeMethod()

那你可以用

object.doSomeMethod();

如果该方法是在子类中定义的,那么您将需要子类的-

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

// instanceof
if (object instanceof MySubClass) {
  MySubClass msc = (MySubClass) object;
  msc.doSomeMethod(); // <--
}
当然,
MySubClass
必须仍然具有
doSomeMethod()

那你可以用

object.doSomeMethod();

为什么不将对象声明为MySubClass?我不能,我不知道具体的类型,我只知道它将是MyClass类型。我认为正确的答案是关于反射的问题,但无法获得要点是否可以将MyClass设置为抽象并将方法myMethod()添加到MyClass中作为抽象?不能,我正在使用标准类:为什么不将对象声明为MySubClass?我不能,我不知道具体的类型,我只知道它将是MyClass类型。我认为正确的答案是关于反射的问题,但无法获得要点。是否可以将MyClass设置为抽象类,并在MyClass中添加方法myMethod()作为抽象类?不能,我正在使用标准类:P