我可以在Java中获取子类名

时间:2012-07-20 01:11:48

标签: java

Dog.java

public class Dog extends Animal {
.....

}

Animal.java

public class Animal {

   public static  String getName() {

       String callerClassName = ????; //How to get the class Dog, when I call from TestCase
       return "Animal";
   }
}

当我使用TestCase类到Dog.getName()时,当我使用Thread.currentThread()时如何获取className Dog而不是Animal.getStackTrace()[1] .getClassName()

public class TestCase {
   public static  String getName(){

      return Dog.getName();
   }
}

3 个答案:

答案 0 :(得分:3)

  

我可以在Java中获取子类名

不是你这样做的方式......

您的方法是静态的,不受继承的约束。在子类中定义的相同名称的静态方法可以隐藏超类方法,但它们不会覆盖它们。隐藏的静态方法总是可以通过它的完全限定名称来引用(即Animal.getName())。

当您调用Dog.getName()时,编译器只是为您解析Animal.getName()

另请参阅:SO: Inheritance in Static Methods


从不同的角度来看:

  

我可以在Java中获取子类名

假设您的方法已更改为非静态方法,请参阅Wyzard's response

答案 1 :(得分:2)

对于非静态方法,可以使用this.getClass()来获取调用它的对象的具体类,但这不适用于静态方法。当您调用这样的继承静态方法时,子类根本不涉及,所以我认为这些信息不可用。

但这可能是设计问题的一个标志。由于静态方法没有动态调度,要在getName()类上调用Dog,您必须在源代码中明确引用Dog。当你必须知道子类已经以便在其上调用方法时,有一个返回子类名称的方法没什么意义。

答案 2 :(得分:1)

不,除非您在getName课程中提供静态Dog方法,否则这是不可能的。即使你调用了Dog.getName(),也会调用Animal的静态方法,它毕竟是声明的,而不是Dog,因此调用者类 Animal而非Dog

如果你想解决这个问题,那取决于你想要达到的目标,你可以:

  1. getName课程中声明静态Dog方法。
  2. 使方法非静态并将整个问题放在继承中,其中方法将显示不同的行为。而不是隐藏,将继承继承。
  3. 你应该看看Overriding and Hiding Methods,这可能会有帮助。