Com*_*ast 1 java class subclass
假设您在Java中有一个类和一个子类:
public abstract class Car {
public static Car getCar() {
Car car = makeCar();
return car;
}
private static Car makeCar() {
//bunch of code that makes the car
return car;
}
}
public class Ferrari extends Car {
private static makeCar() {
//bunch of code that makes a Ferrari! Yeah!
awesomeRide = new Car();
return awesomeRide;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在另一个课程中你打电话:
Ferrari.getCar();
Run Code Online (Sandbox Code Playgroud)
将调用法拉利的超类getCar()和 makeCar()方法.法拉利不能@Override getCar()因为在Java中,静态方法无法被覆盖.
所以在Car的getCar()方法中,如何判断方法调用是否发送到法拉利类,而不是类Car?既然这是一种静态方法,我if(this instanceOf Car)显然无法做到.
编辑:正确答案(下面)告诉我,由于有人调用Car.getCar()或Ferrari.getCar(),我确实无法从Car内部判断是否正在运行getCar().
但我不知道的是,根据Java的文档,虽然静态方法不能在Java中重写,但它可以被隐藏.
隐藏和重写之间的关键区别在于,隐藏时,静态方法会在同一个类上调用其他静态方法,而不是从它们路由到的子类.
这意味着,如果这些不是静态方法,那么只要调用者调用myFerrariInstance.getCar(),就会始终从Car的getCar()方法调用法拉利的makeCar().然而,随着隐藏,法拉利的makeCar()永远不会从Car的getCar()方法调用,因为makeCar()也是同一个类上的静态方法.
所以在Car的getCar()方法中,如何判断方法调用是否发送到法拉利类,而不是类,Car
你不能.(我以为javac 用生成的用于呼叫相同的字节码-现在没有,但我不相信有什么办法来检测该呼叫在执行时是由,我也不会感到惊讶,如果它还是输了JIT期间的那些信息.)
如果您觉得需要这样做,您应该更改设计 - 要么显着改变,要么只是将相关的类作为参数传递给方法.
您可以为每个子类赋予一个具有相同签名的静态方法.这不会是最重要的,但它会起作用 - 你最终会调用正确的方法,然后可以做你想要的.但是如果你创建了一个新的子类并且忘了添加方法,它就会默默地调用超类...
| 归档时间: |
|
| 查看次数: |
176 次 |
| 最近记录: |