什么是Java的"自我"关键字

Ros*_*oss 9 php java oop

我正在尝试在Java中的抽象类中编写工厂方法(所以我希望它返回扩展类的新实例,而不是超类).

在PHP中,我使用self关键字执行此操作:

abstract class Superclass {
    public static function factory($arg) {
        return new self($arg);
    }

    private function __construct($arg) {}

    abstract public function doSomething() {}
}
Run Code Online (Sandbox Code Playgroud)

Java有关于self我可以使用的关键字吗?

Aas*_*set 8

没有; 在Java中,静态方法的继承方式与非静态方法的继承方式不同.子类将具有其超类的静态方法,但是当它们执行时,它们将在超类的上下文中执行 - 因此没有可以在静态方法中使用的关键字来找出调用该方法的类.

编辑:一个更精确的表述是静态方法根本不被继承; 但是,该语言允许我们Subclass.foo()用来调用静态方法Superclass.foo().

根据您似乎想要实现的内容,您可能希望实现抽象工厂模式.它大概是这样的:

public abstract class Superclass {}
public class SubclassA extends Superclass {}
public class SubclassB extends Superclass {}

public abstract class AbstractFactory {
    public abstract Superclass Create();
}

public class FactoryA extends AbstractFactory {
    public Superclass Create() {
        return new SubclassA();
    }
}

public class FactoryB extends AbstractFactory {
    public Superclass Create() {
        return new SubclassB();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以创建一个采用AbstractFactory(实际上将是a FactoryA或a FactoryB)的方法.调用Create()此对象将生成a SubclassA或a SubclassB.

编辑:修复了编译错误(忘了让工厂扩展AbstractFactory).