我如何知道哪个类称为抽象方法?

时间:2015-06-24 15:25:08

标签: java reflection abstract-class abstract

说有两个班级......

public class NotAbstract1 extends AnAbstract {
  NotAbstract1() { super(); }
}

public class NotAbstract2 extends AnAbstract {
  NotAbstract2() { super(); }
}

public abstract class AnAbstract {
  AnAbstract() { //do something }
  abstract void saySomething() { System.out.println("Something"); }
}

在此示例中,NotAbstract1NotAbstract2可以调用saySomething()。我怎样才能在saySomething()的{​​{1}}方法中识别出调用它的类? 不传入班级或标识符

同样,简单的解决方案是将方法签名更改为AnAbstract,但我想这样做。我觉得可以用反射来完成,所以我将这个标签添加到问题中。

4 个答案:

答案 0 :(得分:2)

您可以在this.getClass()致电saySomething() - 它会返回当前实例的类型 - notAbstract1notAbstract2

答案 1 :(得分:1)

首先,这一行不会编译:

abstract void saySomething() { System.out.println("Something"); }

您不能同时使用abstract修饰符并提供方法体。

要打印来电者的课程,您可以写:

void saySomething() {
    System.out.println(this.getClass().toString());
}

答案 2 :(得分:1)

中的abstract关键字
abstract void saySomething();

是占位符。不能有与之关联的代码。它的作用是确保

public class NotAbstract1
public class NotAbstract2

都有像这样的实际实现

public class NotAbstract1 extends AnAbstract {
   void saySomething() {
     System.out.println("I'm NotAbstract1");
   }
}

public class NotAbstract2 extends AnAbstract {
   void saySomething() {
     System.out.println("I'm NotAbstract2");
   }
}

在编译saySomething()NotAbstract1时,编译器执行这些验证,即子类中存在NotAbstract2方法。

当你持有

AnAbstract object = .... get it from somewhere ...

您将持有NotAbstract1 NotAbstract2AnAbstract的其他子类,但您将持有AnAbstract类型。

致电时

AnAbstract object = .... get it from somewhere ...
object.saySomething();

如果对象最初构建为NotAbstract1,则运行

System.out.println("I'm NotAbstract1");

如果对象最初构建为NotAbstract2,则运行

System.out.println("I'm NotAbstract2");  

如果该对象是其他类型的AnAbstract,您将运行该子类对saySomething()的定义。

答案 3 :(得分:0)

虽然您可以在saySomething()中使用this.getClass()进行检查,但是如果您希望根据从哪个类调用此方法的不同行为,那么理想情况下应该覆盖这些类中的saySomething()方法。