在Java中,在静态方法中,确定调用静态方法的类的方法是什么?

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()也是同一个类上的静态方法.

Jon*_*eet 8

所以在Car的getCar()方法中,如何判断方法调用是否发送到法拉利类,而不是类,Car

你不能.(我以为javac 生成的用于呼叫相同的字节码-现在没有,但我不相信有什么办法来检测该呼叫在执行时是由,我也不会感到惊讶,如果它还是输了JIT期间的那些信息.)

如果您觉得要这样做,您应该更改设计 - 要么显着改变,要么只是将相关的类作为参数传递给方法.

可以为每个子类赋予一个具有相同签名的静态方法.这不会是最重要的,但它会起作用 - 你最终会调用正确的方法,然后可以做你想要的.但是如果你创建了一个新的子类并且忘了添加方法,它就会默默地调用超类...