有没有办法知道哪个子类正在调用超类?

时间:2019-02-14 15:43:40

标签: java class

这是我的一些代码。 Rabbit和Fox类都是超类的子类,它们各自都有一个getCounter()方法,该方法返回一个int值。我收到一条错误消息,说getCounter()不是有效的方法。我知道它在当前类中不存在,但是如果代码执行getCounter,将可以访问它。 (getCounter也是静态的。)

public static String setGender(Object obj){
    int specificCounter;
    Class s = obj.getClass();
    if(s == Fox.class|| s == Rabbit.class){
        specificCounter = s.getCounter(); 

4 个答案:

答案 0 :(得分:0)

在诸如Java之类的面向对象的编程语言中,通常使用polymorphism解决此类问题。

例如,您可以让基类声明一个抽象方法,并在每个子类中提供单独的实现。

我链接的Java教程包含有关如何执行此操作的示例。

答案 1 :(得分:0)

您可以使用instanceof进行类检查(if(obj instanceof Fox))。但是,如果您有许多不同的子类,则会导致很多其他情况。

但是重要的是您要使用meriton提到的多态性。从您的问题中,我推断出所提供的代码在Fox和Rabbit的超类中,我们假设它被称为Animal。现在,您不必接收对象,但可以接收动物。只要Animal类具有方法getCounter()(对于更具体的实现,子类甚至可以重写该方法),则现在可以调用obj.getCounter()

class Animal {
    public static String setGender(Animal obj){
        int specificCounter = obj.getCounter(); 
    }
}

答案 2 :(得分:0)

正如许多其他人指出的那样,这里似乎存在很多问题。

似乎没有足够的信息可以帮助任何人。相反,请尝试阅读Java的工作原理。

java类-https://docs.oracle.com/javase/tutorial/java/javaOO/index.html

java继承-https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

java Oracle Documentation&Tutorials-https://docs.oracle.com/javase/tutorial/java/index.html

答案 3 :(得分:0)

正如许多其他人所提到的那样,超类应该独立存在,并且完全不知道子类。有时您“有”做这样的奇怪事情,但是如果可能的话,应该避免这样做。在正常设计中,可以接受3种常见方法:

  1. 使“动物”成为一个接口,所有逻辑都将在 实现接口的类

  2. 声明动物抽象,并将setGender抽象化,填充 在子类中实现代码。

  3. 在这种情况下,最好的方法是:覆盖其中的“ setGender()”方法 您的子类,并对子类执行任何特定操作 调用super.setGender()(如果适用)之后在其中。

像这样:

public class Fox extends Animal {
  private String speciesGender;

  @Override
  public void setGender(String gender) {
    super.setGender(gender);

    //add specific stuff for fox
    if(gender.equals("F")) {
      speciesGender = "Vixen";
    } else {
      speciesGender = "Tod"
    }
  }
}

spceciesGender的吸气剂在Animal中可以是抽象的,也可以强制创建它。切片的方法很多...