说有两个班级......
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"); }
}
在此示例中,NotAbstract1
和NotAbstract2
可以调用saySomething()
。我怎样才能在saySomething()
的{{1}}方法中识别出调用它的类? 不传入班级或标识符。
同样,简单的解决方案是将方法签名更改为AnAbstract
,但我想不这样做。我觉得可以用反射来完成,所以我将这个标签添加到问题中。
答案 0 :(得分:2)
您可以在this.getClass()
致电saySomething()
- 它会返回当前实例的类型 - notAbstract1
或notAbstract2
。
答案 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
NotAbstract2
或AnAbstract
的其他子类,但您将持有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()方法。