Java中有没有一种方法可以根据对象的子类调用不同的子方法?

Java中有没有一种方法可以根据对象的子类调用不同的子方法?,java,overriding,Java,Overriding,在我的项目中,我有一个超类和两个子类。超类中有一个方法在每个子类中被不同地重写。 我想知道是否有可能在另一个类中引入一个方法,该方法将任一子类的对象作为参数,并根据对象所属的子类调用其中一个子类中重写的方法 公共类超类{ 公共int方法{返回0;} } 公共类子类1扩展了超类{ 公共int方法{return 1;} } 公共类子类2扩展了超类{ 公共int方法{return 2;} } 公共类调用类{ 公共静态调用超类参数{return parameter.method} 我想做一些像这样的事情

在我的项目中,我有一个超类和两个子类。超类中有一个方法在每个子类中被不同地重写。 我想知道是否有可能在另一个类中引入一个方法,该方法将任一子类的对象作为参数,并根据对象所属的子类调用其中一个子类中重写的方法

公共类超类{ 公共int方法{返回0;} } 公共类子类1扩展了超类{ 公共int方法{return 1;} } 公共类子类2扩展了超类{ 公共int方法{return 2;} } 公共类调用类{ 公共静态调用超类参数{return parameter.method} 我想做一些像这样的事情

Subclass1 subclassObject = new Subclass1;
System.out.println(CallingClass.dependantCall(subclassObject));
并获得输出

1

这就是多态性的目的!将超类定义为参数类型将允许您传入任何一个子类

例如,在另一个类中,您可以这样定义它:

// classes Dog and Cat extend Animal and override makeNoise()
class Owner{

  playWith(Animal a){
    a.makeNoise();
  }

}
现在,所有者可以接受Owner.makeNoisecat和Owner.makeNoisedog


更多阅读:

这就是多态性的目的!将超类定义为参数类型将允许您传入任何一个子类

例如,在另一个类中,您可以这样定义它:

// classes Dog and Cat extend Animal and override makeNoise()
class Owner{

  playWith(Animal a){
    a.makeNoise();
  }

}
现在,所有者可以接受Owner.makeNoisecat和Owner.makeNoisedog


更多阅读:

是的,这是完全可能的。下面是该方法的外观:

public <T extends Superclass> void foo(T subclassObject) {
...
} 

请注意,在上述方法中,您可以传递子类的对象,因为它们是协变数据类型。

是的,这是完全可能的。该方法如下所示:

public <T extends Superclass> void foo(T subclassObject) {
...
} 

请注意,在上面的方法中,您可以传递子类的对象,因为它们是协变数据类型。

这是Java在创建子类时默认的操作,因此无需做任何特殊的操作。每个对象在运行时都携带其类型信息,并且调用的方法始终是该对象最具体的方法。例如:

公共类实干家{ 公共无效剂量{ //身体存在 }; } 公共类实干家{ @凌驾 公共无效剂量{ //在这里画画 } } 公共类管理器扩展了Doer{ @凌驾 公共无效剂量{ //微观管理 } } //在代码的其他地方: 公共空间忙碌行为人{ 做某事; } 风格提示:如果可能的话,人们应该更喜欢使用接口而不是基类基类。只有当您希望在子类之间共享实现时,才应该使用这些基类。接口示例:

公共接口实践者{ 无效剂量; } 公共类JackOfAllTrades{ @凌驾 公共无效剂量{ //做任何必要的事 } } //客户端代码与上述代码完全相同: 公共空间忙碌行为人{ 做某事; } 注意,在Java中,一个类只能有一个基类,但可以实现多个接口

@重写注释并不是严格要求的,但它们可以帮助Java编译器为您发现一些错误,例如,如果您打印错了方法名

在您的示例中,它看起来像

公共类调用类{ 公共静态int-dependentialcallsuperclass参数{ 返回参数。方法; } } 子类1子类对象=新的子类1; System.out.printlnCallingClass.DependencCallSubassObject;
这是Java在创建子类时默认执行的操作,因此无需执行任何特殊操作。每个对象在运行时都携带其类型信息,并且调用的方法始终是该对象最具体的方法。示例:

公共类实干家{ 公共无效剂量{ //身体存在 }; } 公共类实干家{ @凌驾 公共无效剂量{ //在这里画画 } } 公共类管理器扩展了Doer{ @凌驾 公共无效剂量{ //微观管理 } } //在代码的其他地方: 公共空间忙碌行为人{ 做某事; } 风格提示:如果可能的话,人们应该更喜欢使用接口而不是基类基类。只有当您希望在子类之间共享实现时,才应该使用这些基类。接口示例:

公共接口实践者{ 无效剂量; } 公共类JackOfAllTrades{ @凌驾 公共无效剂量{ //做任何必要的事 } } //客户端代码与上述代码完全相同: 公共空间忙碌行为人{ 做某事; } 注意,在Java中,一个类只能有一个基类,但可以实现多个接口

@重写注释并不是严格要求的,但它们可以帮助Java编译器为您发现一些错误,例如,如果您打印错了方法名

在您的示例中,它看起来像

公共类调用类{ 公共静态int-dependentialcallsuperclass参数{ 返回参数。方法; } } 子类1子类对象=新的子类 1. System.out.printlnCallingClass.DependencCallSubassObject;
如果我得到你的问题,你可以只做一个抽象方法,不在不应该调用其方法的子类中用其重写方法编写代码。如果我得到你的问题,您可以只创建一个抽象方法,而不在不应调用其方法的子类中使用其重写方法编写代码。在Java编译过程中,类型参数会被删除,我们为所有可能的组合提供了一个基类。是否有理由在此处使用类型参数?调用的方法不依赖于类型参数。我看到的唯一用例是在该函数中使用其他泛型,所以您可能希望有显式类型来进一步传递。@PetrGladkikh您是对的。类型擦除将导致底部代码。只是想举例说明一下。类型参数在Java编译过程中会被删除,我们有一个用于所有可能组合的基类。是否有理由在此处使用类型参数?调用的方法不依赖于类型参数。我看到的唯一用例是在该函数中使用其他泛型,所以您可能希望有显式类型来进一步传递。@PetrGladkikh您是对的。类型擦除将导致底部代码。只是想说明一下。